AT&T汇编

指令后缀

AT&T格式的汇编指令有不同的后缀

其中

b表示byte,字节

w表示word,字/两字节

l表示long,32位系统下的long是4字节

q表示quad,意味四重,表示4个字/8字节

寄存器用途

参见
AT&T的汇编世界 - Gemfield的文章 - 知乎

特殊寻址方式

指针寄存器rsp可以用-8(%rsp)这种方式来寻址,rax等寄存器则不能

想寻址的偏移量保存在寄存器里:

(%rsp, %rax) # 偏移rax寄存器里保存的值

%rsp, %rax, 2) # 取rsp偏移rax2处的值,上行实际上是缺省了1
2(%rsp, %rax, 2) # 取rsp偏移rax
2+2处的值

如下图所示

通过gdb调试查看,符合

命令行参数

在bash中执行命令时,参数的数量保存在(%rsp)寄存器处;

第0个参数的地址(可执行文件名)保存在8(%rsp)处

第1个参数的地址保存在16(%rsp)处

... ...

后面是环境变量

GDB汇编调试简介

layout asm 显示汇编源码
si 单步执行汇编指令,会进入函数
ni 单行执行汇编指令,不会进入函数
i r (info regirester) 查看寄存器的值
p 打印变量的值

p $rax # 打印rax寄存器的数据

p *0xaaaa # 打印0xaaaa处的数据,以十进制整数形式

p (char*)0xaaaa # 以字符串形式

x 打印地址内的数据

x $rsp # 打印rsp寄存器指向地址内保存的数据

x/[数量][格式][宽度]

数量:打印多少字节

格式:t二进制/o八进制/d十进制/x十六进制/c字符/f浮点

宽度:b字节/h两字节/w四字节/g八字节

例:x/20xg $rsp,打印rsp到rsp+20处的指向地址内保存的数据

语法杂记

div

div指令不接受一个立即数作为参数

div执行前被除数的高位放在rdx、低位放在rax,执行后的商放在rax、余数放在rdx,因此要连续运算,需要把高位rdx清零或是重新赋值

lea

lea指令的源操作数不能是数据寄存器,因此如果想把一个常量的地址加载到某处

movq $1234, %rax

leaq %rax, %rdi

上述做法是错误的

一般需要用栈空间中转,用法如下

movq $1234, -8(%rsp)

leaq -8(%rsp), %di

(使用栈空间需要先分配

相关推荐
liulilittle1 天前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
工业互联网专业1 天前
汇编与接口技术:8259中断实验
汇编·单片机·嵌入式硬件·8259中断实验
small_wh1te_coder2 天前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
Ronin-Lotus14 天前
微处理器原理与应用篇---ARM常见汇编指令
汇编·arm开发·微处理原理与应用
永夜的黎明17 天前
【二进制安全作业】250616课上作业1-栈溢出漏洞利用
c语言·汇编·安全
Geometry Fu19 天前
物联网控制技术 知识点总结 第三章 汇编语言 第四章 C51语言
汇编·物联网·51单片机
半桔19 天前
【Linux手册】进程的状态:从创建到消亡的“生命百态”
linux·运维·服务器·汇编·深度学习·面试
一条叫做nemo的鱼22 天前
从汇编的角度揭开C++ this指针的神秘面纱(下)
java·汇编·c++·函数调用·参数传递
一条叫做nemo的鱼23 天前
从汇编的角度揭开C++ this指针的神秘面纱(上)
汇编·c++·算法·函数调用·this指针·参数传递
qwertyuiop_i25 天前
汇编(函数调用)
汇编·windows·函数调用