組合語言是面向機器的程式語言,可以將其看成是各種 cpu 的機器指令的助記符集合。程式設計師可以使用彙編**直接控制硬體系統工作,而且用組合語言編寫的程式具備執行速度快和占用記憶體少等優點。
這主要是因為 arm 採用的是 risc 架構,具備功耗低的優勢
ios 模擬器的程式實際就是以 ios 模擬器作為容器,執行在該容器中的 mac os 程式,所以它使用的彙編也是 x86 彙編。
我經常使用的 hopper disassemble v4 主要用來檢視oc的偽**,那hopper是屬於at&t 還是 intel分支?
答案是:反彙編工具 hopper disassemble 和 ida pro 使用的是 intel 彙編語法。
x86 組合語言演變出兩個語法分支: intel和 at&t,其中 intel 語法在 ms-dos 和 windows 家族中佔主導地位,而 at&t 語法則常見於 unix 家族中。
值得注意的是在 xcode 中的彙編語法使用的是 at&t
段式定址,其中 segreg 是段暫存器
位址計算的公式
address = disp + base + index * scale
其中 base 為基址,disp 為偏移位址,index * scale 決定了第幾個元素,scale 為元素長度,只能為 2 的冪,index 預設為 0,scale 預設為 1。
disp/base/index/scale 全部都是可選的,
最終 at&t 彙編指令的格式是%segreg: disp(base,index,scale)
,
intel 彙編指令的格式是segreg: [base+index*scale+disp]。
記憶體(memory)為 cpu 存放指令和資料,記憶體本質上就是乙個位元組陣列
處理器在執行指令的過程中,所有資料在暫存器裡面都只是臨時存放的,然後又會被送往別處,這也是「暫存器」得名的原因。
中將通用暫存器從 8 個擴充套件到了 16 個,正因為如此,所以可以借助暫存器來儲存程式狀態,而不是像原先那樣通過棧來儲存程式狀態,這極大地減少了訪問記憶體的次數。
除了從 ia32 的擴充套件而來的 64 位暫存器:rax、rcx、rdx、rbx、rsi、rdi、rsp 和 rbp,還有新增加的 8 個暫存器 r8 - r15。16 個浮點數暫存器組則為 xmm0 - xmm15。
register read -a 或 register read --all
(lldb) register read -a
general purpose registers:
rax = 0x00007ffee58c87a8
rbx = 0x00000000000000c1
rcx = 0x000000011c0b2000
rdx = 0x00007ffee58c81a0
rdi = 0x0000000000000000
rsi = 0x00000000000000c1
rbp = 0x00007ffee58c87c0
rsp = 0x00007ffee58c8190
r8 = 0x00007ffee58ca048
r9 = 0x0000000000000000
r10 = 0x00007ffee58c8800
r11 = 0x0000000000000001
r12 = 0x0000000000000000
r13 = 0x00000000000000c1
r14 = 0x00007ffee58c8e30
r15 = 0x0000b958139a179c
rip = 0x000000010e533fcf dyld`_dyld_debugger_notification + 1
rflags = 0x0000000000000246
cs = 0x000000000000002b
fs = 0x0000000000000000
gs = 0x0000000000000000
eax = 0xe58c87a8
ebx = 0x000000c1
ecx = 0x1c0b2000
edx = 0xe58c81a0
edi = 0x00000000
esi = 0x000000c1
ebp = 0xe58c87c0
esp = 0xe58c8190
r8d = 0xe58ca048
r9d = 0x00000000
r10d = 0xe58c8800
r11d = 0x00000001
r12d = 0x00000000
r13d = 0x000000c1
r14d = 0xe58c8e30
r15d = 0x139a179c
ax = 0x87a8
bx = 0x00c1
cx = 0x2000
dx = 0x81a0
di = 0x0000
si = 0x00c1
bp = 0x87c0
sp = 0x8190
r8w = 0xa048
r9w = 0x0000
r10w = 0x8800
r11w = 0x0001
r12w = 0x0000
r13w = 0x00c1
r14w = 0x8e30
r15w = 0x179c
ah = 0x87
bh = 0x00
ch = 0x20
dh = 0x81
al = 0xa8
bl = 0xc1
cl = 0x00
dl = 0xa0
dil = 0x00
sil = 0xc1
bpl = 0xc0
spl = 0x90
r8l = 0x48
r9l = 0x00
r10l = 0x00
r11l = 0x01
r12l = 0x00
r13l = 0xc1
r14l = 0x30
r15l = 0x9c
floating point registers:
fctrl = 0x037f
fstat = 0x0000
ftag = 0x00
fop = 0x0000
fioff = 0x00000000
fiseg = 0x0000
fooff = 0x00000000
foseg = 0x0000
mxcsr = 0x00001f80
mxcsrmask = 0x0000ffff
stmm0 =
stmm1 =
stmm2 =
stmm3 =
stmm4 =
stmm5 =
stmm6 =
stmm7 =
ymm0 =
ymm1 =
ymm2 =
ymm3 =
ymm4 =
ymm5 =
ymm6 =
ymm7 =
ymm8 =
ymm9 =
ymm10 =
ymm11 =
ymm12 =
ymm13 =
ymm14 =
ymm15 =
xmm0 =
xmm1 =
xmm2 =
xmm3 =
xmm4 =
xmm5 =
xmm6 =
xmm7 =
xmm8 =
xmm9 =
xmm10 =
xmm11 =
xmm12 =
xmm13 =
xmm14 =
xmm15 =
exception state registers:
trapno = 0x00000001
err = 0x00000000
faultvaddr = 0x00007ffee58c8190
理解組合語言的作用
1.組合語言的大部分語句直接對應機器指令,執行速度快,效率高,體積小,在某些儲存器容量有限,但需要快速和實時響應的場合比較有用。3.組合語言可以用於軟體的加密和解密 計算機病毒的分析和防治,以及程式的除錯和錯誤分析等各個方面。4.通過學習組合語言,能夠加深對計算機原理和作業系統等課程的理解。通過學習...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
關於組合語言棧的理解
棧就是一段特殊記憶體,什麼是棧呢?舉個例子,乙個只有上面開啟的盒子,現在有三本書離散數學 c語言 組合語言,需要將這三本書一本一本的放進去,先將離散數學放進去,然後c語言,接著組合語言,現在又需要將三本書拿出去,只能先拿組合語言,再拿c語言接著再拿離散數學,棧就是這樣的特點,後進先出。棧的大小怎麼確...