直接和间接寻址和OFFSET

时间:2018-05-10 11:59:39

标签: assembly masm x86-16 tasm

我对集会很新,我正试图从过去的考试中解决这个问题。如果这是基本的话,我需要帮助,道歉。

我有以下代码:

                 .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条指令。所以我的问题是:

  1. bx中存储了什么值?它是 Count 的地址吗?我如何找到这个地址?

  2. 在说明mov ax,[bx]后,我相当确定ax包含计数的值。这个值是什么?

  3. mov ax,Count这与2相同吗?

1 个答案:

答案 0 :(得分:4)

你太忙了。你的老师会详细解释。流行语是"段/偏移"和#34;在内存中组织.exe程序"。简言之:

  1. bx获得Count的偏移量。

    x86-16地址分为两部分:段和偏移量。我的Turbo调试器将Count设置为地址1603:0000。第一个(十六进制)数字表示段,第二个表示偏移量。该段将在加载程序时由操作系统计算,并且可以随每个程序运行而更改。 .STARTUP指令生成代码,将计算出的值分配给段寄存器DS(不要将它与通用寄存器DX混淆)。

    偏移量是距离该段地址起点的相对距离。由于Count位于.DATA段的开头,因此与段开头的相对距离为0000.因此,BX = 0000。

  2. Count的值由Count dw 1234,4321初始化。 Count 不是变量,而是标签。在此标签上,您可以找到两个单词:1234和4321. mov ax,[bx]将从地址DS:0000加载一个单词,这是Count的地址。

    您的假设是正确的,mov ax,[bx]包含Count = 1234的第一个值。该数字为十进制。

  3. 这是特定于汇编程序的。在MASM语法中它与2相同,在NASM语法中它与1相同。代码显然是MASM,因此它与2相同。它最终相同:指令不同。