问题描述
我有这段代码,我想问一下如何阅读它以了解程序到达第 24 行后 ax 中的值是多少 在循环内会发生什么时候 mov ax,[sp+4d] 它会改变 ax 的值吗?到 sp+4 我知道在程序结束时 ax 是 15 in hexa 只是想知道为什么? 非常感谢
解决方法
也许你的老师喜欢欺骗你?
mov ax,[sp + 4d]
和 mov [sp + 4d],ax
指令不可编码 (*)。它们的语法是错误的,因为 SP
寄存器不能用作寻址组件。所以如果你连程序都不会汇编,你怎么知道AX
寄存器的值?
也许老师希望你修正错误,然后报告AX
。
在 8086 代码中,您可以通过 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
寄存器可以用作寻址组件。