我试图在CX
中使用loop l1
简单地输出OutBin proc
的值(二进制),但它只给出了它的第一个值(10)
我想循环本身存在一些问题,在调用程序之前保存寄存器,但我不知道如何解决所有问题。
.model small
.stack 100h
.data
; X dw 10 DUP (1,2,3)
.code
.startup
mov cx, 10
l1:
mov ax, cx
push cx
call OutBin
pop cx
loop l1
OutBin proc
; AX to print
mov bx, ax
mov cx, 16
ob1:
shl bx,1
jc ob2
mov dl,'0'
jmp ob3
ob2:
mov dl, '1'
ob3:
mov ah,2
int 21h
loop ob1
;call NewLine
OutBin endp
NewLine proc
mov dx, 0Dh
mov ah,2
int 21h
mov dx, 0Ah
mov ah,2
int 21h
NewLine endp
.exit
end
答案 0 :(得分:2)
您的程序有2个程序 OutBin 和 NewLine 。两者都错过了ret
指令之上的endp
指令。
你的节目也错过了DOS的下降出口 看看 l1 循环结束后会发生什么。
loop l1
OutBin proc
代码错误地落入了 OutBin 程序。您必须插入必要的说明才能返回DOS:
loop l1
mov ax, 4C00h ;DOS.TerminateWithExitcode
int 21h
OutBin proc
X dw 10 DUP (1,2,3)
猜测你的最终目标是显示从数组 X 中取得的10个数字(mov cx, 10
),这个dw
指令实际上定义了30个数字。
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3
这可能不是你想要的。
请注意,一旦从数组 X 开始读取,您必须先设置段寄存器。使用.model small
时,他们不会自动指向您的.data
。如果您使用了.model tiny
,他们就会这样做。
shl bx,1 jc ob2 mov dl,'0' jmp ob3 ob2: mov dl, '1' ob3:
上面的代码可以简化得更好:
mov dl, '0'
shl bx, 1
adc dl, 0
如果没有转出任何一个进位,dl
注册将保留' 0'。
如果一个进位被移出,dl
寄存器将增加到' 1'