Assembly 操作数顺序是xcrun otool和capstone、IDA之间的差异

Assembly 操作数顺序是xcrun otool和capstone、IDA之间的差异,assembly,otool,Assembly,Otool,所以我有一个简单的hello world程序: #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World!\n"); return 0; } 和机器代码: % xcrun otool -s __TEXT __text a.out a.out: (__TEXT,__text) section 0000000100000f30 55 48 89 e5 48 83 ec 20 48

所以我有一个简单的hello world程序:

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("Hello World!\n");
    return 0;
}
和机器代码:

% xcrun otool -s __TEXT __text a.out 
a.out:
(__TEXT,__text) section
0000000100000f30 55 48 89 e5 48 83 ec 20 48 8d 05 4b 00 00 00 c7 
0000000100000f40 45 fc 00 00 00 00 89 7d f8 48 89 75 f0 48 89 c7 
0000000100000f50 b0 00 e8 11 00 00 00 b9 00 00 00 00 89 45 ec 89 
0000000100000f60 c8 48 83 c4 20 5d c3
如果我尝试使用keystone转换“mov rsp rbp”,它会给我机器代码:

% xcrun otool -s __TEXT __text a.out 
a.out:
(__TEXT,__text) section
0000000100000f30 55 48 89 e5 48 83 ec 20 48 8d 05 4b 00 00 00 c7 
0000000100000f40 45 fc 00 00 00 00 89 7d f8 48 89 75 f0 48 89 c7 
0000000100000f50 b0 00 e8 11 00 00 00 b9 00 00 00 00 89 45 ec 89 
0000000100000f60 c8 48 83 c4 20 5d c3
0x48 0x89 0xec

这与otool的
48 89 e5

经过一些尝试和搜索,我发现otool的操作数顺序是left->right,而keystone或idatreat的顺序是right->left

有人能帮我吗?为什么要按相反的顺序打印


我查看了英特尔的asm手册,顺序也是右->左。所以我不明白为什么otool会以另一种方式打印操作数。

这是GNU world的“AT&t”或“gas”语法(例如,默认情况下,gcc会以这种语法生成程序集)<代码>movq%rsp,%rbp=
mov rbp,esp
采用英特尔语法。大多数GNU工具现在也有办法将它们转换成英特尔语法,但我不相信它们已经准备好在这种模式下完全运行。而且在短时间的谷歌搜索之后,
otool
不支持英特尔语法。您可能需要检查像
objdump-M intel-d
这样的东西是否能帮助您。。。