首页 > 解决方案 > 汇编8086语言这段代码是什么意思?

问题描述

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

标签: assemblyx86-16

解决方案


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

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

也许老师希望您修复错误然后报告AX

代码中,您可以通过BP寄存器寻址堆栈上的参数。接下来是对do_something proc 的重写,这很好。我还保留了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执行21 次do_something proc 会将其堆叠参数增加 21 次,从 0 变为 21。


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


推荐阅读