我对集会很新,我正试图从过去的考试中解决这个问题。如果这是基本的话,我需要帮助,道歉。
我有以下代码:
.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
包含计数的值。这个值是什么?
mov ax,Count
这与2相同吗?
答案 0 :(得分:4)
你太忙了。你的老师会详细解释。流行语是"段/偏移"和#34;在内存中组织.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相同。它最终相同:指令不同。