程序员应了解的那些事(24)汇编基础知识之 AT&T 汇编 对比 Intel 汇编

【AT&T VS Intel】
<1>基于 x86 架构 的处理器所使用的汇编指令一般有两种格式.
        Intel 汇编:
                DOS(8086处理器), Windows
                Windows 派系 -> VC 编译器

        AT&T汇编:
                Linux, Unix, Mac OS, iOS(模拟器)
                Unix派系 -> GCC编译器

<2>基于ARM 架构 的处理器所使用的汇编指令一般有一种格式, 这种处理器常用语嵌入式设备, 移动设备, 以高性能, 低能耗见长
        ARM 汇编: iOS 真机

Intel汇编与AT&T汇编对比(操作数顺序不同):

【64位 AT&T汇编的寄存器】
①有16个常用的64位寄存器
%rax, %rbx, %rcx , %rdx, %rsi, %rdi, %rbp, %rsp (和 8086汇编类似 )
%r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
②寄存器的具体用途
%rax 作为函数返回值使用
%rsp 指向栈顶
%rdi, %rsi, %rdx, %rcx, %r8, %r9, %r10等寄存器用于存放函数参数

③64位, 32位, 16位, 8位 寄存器的显示:

 

【栈帧】 

栈帧说明函数函数的调用流程如下(内存):

  • 1.push 参数
  • 2.push 函数的返回地址
  • 3.push bp (保留bp之前的值,方便以后恢复)
  • 4.mov bp, sp (保留sp之前的值,方便以后恢复)
  • 5.sub sp,空间大小 (分配空间给局部变量)
  • 6.保护可能要用到的寄存器
  • 7.使用CC(int 3)填充局部变量的空间
  • 8.--------执行业务逻辑--------
  • 9.恢复寄存器之前的值
  • 10.mov sp, bp (恢复sp之前的值)
  • 11.pop bp (恢复bp之前的值)
  • 12.ret (将函数的返回地址出栈,执行下一条指令)
  • 13.恢复栈平衡 (add sp,参数所占的空间)

【调试】

在解析汇编程序的时候, 有一些 LLDB 指令是很好用的

  • 读取寄存器的值: register read/x $rax, 这里x 指 16进制格式, 还有 f 浮点数, d 十进制数
  • 修改寄存器的值: register write $rax 0
  • 读取内存中的值:
    • x/数量-格式-字节大小 内存地址
    • x/3xw 0x0000010, 这里 w 指的是4个字节大小
    • b, byte, 1字节; h, hard word, 2字节; w, word, 4字节; g, giant word, 8字节.
  • 修改内存中的值:
    • memory write 内存地址 数值
    • memory write 0x0000010 10
  • 寻址: image lookup --address 内存地址

 

 参考:汇编语言知多少 共四篇

https://www.jianshu.com/p/8faabed0eedb

https://www.jianshu.com/p/d07ae7db8ec5

https://www.jianshu.com/p/17b03747ea5a

https://www.jianshu.com/p/0480e431f1d7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值