首页 > 解决方案 > 直接和间接寻址和偏移

问题描述

我对组装相当陌生,我正在尝试从过去的考试中解决这个问题。我需要帮助,如果这是基本的,请道歉。

我有以下代码:

                 .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包含Count的值。这个值是多少?

  3. mov ax,Count这和2一样吗?

标签: assemblymasmx86-16tasm

解决方案


你太忙了。你的老师会详细解释。流行语是“段/偏移”和“内存中 .exe 程序的组织”。简要地:

  1. bx得到 的偏移量Count

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

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

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

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

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


推荐阅读