汇编 汇编语言知多少: ATamp;amp;T 汇编语法

编辑:
发布时间: 2020-12-14 15:32:06
分享:

在前几篇文章里我们一直聊的是 Intel 格式的 8086汇编, 这篇文章我们聊聊 AT&T 格式的汇编语法.

AT&T VS Intel基于 x86 架构 的处理器所使用的汇编指令一般有两种格式.Intel 汇编DOS, WindowsWindows 派系 -> VC 编译器AT&T汇编Linux, Unix, Mac OS, iOSUnix派系 -> GCC编译器基于ARM 架构 的处理器所使用的汇编指令一般有一种格式, 这种处理器常用语嵌入式设备, 移动设备, 以高性能, 低能耗见长ARM 汇编, iOS 真机.64位 AT&T汇编的寄存器有16个常用的64位寄存器%rax, %rbx, %rcx , %rdx, %rsi, %rdi, %rbp, %rsp %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 4.mov bp, sp 5.sub sp,空间大小 6.保护可能要用到的寄存器7.使用CC填充局部变量的空间8.--------执行业务逻辑--------9.恢复寄存器之前的值10.mov sp, bp 11.pop bp 12.ret 13.恢复栈平衡 调试

在解析汇编程序的时候, 有一些 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 内存地址

还有 JCC 的指令表

指令解释描述JE, JZ
相关阅读
热门精选
孩子 皮肤