汇编8086语言这段代码是什么意思?

问题描述

我有这段代码,我想问一下如何阅读它以了解程序到达第 24 行后 ax 中的值是多少 在循环内会发生什么时候 mov ax,[sp+4d] 它会改变 ax 的值吗?到 sp+4 我知道在程序结束时 ax 是 15 in hexa 只是想知道为什么? 非常感谢

解决方法

也许你的老师喜欢欺骗你?

mov ax,[sp + 4d]mov [sp + 4d],ax 指令不可编码 (*)。它们的语法是错误的,因为 SP 寄存器不能用作寻址组件。所以如果你连程序都不会汇编,你怎么知道AX寄存器的值?

也许老师希望你修正错误,然后报告AX

代码中,您可以通过 BP 寄存器寻址堆栈上的参数。接下来是重写 do_something 过程,这很好。我还保留了 BP 的值。

  AX     BP     RET    ARG            Stack ARG is the argument pushed at line 17
\----/ \----/ \----/ \----/                 RET is the return address
^      ^             ^
|      |             |
| SP   | BP          | BP+4
push bp
mov  bp,sp
push ax
mov  ax,[bp+4]
inc  ax
mov  [bp+4],ax
pop  ax
pop  bp
ret

程序到达第 24 行后 ax 中的值是多少

在第 23 行,AX 寄存器仍将保持为零,因为 do_something 过程保留了 AX 的值。
在第 24 行,AX 寄存器将变为 21,因为在修改后的程序中,call执行 do_something 过程 21 次将增加其堆栈参数 21 次,从 0 到 21。


(*) mov ax,[esp + 4]mov [esp + 4],ax 指令在代码中适用于 80386 等更高版本的 cpu,因为 ESP 寄存器可以用作寻址组件。