MOV DL,AL
“MOV DL”= B2
但是 AL 的十六进制字节值是多少?这些在哪里列出?
我刚刚意识到它必须是另一个操作码!任何人都可以指出我正确的方向吗?
最佳答案
来自 Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual ,表3-1。与 +rb、+rw 和 +rd 命名法相关的寄存器编码,第 3-3 页:
AL = 0 AX = 0 EAX = 0
CL = 1 CX = 1 ECX = 1
DL = 2 DX = 2 EDX = 2
BL = 3 BX = 3 EBX = 3
AH = 4 SP = 4 ESP = 4
CH = 5 BP = 5 EBP = 5
DH = 6 SI = 6 ESI = 6
BH = 7 DI = 7 EDI = 7
回答你的问题(“啊哈太棒了。我很难找到将寄存器移动到寄存器的指令列表。你能解释一下吗?”):
首先这里有一些鱼:(对于 8 位寄存器)
8a c0 mov al, al
8a c1 mov al, cl
8a c2 mov al, dl
8a c3 mov al, bl
8a c8 mov cl, al
8a c9 mov cl, cl
8a ca mov cl, dl
8a cb mov cl, bl
8a d0 mov dl, al
8a d1 mov dl, cl
8a d2 mov dl, dl
8a d3 mov dl, bl
8a d8 mov bl, al
8a d9 mov bl, cl
8a da mov bl, dl
8a db mov bl, bl
以下是开始钓鱼的方法:
在 intel 指令集手册中,查找 MOV 指令,第 3-402 页。您将找到一个列出各种 MOV 指令的表格,从以下开始:
88 /r MOV r/m8,r8 Move r8 to r/m8
89 /r MOV r/m16,r16 Move r16 to r/m16
89 /r MOV r/m32,r32 Move r32 to r/m32
8A /r MOV r8,r/m8 Move r/m8 to r8
8B /r MOV r16,r/m16 Move r/m16 to r16
8B /r MOV r32,r/m32 Move r/m32 to r32
注意我们上面的鱼是如何使用 8A 操作码的。您可能已经猜到了,r8 是一个 8 位寄存器,而 r/m8 可以是一个 8 位寄存器,也可以是内存中的一个字节。还要注意 16 位和 32 位寄存器和值(r16、r32)有哪些不同的 MOV 操作码可用。第 3-2 到 3-5 页解释了您可以在 MOV 指令上指定的各种类型的参数。
但是,您可能会说,这并没有告诉您如何在指令中构造以下字节。为此,请查看第 2.1 节 - 通用指令格式,从第 2-1 页开始。 x86 指令最多可以由 6 个字节序列组成:前缀、操作码、ModR/M、SIB、位移和立即数。我们的寄存器移动指令很简单,只包含一个操作码 (8A) 和一个 ModR/M 字节。
ModR/M 字节的分割记录在第 2.4 节以及第 2-5 到 2-6 页的全方位表格中。您会发现 ModR/M 字节可以对源寄存器和目标寄存器进行编码。例如,要从 AL 移动到 DL,您将使用 D0 ModR/M 值,给出 8A D0 指令。
关于assembly - 寄存器的十六进制值? x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829602/