在masm中输出循环

时间:2017-11-04 15:39:24

标签: assembly x86 dos masm

我试图在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

1 个答案:

答案 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'