assembly - 寄存器的十六进制值? x86

标签 assembly x86

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/

相关文章:

assembly - 为什么 x86 FP 像无符号整数一样比较 set CF,而不是使用有符号条件?

assembly - 如果 nasm 代码遇到 _start 结尾,是否会自动移动到下一个标签?

c - 移入 2 个 32 位寄存器

assembly - x86 处理器汇编语言 AND 和 OR 运算符优先级

assembly - 当变量超过 32 个时寄存器会发生什么情况?

c - gcc没有优化模算术?

assembly - ARM64 汇编 - 堆栈上的 execve 参数

java - 为 Android 应用程序编写汇编语言代码

c - x86 程序集中的结构分配

assembly - IEEE 754 有多少个整数