名字不能取太长 2022-02-15 22:41 采纳率: 78%
浏览 126
已结题

一段c++反汇编代码阅读的问题

编译器是gcc,高级语言代码如图

img


dbg反汇编中对应main函数结果如下

img


看不懂if语句为什么优化成这个样子了,谁能帮忙解读一下,最好每句汇编都能解读一下,非常感谢!

  • 写回答

3条回答 默认 最新

  • _GX_ 2022-02-15 23:27
    关注
    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函数返回
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月21日
  • 已采纳回答 2月16日
  • 赞助了问题酬金5元 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助