-1

我编写了一个 ASM 程序来尝试自学 ASM。它似乎在 emu8086 中不起作用,我完全不知道为什么。

org 100h    

mov dx, 05
cld
while:
   int 21h
   cmp dx, 1
   jz outt
   dec dx

   mov ah, 09h
   int 21h

   jmp while
outt:
   mov ah, 4ch
   mov al, 00
   int 21h

   ret
4

2 回答 2

3

Assembler 的荒凉世界不适合没有向导的外行冒险......

你的地图集是拉尔夫的巨著——最重要的是,第 21H 章

您要做的第一件事是设置DX为 5。为什么要这样做是未知的,因为您还没有评论您的操作。

然后你用 . 清除方向标志CLD。非常明智 - 确保字符串指令中寄存器的自动调整沿逻辑 UP 方向进行。

你的下一步行动令人费解。当您执行时,INT 21H您是在要求操作系统做某事。如果您参考您的图集,您会发现要执行的操作取决于AH. 目前,这可能是 0,因为您没有在程序中明确设置它。因此,如果您访问拉尔夫之书第 21H 章的第 00 节,您可能会发现为什么您的程序似乎在没有实际执行任何操作的情况下就终止了。

如果您确实像其他人建议的那样回避该特定指令,您会注意到您的下一步是

  • 比较DX1
  • 可能发现不相等,所以不要跳
  • 将 的值减DX1
  • 将 09 分配给AH

现在我们有了要求操作系统再次做某事的神奇咒语——但是什么?你的地图集还有吗?也许第 9 节可能会有所帮助。请注意,DX此处的值可能与此密切相关。

完成后,重复最后几个步骤直到DX=1,此时我们跳转到OUTT

我们再次加载AH可能是一个神奇的值 - 而且AL,也是。想要查看地图集以了解它应该做什么?

于 2013-05-18T14:31:04.663 回答
0

或尝试删除第一个 int 21h

如果这不起作用,请尝试将 44 放入 dx

于 2013-05-18T13:54:58.903 回答