"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
中的数据写入到寄存器DS
和AX
.
指定的内存中
因为在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]
被存储为8Bh
和07h
两个数字。然而,...
So, after assembly program executed, finally 8B07H value should be generated in a register(AX, BX etc.).
...这与程序在做什么无关:
指令被存储为8Bh
和07h
,就像Java程序中的单词main
是存储为字母m
、a
、i
和n
.
这意味着在程序启动之前,内存已经包含值8Bh
和07h
。
What is the reason of this situation?
每个新 CPU 类型的发明者都必须定义数字的含义。对于 ARM CPUs(这是新的 Apple PC 或 Raspberry Pi 使用的)在 16 位模式下,8Bh
和 07h
表示 lsls r3, r1, #30
即与 mov ax, [bx]
.
完全不同的操作
您必须查看相应 CPU 的文档才能了解 8Bh
和 07h
的确切含义。
在英特尔 8086 文档中,您会找到一个 table,其中包含以下行(第 4-31 页):
1st byte |2nd byte |more bytes|meaning
---------+-----------+----------+---------------
... | ... | ... | ...
8B |mod reg r/m| disp | MOV reg16, r/m
... | ... | ... | ...
值 07h
是 00 000 111
(二进制)。这是第二个字节 (mod reg r/m
),因此您可以查找其他一些 table(在 8086 文档中,这些 table 在第 4-20 页):
mod=00
和r/m=111
的组合表示:r/m
=[BX]
reg=000
表示:reg16
= AX
所以指令8Bh
,07h
就是MOV AX, [BX]
.
我正在使用 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 thatMOV AX, [BX]
but[BX]
is078BH
, is not8B07H
.
8B07H
是一个16位的数字,但是x86系统的内存是以字节(8位为单位)组织的。所以第一个问题是:在这种情况下 8B07H
是什么意思?
这可能意味着第一个字节应为08Bh
,第二个字节应为07h
。
在这种情况下,指令 MOV [AX], BX
可以完成工作,而不是 MOV AX, [BX]
:
这条指令或多或少与MOV AX, [BX]
相反:它将数据写入内存。本次将寄存器BX
中的数据写入到寄存器DS
和AX
.
因为在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 isMOV AX, [BX]
.
在 RAM 内存中,您只能存储数字。要存储字母“A”,存储数字 65(作为示例)。
汇编程序指令也存储为数字。
指令MOV AX, [BX]
被存储为8Bh
和07h
两个数字。然而,...
So, after assembly program executed, finally 8B07H value should be generated in a register(AX, BX etc.).
...这与程序在做什么无关:
指令被存储为8Bh
和07h
,就像Java程序中的单词main
是存储为字母m
、a
、i
和n
.
这意味着在程序启动之前,内存已经包含值8Bh
和07h
。
What is the reason of this situation?
每个新 CPU 类型的发明者都必须定义数字的含义。对于 ARM CPUs(这是新的 Apple PC 或 Raspberry Pi 使用的)在 16 位模式下,8Bh
和 07h
表示 lsls r3, r1, #30
即与 mov ax, [bx]
.
您必须查看相应 CPU 的文档才能了解 8Bh
和 07h
的确切含义。
在英特尔 8086 文档中,您会找到一个 table,其中包含以下行(第 4-31 页):
1st byte |2nd byte |more bytes|meaning
---------+-----------+----------+---------------
... | ... | ... | ...
8B |mod reg r/m| disp | MOV reg16, r/m
... | ... | ... | ...
值 07h
是 00 000 111
(二进制)。这是第二个字节 (mod reg r/m
),因此您可以查找其他一些 table(在 8086 文档中,这些 table 在第 4-20 页):
mod=00
和r/m=111
的组合表示:r/m
=[BX]
reg=000
表示:reg16
= AX
所以指令8Bh
,07h
就是MOV AX, [BX]
.