我对汇编相当陌生,我正在尝试从过去的考试中解决这个问题。我被困在需要帮助的地方,如果这是基本的,请道歉。
我有以下代码:
.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
中存储什么值?是伯爵的地址吗?如何找到此地址?在指令
mov ax,[bx]
之后,我相当确定ax
包含计数的值。这个值是多少?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 相同。最终是一样的:说明不同。