【发布时间】:2013-02-13 15:20:20
【问题描述】:
我正在尝试跟踪我使用 turbo 汇编器搜索过的程序,但我储存了以下值:
cs:0006->8ED8 mov ds,ax
cs:0392->66B800060000 mov eax,00000600
cs:039A->66B900000000 mov ecx,00000000
有人可以帮我解释一下吗?尤其是cs部分显示的数字。
【问题讨论】:
我正在尝试跟踪我使用 turbo 汇编器搜索过的程序,但我储存了以下值:
cs:0006->8ED8 mov ds,ax
cs:0392->66B800060000 mov eax,00000600
cs:039A->66B900000000 mov ecx,00000000
有人可以帮我解释一下吗?尤其是cs部分显示的数字。
【问题讨论】:
“cs”指的是当前代码段,后面的数字指的是段内的偏移量。箭头后面的数字是指令的操作码。
cs:0006->8ED8 mov ds,ax
^ ^ ^
| | |
| | +-- Opcode of the "mov ds,ax" instruction
| |
| +-- Offset of the instruction within the code segment (6 bytes)
|
+-- Current code segment, see contents of your CS register
有关更多详细信息,另请参阅X86 Memory Segmentation。
有关 x86 操作码的列表,请参阅 http://ref.x86asm.net/
【讨论】:
opcode 是 CPU 指令的二进制表示。在上面的示例中,8E 是 MOV 指令,D8 编码操作数 (ds,ax)。
mov - 它使用不同的地址模式(立即数,而不是寄存器),它也是一个 32 位指令(使用扩展(32 位)AX 寄存器)。 66 是将操作数标记为 32 位的“操作数覆盖前缀”,B8 是将立即值移动到 (E)AX 寄存器的实际操作码