多語種網站制作推廣論壇有哪些
指令后綴
AT&T格式的匯編指令有不同的后綴
其中
b表示byte,字節(jié)
w表示word,字/兩字節(jié)
l表示long,32位系統(tǒng)下的long是4字節(jié)
q表示quad,意味四重,表示4個字/8字節(jié)
寄存器用途
參見
AT&T的匯編世界 - Gemfield的文章 - 知乎
特殊尋址方式
指針寄存器rsp可以用-8(%rsp)這種方式來尋址,rax等寄存器則不能
想尋址的偏移量保存在寄存器里:
(%rsp, %rax) ????? # 偏移rax寄存器里保存的值
%rsp, %rax, 2) ?? # 取rsp偏移rax2處的值,上行實際上是缺省了1
2(%rsp, %rax, 2) # 取rsp偏移rax2+2處的值
如下圖所示
通過gdb調試查看,符合
命令行參數(shù)
在bash中執(zhí)行命令時,參數(shù)的數(shù)量保存在(%rsp)寄存器處;
第0個參數(shù)的地址(可執(zhí)行文件名)保存在8(%rsp)處
第1個參數(shù)的地址保存在16(%rsp)處
… …
后面是環(huán)境變量
GDB匯編調試簡介
layout asm 顯示匯編源碼
si 單步執(zhí)行匯編指令,會進入函數(shù)
ni 單行執(zhí)行匯編指令,不會進入函數(shù)
i r(info regirester) 查看寄存器的值
p 打印變量的值
p $rax # 打印rax寄存器的數(shù)據
p *0xaaaa # 打印0xaaaa處的數(shù)據,以十進制整數(shù)形式
p (char*)0xaaaa # 以字符串形式
x 打印地址內的數(shù)據
x $rsp # 打印rsp寄存器指向地址內保存的數(shù)據
x/[數(shù)量][格式][寬度]
數(shù)量:打印多少字節(jié)
格式:t二進制/o八進制/d十進制/x十六進制/c字符/f浮點
寬度:b字節(jié)/h兩字節(jié)/w四字節(jié)/g八字節(jié)
例:x/20xg $rsp,打印rsp到rsp+20處的指向地址內保存的數(shù)據
語法雜記
div
div指令不接受一個立即數(shù)作為參數(shù)
div執(zhí)行前被除數(shù)的高位放在rdx、低位放在rax,執(zhí)行后的商放在rax、余數(shù)放在rdx,因此要連續(xù)運算,需要把高位rdx清零或是重新賦值
lea
lea指令的源操作數(shù)不能是數(shù)據寄存器,因此如果想把一個常量的地址加載到某處
movq $1234, %rax
leaq %rax, %rdi
上述做法是錯誤的
一般需要用??臻g中轉,用法如下
movq $1234, -8(%rsp)
leaq -8(%rsp), %di
(使用??臻g需要先分配