我有一个家庭作业问题,要从用户处获取最多8个字符的新行字符串,并在反面上打印它
我编写了一个代码,该代码应该从字符串中提取所有内容,并将其放入堆栈中,然后再将其带回到字符串中,这样它将处于反转状态并将其打印在新行中。但是当我运行文件时,它只是停留在输入上,并没有让我做某事
我是组装的新手,我们使用tasm1〜1.4。
有我的代码:
handleMessage
答案 0 :(得分:2)
但是当我运行文件时,它只是停留在输入中...
这是因为使用DOS输入功能0Ah时,您需要事先告知DOS输入缓冲区的大小。使用ISTR DB 10 DUP(0)
之类的定义,您实际上根本没有请求任何缓冲区!
程序中的正确定义是
ISTR DB 9, 0, 9 DUP(0)
第一个字节指定输入缓冲区的大小。将其放在 DesiredNumberOfCharacters + 1 。
第二个字节指定缓冲区已包含的字符数。将其放在零。
您可以在我的How buffered input works的另一篇文章中找到有关此DOS功能的更多信息。
输入有效后,您需要在程序的 TOSTACK 部分修复一些问题:
LOOP
指令取决于整个CX
寄存器,但是您仅填充了CL
,它是CX
的低字节。只需添加mov ch, 0
。BX
而不是BL
来准备 FROMSTACK 部分。jcxz EXIT
就足够了。。
mov si, offset ISTR + 1
mov cl, [si] ; Characters read 0, 1, 2, ... 8
mov ch, 0
jcxz EXIT
mov bx, cx ; Save count
TOSTACK:
inc si
mov dl, [si] ; This is a byte
push dx ; Don't care about high byte in DH
loop TOSTACK
...
mov cx, bx ; Restore count ( is GT 0 )
FROMSTACK:
pop dx ; Still don't care about DH
mov ah, 02h
int 21h
loop FROMSTACK
EXIT:
mov ax, 4C00h
int 21h
摆脱慢LOOP
指令很容易:
mov si, offset ISTR + 1
mov cl, [si] ; Characters read 0, 1, 2, ... 8
mov ch, 0
jcxz EXIT
mov bx, cx ; Save count
TOSTACK:
inc si
mov dl, [si] ; This is a byte
push dx ; Don't care about high byte in DH
dec cx
jnz TOSTACK
...
FROMSTACK:
pop dx ; Still don't care about DH
mov ah, 02h
int 21h
dec bx
jnz FROMSTACK
EXIT:
mov ax, 4C00h
int 21h