gas/x86 AT&T 语法中 movabs 的含义是什么?

逆向工程 x86 amd64
2021-07-01 01:18:03

我刚刚通过架构组装(使用gas)和拆卸(使用objdump发现了一条奇怪的指令amd64

原来的amd64汇编代码是:

mov 0x89abcdef, %al

并且,gas编译(我使用以下命令行:)gcc -m64 -march=i686 -c -o myobjectfile myassemblycode.sobjdump给出以下代码:

a0 df ce ab 89 00 00    movabs 0x89abcdef, %al

我的问题是我找不到任何movabs,也找不到movab英特尔汇编手册(甚至没有mova说明)。

所以,我在做梦?这个指令的意义是什么?我的猜测是它是 GNU binutils 的一个怪癖,但我不确定。

PS:我仔细检查了这条指令的拼写,所以它movaps肯定不是一条指令。

4个回答

这是 的官方文档gas,引用了相关部分:

在 AT&T 语法中,内存操作数的大小由指令助记符的最后一个字符决定。的助记符后缀bwlq指定字节(8位),字(16位),长(32位)和四字(64位)的存储器的引用。Intel语法通过添加前缀存储器操作数(不是指令助记符)完成此 byte ptrword ptrdword ptrqword ptr因此,英特尔mov al, byte ptr foo采用movb foo, %alAT&T 语法。

在 64 位代码中,movabs可用于对mov具有 64 位位移或立即数操作数指令进行编码

特别要读最后一句。

注意:通过 Google operator 找到inurl,搜索movabs inurl:sourceware.org/binutils/.

movabs 用于绝对数据移动,将任意 64 位常量加载到寄存器中或从 64 位地址加载寄存器中的数据。

来源:http : //www.ucw.cz/~hubicka/papers/amd64/node1.html

如果您发现自己经常破解 AT&T 语法 x86/x64 汇编器,Solaris 手册可能会有所帮助:x86 汇编语言参考手册

我注意到 GAS 翻译

movq $0x80000000, %rax

进入

movabs 0x80000000, %rax

但是小于 0x80000000 运动的值不会转换为movabs. 也就是说,movq $0x7fffffff, $rbx没有翻译成movabs $0x7fffffff, %rbx. 您可以disas在 GDB 中使用反汇编命令进行验证

可能是因为$0x80000000超出了 32 位的有符号正数范围,需要转换为 64 位整数。出于这个原因,GAS 将如此大的数字转换为 64 位长整数,因此使用movabsq指令而不是movq直接源限制为 32 位常量指令。