"MOV AX, [BX]" 实际上是做什么的?

What "MOV AX, [BX]" actually does?

我正在使用 x86 MASM32 汇编器。代码启动时,BX地址始终为078BH。造成这种情况的原因是什么?否则,就会出现“Write assembly code which generates 8B07H machine code”之类的问题。我猜想这个问题的解决方式是“MOV AX, [BX]”,但是 [BX] 是 078BH,而不是 8B07H。

你的问题比较混乱,所以我不确定我是否理解正确。

What MOV AX, [BX] actually does?

指令...

  • ...将BX寄存器的值加到DS寄存器
    指定的段的基地址上 这取决于 CPU 的操作模式(“实模式”或“保护模式”)如何从 DS 寄存器计算基地址。
  • ... 从该总和所表示的地址处的内存中读取一个字节
  • ... 将该字节写入 AX 的低字节(这意味着:AL
  • ...从内存中读取下一个字节
  • ... 将该字节写入 AX 的高字节(这意味着:AH

假设 BX 包含值 456h 并且 DS 指定的段具有基地址 23000h。那么地址就是23000h+456h = 23456h。假设地址 23456h 的内存包含值 0CDh,地址 23457h 的内存包含值 0ABh,那么 AX 将包含值 0ABCDh手术后。

When code started, address of BX always does 078BH. What is the reason of this situation?

我不知道 emu8086。

在真实的计算机上,寄存器的值取决于计算机的操作系统。在我的UbuntuLinux版本下,程序启动时BX的值为0。

Otherwise, There is a question like "Write assembly code which generates 8B07H machine code". I guess that this question solves like that MOV AX, [BX] but [BX] is 078BH, is not 8B07H.

8B07H是一个16位的数字,但是x86系统的内存是以字节(8位为单位)组织的。所以第一个问题是:在这种情况下 8B07H 是什么意思?

这可能意味着第一个字节应为08Bh,第二个字节应为07h

在这种情况下,指令 MOV [AX], BX 可以完成工作,而不是 MOV AX, [BX]:

这条指令或多或少与MOV AX, [BX]相反:它将数据写入内存。本次将寄存器BX中的数据写入到寄存器DSAX.

指定的内存中

因为在x86系统上,一些数据的低字节存储在第一个字节,高字节存储在第二个字节,所以值1234h将存储为两个字节:34h 在第一个字节中,12h 在第二个字节中。

78Bh也是如此:8Bh存放在第一个字节,07h存放在第二个字节

编辑

The question is "Write a assembly code which generates 8B07H value.".
...
I searched this question on The Internet and solving is MOV AX, [BX].

在 RAM 内存中,您只能存储数字。要存储字母“A”,存储数字 65(作为示例)。

汇编程序指令也存储为数字。

指令MOV AX, [BX]被存储为8Bh07h两个数字。然而,...

So, after assembly program executed, finally 8B07H value should be generated in a register(AX, BX etc.).

...这与程序在做什么无关:

指令存储为8Bh07h,就像Java程序中的单词main存储为字母main.

这意味着在程序启动之前,内存已经包含值8Bh07h

What is the reason of this situation?

每个新 CPU 类型的发明者都必须定义数字的含义。对于 ARM CPUs(这是新的 Apple PC 或 Raspberry Pi 使用的)在 16 位模式下,8Bh07h 表示 lsls r3, r1, #30 即与 mov ax, [bx].

完全不同的操作

您必须查看相应 CPU 的文档才能了解 8Bh07h 的确切含义。

在英特尔 8086 文档中,您会找到一个 table,其中包含以下行(第 4-31 页):

1st byte |2nd byte   |more bytes|meaning
---------+-----------+----------+---------------
   ...   |     ...   |   ...    |  ...
   8B    |mod reg r/m|  disp    | MOV reg16, r/m
   ...   |     ...   |   ...    |  ...

07h00 000 111(二进制)。这是第二个字节 (mod reg r/m),因此您可以查找其他一些 table(在 8086 文档中,这些 table 在第 4-20 页):

mod=00r/m=111的组合表示:r/m=[BX]
reg=000 表示:reg16 = AX

所以指令8Bh,07h就是MOV AX, [BX].