assembly - 直接和间接寻址和偏移
问题描述
我对组装相当陌生,我正在尝试从过去的考试中解决这个问题。我需要帮助,如果这是基本的,请道歉。
我有以下代码:
.MODEL medium
.STACK
0000 .DATA
0000 04D2 10E1 Count dw 1234,4321
0000 .CODE
.STARTUP
0017 BB 0000 R mov bx, OFFSET Count
001A B8 000A mov ax,10
001D 8B C3 mov ax,bx
001F 8B 07 mov ax,[bx]
0021 A1 0000 R mov ax,Count
.EXIT
END
我被要求识别不同类型的寻址,我可以这样做,然后ax
在每条指令之后说明值。
特别是我不知道如何制定最后 3 条指令。所以我的问题是:
存储什么值
bx
?是Count的地址吗?我如何找到这个地址?在指令之后,
mov ax,[bx]
我相当确定ax
包含Count的值。这个值是多少?mov ax,Count
这和2一样吗?
解决方案
你太忙了。你的老师会详细解释。流行语是“段/偏移”和“内存中 .exe 程序的组织”。简要地:
bx
得到 的偏移量Count
。x86-16 地址分为两部分:段和偏移。我的 Turbo 调试器设置
Count
为地址 1603:0000。第一个(十六进制)数字表示段,第二个表示偏移量。该段将由操作系统在加载程序时计算,并且可以随着每个程序运行而改变。该.STARTUP
指令生成将计算值分配给段寄存器的代码DS
(不要将其与通用寄存器混淆DX
)。偏移量是距该段地址开头的相对距离。由于
Count
在段的开头,它与.DATA
段开头的相对距离为 0000。因此,BX=0000。的值由
Count
初始化Count dw 1234,4321
。Count
不是变量,而是标签。在这个标签上,您可以找到两个字:1234 和 4321。mov ax,[bx]
将从地址 DS:0000 加载一个字,这是 的地址Count
。您的假设是正确的,
mov ax,[bx]
包含Count
= 1234 的第一个值。该数字是十进制的。这是特定于汇编程序的。在 MASM 语法中它与 2 相同,在 NASM 语法中它与 1 相同。代码显然是 MASM,因此与 2 相同。最终相同:指令不同。
推荐阅读
- parallel-processing - 关于 OpenMP 部分和关键部分的问题
- python - 如何将图像转换为csv并保存在python中
- css - 与传统 div 相比,使用 html5 语义标签有什么缺点吗?
- javascript - 如何正确获取 textarea 内容?
- google-cloud-platform - 如何从 GCP 虚拟机获取文件?
- excel - 使用 VBA 将所选列复制并粘贴到 Excel 中的表末尾
- c - 全局定义和全局变量声明的区别
- php - 条纹:parameter_invalid_integer,PHP 新手
- elixir - Phoenix Elixir Post JSON 与关联
- function - Powershell函数-参数在一种情况下必须是强制性的,在另一种情况下是可选的