【问题标题】:Output the loop in masm在masm中输出循环
【发布时间】:2017-11-04 15:39:24
【问题描述】:

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

【问题讨论】:

  • 使用调试器单步执行代码以查看执行路径。 (提示,你忘了在函数结束时ret)。
  • @PeterCordes 非常感谢,缺少ret 真的是一个错误。但是,执行后,控制台冻结,不要求我按任何键返回编辑器或其他东西
  • 使用调试器查看您的代码是否到达退出系统调用。如果没有,它会卡在哪里。

标签: assembly x86 dos masm


【解决方案1】:

您的程序有 2 个程序 OutBinNewLine。两者都缺少位于 endp 指令上方的 ret 指令。

您的程序也错过了 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多