匯編語言的種類:
- 1.8086匯編(16bit)
2.x86匯編 (32bit)
3.x64匯編 (64bit)
4.ARM匯編 (嵌入式 移動設(shè)備)
常見的匯編指令
| 項目 | AT&T- | Intel | 說明 |
|---|---|---|---|
| 寄存器命名 | %rax | rax | |
| 操作數(shù)順序 | movq %rax,%rdx |
mov rdx,rax | 將 rax的值賦值給 rdx |
| 常數(shù)/立即數(shù) |
movq \$3,%raxmovq $0x10,%rax
|
mov rax,3 mov rax,0x10 |
將3賦值給rax 將10賦值給rax |
| 內(nèi)存賦值 | movq 0xa,0x1ff7(%rip) |
mov qword ptr[rip+0x1ff7],0xa | 將 0xa賦值給地址為 rip+0x1ff7 的內(nèi)存 |
| 取內(nèi)存地址 | movq -0x18(%rbp),%rax |
lea rax,[rbp - 0x18] | 將 rep - 0x18 這個地址值賦值給 rax |
| jmp指令 |
jmp *%rdxjmp 0x40001002jmp *(%rax)
|
jmp rdx jmp 0x40001002 jmp [rax] |
call和jmp寫法類似 |
| 操作數(shù)長度 |
movl %eax,%edxmovb $0x10,%alleaw 0x10(%dx),%ax
|
mov edx,eax mov al,0x10 lea ax,[dx + 0x10] |
b = byte(8-bit)s = short(16-bit integer or 32-bit floating point)w = word(16-bit)l = long(32-bit integer or 64-bit floating pint)q = quad(64-bit)t = ten bytes(80-bit floating pint) |
寄存器
- 16個常用寄存器
%rax 、%rbx、%rcx、%rdx、%rsi、%rdi、%rbp、%rsp
%r8、%r9、%r10、%r11、%r12、%r13、%r14、%r15
2.寄存器的具體用途
%rax 常作為函數(shù)返回值使用
%rdi 、%rsi 、%rdx 、% rcx 、%r8 、%r9等寄存器常用于存放函數(shù)參數(shù)
%rsp 、%rbp 用于棧操作
lldb常用指令
讀取寄存器的值
register read/格式
register read/x修改寄存器的值
register write 寄存器名稱 數(shù)值
register write rax 0讀取內(nèi)存中的值
x/數(shù)量-格式-字節(jié)大小 內(nèi)存地址
x/3xw 0x0000010修改內(nèi)存中的值
memory write 內(nèi)存地址 數(shù)值
memory write 0x00000010 10格式
x 是16進制,f 是浮點,d 是十進制字節(jié)大小
b - byte 1字節(jié)
h - half word 2字節(jié)
w - word 4字節(jié)
g - giant word 8字節(jié)
expression 表達(dá)式
可以簡寫:expr 表達(dá)式
expression $rax
expression $rax = 1po表達(dá)式
print 表達(dá)式
po/x $rax
po (int)$rax單步運行,把子函數(shù)當(dāng)作整體一步執(zhí)行(
源碼級別)
thread step-over、 next、 n單步運行,遇到子函數(shù)會進入子函數(shù)(
源碼級別)
thread step-in、step、s單步運行,把子函數(shù)當(dāng)作整體一步執(zhí)行(
匯編級別)
thread step-inst-over、 nexti、 ni單步運行,遇到子函數(shù)會進入子函數(shù)(
匯編級別)
thread step-inst、stepi、si直接執(zhí)行晚當(dāng)前函數(shù)的所有代碼,返回到上一個函數(shù)(遇到斷點會卡?。?br>
thread step-out 、 finish
內(nèi)存地址格式為:
0x4bdc(%rip),一般是 全局變量,全局區(qū)(數(shù)據(jù)段)
內(nèi)存地址格式為:-0x78(%rbp),一般是 局部變量,??臻g
內(nèi)存地址格式為:0x10(%rax),一般是堆空間