问题描述
我发现了一个类似的搜索,但对我来说不是很清楚。我试图在用汇编语言 8086 打印的每个字母中添加空格。 到目前为止,我所做的是将空格放入循环中,但它显示了不同的字符并打印了完全相同的字符,并为嵌套循环实现了另一个推送和弹出,但没有任何效果。
我想知道是不是我做错了什么,因为大部分数据都存储在 DL 寄存器中。
.stack
.code
start:
mov ah,6
mov bh,02h
mov cx,0
mov dx,184fh
int 10h
mov ah,2
mov bh,0
mov dh,11
mov dl,14
int 10h
mov cx,10
mov ah,2
mov dl,' '
push bx
mov ah,'J'
x: int 21h
dec dl
push cx
inc bx
pop cx
pop bx
loop x
pop cx
mov ah,4ch
int 21h
end start
解决方法
您似乎不明白 push
和 pop
有什么用。
push cx
inc bx
pop cx
仅当代码序列(您程序中的push cx
)以某种方式更改了保存/恢复的寄存器 pop cx
和如果您需要 inc bx
保持不变。
注意 cx
和 cx
之间循环中不平衡的 pop bx
。这会在每次迭代(10 次)时将堆栈指针增加 2,从而导致程序崩溃。
DOS 函数 Int 21/AH=02h 打印 x
中的字符,它会前进光标位置,因此不需要滚动窗口和设置光标位置的所有琐事。
此代码与 TASM 4.0 组装为 loop x
并与 TLINK 3.01 链接
因为 DL
给出了打印 tasm Connor.asm
的可执行文件 tlink /t Connor.obj
。
如果您打算在每个字母后面添加一个空格,只需在循环中插入另一个 Connor.com
调用(并且不要忘记在打印空格时保存/恢复 JIHJFEDCBA
)。
Int 21