組合語言的分支理解

2021-09-14 04:52:57 字數 4272 閱讀 3961

組合語言是面向機器的程式語言,可以將其看成是各種 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語言接著再拿離散數學,棧就是這樣的特點,後進先出。棧的大小怎麼確...