编译器是gcc,高级语言代码如图
dbg反汇编中对应main函数结果如下
看不懂if语句为什么优化成这个样子了,谁能帮忙解读一下,最好每句汇编都能解读一下,非常感谢!
编译器是gcc,高级语言代码如图
push rbx ; 保存帧指针
sub rsp, 20 ; 分配局部变量内存
mov ebx, ecx ; 寄存器ecx存的是传入的argc的值,这里把argc的值拷贝到ebx
call a.7FF74BC515D0 ; ??
cmp ebx, 1 ; 这里cmp指令相当于计算ebx-1,如果等于ebx等于0,ebx-1结果是-1,CF位被置1(即向高位借了一位),注意这里计算都是按无符号来计算的,只有ebx=0时,CF才会被置1,也就是只有argc==0时,CF=1
mov edx, 5 ; 拷贝5到edx,注意寄存器edx是传入printf函数的第二参数
lea rcx, qword ptr ds:[7FF74BC59000] ; 将字符串"%d\n"的地址拷贝到rcx,注意rcx是传入printf函数的第一个参数
sbb edx, FFFFFFFF ; sbb指令相当于DEST=(DEST-(SRC+CF)),如果argc==0,CF是1,那么edx=5-(-1+1)=5;如果argc!=0,CF=0,edx=5-(-1)=6, edx是传入printf函数的第二个参数
call a.7FF74BC57320 ; 调用printf函数
call <JMP.&_fgetchar> ; 调用getchar函数
xor eax, eax, ; 返回值置0
add rsp, 20 ; 释放局部变量内存
pop rbx ; 恢复帧指针
ret ; main函数返回