【发布时间】:2018-12-20 17:30:30
【问题描述】:
我有一个作业问题要从用户那里得到最多 8 个字符的字符串中的一个新行并反向打印
我编写了一个代码,它应该从字符串中获取每一位并将其放入堆栈中,然后将其返回到字符串中,以便将其反转并在新行中打印。但是当我运行文件时,它只是停留在输入上并且没有让我做某事
我是组装新手,我们使用的是 tasm1~1.4。
这是我的代码:
STA SEGMENT STACK
DB 100H DUP (0)
STA ENDS
DATA SEGMENT
MSG1 DB 'ENTER STRING (Maximum is 8) : $'
MSG2 DB 'REVERS IS : $'
ISTR DB 10 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STA
MAIN:
MOV AX, DATA
MOV DS, AX
LEA DX, MSG1
MOV AH, 09H
INT 21H
MOV DX, 0
;INPUT
MOV DX, OFFSET ISTR
MOV AH, 0AH
INT 21H
MOV SI, DX
MOV CL, [SI+1]
ADD SI, 2
MOV DX, 0
MOV BL, CL
TOSTACK:
MOV DX, [SI]
PUSH DX
INC SI
LOOP TOSTACK
MOV DL, 10
MOV AH, 02H
INT 21H
LEA DX, MSG2
MOV AH, 09H
INT 21H
MOV DX, 0
MOV CL, BL
MOV SI, 2
FROMSTACK:
POP DX
MOV AH, 02H
INT 21H
INC SI
LOOP FROMSTACK
MOV AX, 4C00H
INT 21H
CODE ENDS
END MAIN
【问题讨论】:
-
评论您的代码,尤其是如果您希望其他人提供帮助。学习使用调试器(例如非常用户友好的 turbo 调试器)来单步执行您的代码,看看哪里出了问题。
-
慢速
loop指令使用 CX(在 16 位模式下),而不仅仅是 CL。您正在编写 CL,但我没有看到您将零扩展到 CX。不过,IDK 为什么在推送之前将其存储在[si+1]的内存中。如果您要手动存储,只需在读取输入时创建一个缓冲区和dec指向其中的指针,然后在写入时向前循环。 (或将整个缓冲区传递给写入字符串函数。)