assembly - 汇编8086语言这段代码是什么意思?
问题描述
我有这段代码,我想问一下如何阅读它以了解在程序到达循环内的第 24 行后 ax 内的值是什么当 mov ax, [sp+4d] 发生时它会改变 ax 的值吗? 到 sp+4 我知道程序结束时 ax 是十六进制的 15 只是想知道为什么?非常感谢
解决方案
也许你的老师喜欢欺骗你?
和指令不可编码 (*) mov ax, [sp + 4d]
。mov [sp + 4d], ax
它们的语法是错误的,因为SP
寄存器不能用作寻址组件。那么如果你连程序都不能汇编,你怎么知道AX
寄存器的值呢?
也许老师希望您修复错误然后报告AX
。
在8086代码中,您可以通过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
寄存器可以用作寻址组件。
推荐阅读
- kendo-ui - Kendogrid Paging 不能使用可滚动:虚拟是真的
- excel - 使用 Excel 从目录中插入图像
- angular - 如何在更改时获取所选文件的完整路径
azure - Nuget 在使用 serviceBus 时将 Azure webjobs SDK 2.3 升级到 3.0
- angular - Angular 4 将页脚添加到 Mat 数据表
- html - Bootstrap:如何真正使图像在列中居中?
- javascript - 在 React 中更改父级状态时,我的子级值没有改变?
- tsql - TSQL 选择和加入问题
- android - React Native - android 应用程序在启动前崩溃
- python - 更改 holoviewplot (hv.BoxWhisker) 上的 x 或 y 轴