在masm中输出循环
Output the loop in masm
我试图用 OutBin proc
在 loop l1
中简单地输出 CX
的值(二进制),但它只给我它的第一个值 (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
您的程序有 2 个过程 OutBin 和 NewLine。两者都缺少 ret
指令正上方的 endp
指令。
您的程序还缺少到 DOS 的下降退出。
看看 l1 循环结束后会发生什么。
loop l1
OutBin proc
代码在 OutBin 过程中错误地落空了。您必须将 return 的必要指令插入到 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”
我试图用 OutBin proc
在 loop l1
中简单地输出 CX
的值(二进制),但它只给我它的第一个值 (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
您的程序有 2 个过程 OutBin 和 NewLine。两者都缺少 ret
指令正上方的 endp
指令。
您的程序还缺少到 DOS 的下降退出。
看看 l1 循环结束后会发生什么。
loop l1
OutBin proc
代码在 OutBin 过程中错误地落空了。您必须将 return 的必要指令插入到 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”