在masm中输出循环

Output the loop in masm

我试图用 OutBin procloop 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 个过程 OutBinNewLine。两者都缺少 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”