Linux c++反汇编源码细节解释说明

示例c++源码:

cpp 复制代码
int main(int argc, char** argv)
{
    auto sk = argc;
    int a = 11 << sk;
    int b = 19 + argc;
    volatile int rv = a + b * 8;
    rv *= sk;
    return rv;
}

GUN x86 64bit AT&T 汇编环境下用 g++ -O1 -Wa,-adhln ./main.cc命令反汇编

反汇编源码:

cpp 复制代码
0000 89F9     		movl	%edi, %ecx
0002 B80B0000 		movl	$11, %eax
0007 D3E0     		sall	%cl, %eax
0009 8D84F898 		leal	152(%rax,%rdi,8), %eax
0010 0FAFC7   		imull	%edi, %eax
0013 C3       		ret

一点准备知识:

先通过通用寄存器cx来说明一下寄存器的命名,以便理解。

一般来讲,cx是两个字节(一个字,16bit)的通用寄存器。cx的高8位字节叫做ch大写为CH,低8位字节叫做cl大写为CL,ch和cl可以单独再汇编指令中使用。16位寄存器,8086CPU时代的老物件了。接着到了x86-32位时代。寄存器要存储32bit,这时候cx的名字就变为ecx,大写为ECX。仍然是通用寄存器,ecx由两个cx构成,一个高16位cx另一个是低16位cx。进入如今的64位时代,ecx就升级为rcx大写为RCX。同理,AX,BX,DX,DI,SI等都一样的。相对于16为后续更高位宽的cpu计算系统,相应的增加了其他的寄存器,例如支持SSE(SIMD)和AVX(MIMD)并行计算的相关寄存器。如下图示例:

AT&T 格式(GAS)汇编指令示例说明: movl实际是mov指令,后面这个l(L的小写)是个后缀,还有诸如:"b", "s", "w", "l", "q" or "t" 这些后缀。详情如下所示:

b = byte (8 bit).

s = single (32-bit floating point).

w = word (16 bit).

l = long (32 bit integer or 64-bit floating point).

q = quad (64 bit).

t = ten bytes (80-bit floating point).

所以sall实际是sal指令加上l后缀。

逐句解释说明:

cpp 复制代码
# 下面一句代码,将形参argc的数据值存放到 ecx寄存器
movl	%edi, %ecx
# 下面一句代码,将立即数11存放到 eax寄存器
movl	$11, %eax
# 下面一句代码, 用cl寄存器中的值对eax中的值做左移位运算操作,sal就是算数左移指令也可以是shl
sall	%cl, %eax
# 下面一句代码, 是经过指令优化的。实际实现的运算逻辑是: 8 * rdi + rax + 152,而152 = 19 * 8。
# 这样的优化就减少了计算。lea指令是计算源操作数的地址并保存到目标操作数,也就是将上述计算结果的地址
# 存放到eax寄存器。
leal	152(%rax,%rdi,8), %eax
# 下面一句代码,edi的值乘以eax的值,并将结果放在eax中。imul是有符号乘法指令。
imull	%edi, %eax
# 下面一句代码,函数返回。
ret
相关推荐
Code哈哈笑6 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶10 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_4336184412 分钟前
shell 编程(二)
开发语言·bash·shell
闻缺陷则喜何志丹15 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie11451419127 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满27 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99933 分钟前
PHP中替换某个包或某个类
开发语言·php
小林熬夜学编程38 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
m0_7482361141 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头1061 小时前
【C++指南】类和对象(九):内部类
开发语言·c++