我开始使用Intel参考页面来查找和学习op代码(而不是询问所有关于op代码的内容)。我想确保我的理解是好的,并问几个问题之间的输出之间的基本asm程序和英特尔指令代码。
下面是我必须将各种mov指令与rax-ish寄存器进行比较的程序(是否有更好的方法来表示"rax“及其32- 16位和8位组件):
.globl _start
_start:
movq $1, %rax # move immediate into 8-byte rax (rax)
movl $1, %eax # move immediate into 4-byte rax (eax)
movw $1, %ax # move immediate into 2-byte rax (ax)
movb $1, %al # move immediate into 1-byte rax (al)
mov $60, %eax
syscall它分解如下:
$ objdump -D file
file: file format elf64-x86-64
Disassembly of section .text:
0000000000400078 <_start>:
400078: 48 c7 c0 01 00 00 00 mov $0x1,%rax
40007f: b8 01 00 00 00 mov $0x1,%eax
400084: 66 b8 01 00 mov $0x1,%ax
400088: b0 01 mov $0x1,%al
40008a: b8 3c 00 00 00 mov $0x3c,%eax
40008f: 0f 05 syscall现在,匹配来自MOV的英特尔代码,在这里复制:

我能够协调以下四项指示中的一项:
mov $0x1,%al -> b0 01
是,英特尔的状态代码是b0 +1字节作为1字节的值立即移动.mov $0x1,%eax -> b8 01 00 00 00
是,英特尔的状态代码是b8 +4字节,值为1字节立即移动.mov $0x1,%ax -> 66 b8 01 00
不,英特尔状态代码是b8而不是66 b8。mov $0x1,%rax48 -> c7 c0 01 00 00 00
N/A,只有32位指令。没有被列出来。因此,我的问题是:
mov $0x1,%ax不匹配?64-bit代码,或者建议如何查找?%ebx或%r11中。如何计算“代码调整”,就像它在这个查找表中所显示的那样(我认为呢?)“寄存器示例代码”的eax寄存器。发布于 2020-09-13 20:22:55
您缺少了前缀“操作码”的概念,该前缀更改了以下指令的含义。IA32手册的第2卷2.1.1和2.2.1节介绍了这一点。从2.1.1我们得到:
操作数大小覆盖前缀使用66H编码(66H也用作某些指令的强制前缀)。
因此,66前缀将操作数大小从默认的32位更改为16位。因此,mov $1,%ax (16位)与只有66前缀的mov $1,%eax (32位)相同。
最后一种情况(mov $1, %rax)实际上使用的是不同的指令
REX.W + C7 /0 io MOV r/m64, imm32 Move imm32 sign extended to 64-bits tor/m64.在这里,我们将一个常量移到任何寄存器中,而不是A --指令大一个字节,但允许将32位嵌入64位寄存器,所以只需要一个4字节的常量,而不是8字节的寄存器(因此最终比等效的48 b8 01 00 00 00 0 0 0,0 0 0,0 0 0只需3个字节)。
https://stackoverflow.com/questions/63875061
复制相似问题