有時(shí)看golang底層源碼,發(fā)現(xiàn)有些是匯編直接寫的悬襟,以前也沒有學(xué)過所以有必要學(xué)一下golang的匯編。
由于golang匯編糅合了AT&T風(fēng)格語(yǔ)法加plan9語(yǔ)法加golang自己的匯編語(yǔ)法拯刁。所以最好拆出來單獨(dú)學(xué)習(xí)脊岳。
那要學(xué)好golang匯編要如何下手呢?
既然是匯編語(yǔ)言垛玻,不管是x86還是arm它們的思想都是相似的割捅,所以我打算從16位看起,一步一步學(xué)習(xí)最終到x86-64位golang的匯編帚桩。
以下是8個(gè)階段:
1, 8086(dos 16位)
入門我學(xué)的是16位的8086(dos系統(tǒng)下intel格式語(yǔ)法)下的匯編亿驾。匯編語(yǔ)言從0開始 到C語(yǔ)言這個(gè)老師就講的王爽老師的《匯編語(yǔ)言》這本書。買這本書直接看也可以账嚎。
這本書可以讓你入門莫瞬,知道了匯編語(yǔ)言的設(shè)計(jì)思想,更能深刻認(rèn)識(shí)程序的運(yùn)行過程郭蕉。
8086開發(fā)的debug工具不得不說dosbox可謂是真的好使疼邀,到現(xiàn)在還沒有發(fā)現(xiàn)調(diào)試工具在linux下有哪個(gè)是非常好用的。
下面是我以前寫的一個(gè)8086的例子召锈,貼出來有個(gè)直觀的認(rèn)識(shí):
功能是:鍵盤打字符輸出到屏幕(模擬stack方式)旁振。
assume cs:code,ds:data
data segment
STRING db 128 dup(0)
data ends
stack segment
db 128 dup(0)
stack ends
code segment
start:
call init_reg
call get_string
mov ax,4C00H
int 21H
;===================================
init_reg:
mov bx,data
mov ds,bx
mov bx,0B800H
mov es,bx
ret
;===================================
get_string:
mov si,OFFSET STRING
mov di,160*10+40
mov bx,0
getString: mov ah,0
int 16H
cmp al,20H
jb noChar
call char_push
call show_string
jmp getString
ret
;===================================
show_string: push dx
push ds
push es
push si
push di
showString: mov dl,ds:[si]
cmp dl,0
je showStringRet
mov es:[di],dl
add di,2
inc si
jmp showString
showStringRet:
mov byte ptr es:[di],0
pop di
pop si
pop es
pop ds
pop dx
ret
;===================================
char_push: cmp bx,126
ja charPushRet
mov ds:[si+bx],al
inc bx
charPushRet: ret
;===================================
getStringRet:
ret
;===================================
noChar:
cmp ah,0EH ;掃描碼 Backspace
je backspace
cmp ah,1CH ;回車 Enter
je getStringRet
jmp getString
;===================================
char_pop:
cmp bx,0
je charPopRet
dec bx
mov byte ptr ds:[si+bx],0
charPopRet: ret
;===================================
backspace: call char_pop
call show_string
jmp getString
code ends
end start
2, 用c語(yǔ)言反編譯看匯編代碼,查找main入口函數(shù)
- 這步為什么單拎出來烟勋,我覺的是匯編與c語(yǔ)言一個(gè)關(guān)系理解的更透徹些规求。
匯編語(yǔ)言入門四:打通C和匯編語(yǔ)言
3, AT&T語(yǔ)法
- 由于goland匯編是AT&T語(yǔ)法我在看x86的匯編之前看一下AT&T語(yǔ)法:
鏈接: https://pan.baidu.com/s/1TMd70hzy_fn_VxjQsBCInw 提取碼: qac9
4, x86
- 接下來我想看x86架構(gòu)下的匯編,由于golang的是匯編語(yǔ)法是AT&T格式卵惦,所以找到了《匯編語(yǔ)言程序設(shè)計(jì)》這個(gè)本書阻肿,作者是Richard Blum。
鏈接: https://pan.baidu.com/s/1iOHBa7K-vF34A8FhMHnlLg 提取碼: yigv - 還有網(wǎng)上的一個(gè)文檔:
http://docs.linuxtone.org/ebooks/C&CPP/c/ch18.html
5, x86-64
由于我沒有找到x86-64寫的比較完整的資料沮尿,所以比較零碎:
linux下寫匯編程序
8086,x86,x86-64簡(jiǎn)介
x86_64體系下的參數(shù)傳遞規(guī)則
Introduction to X86-64 Assembly for Compiler Writers
6, plan9
Go 系列文章3 :plan9 匯編入門
A Manual for the Plan 9 assembler
曹春暉——plan9 assembly 完全解析.pdf
第 34 期 Go 夜讀之《plan9 匯編入門丛塌,帶你打通應(yīng)用和底層》預(yù)習(xí)資料
7, golang asm
go plan9 匯編入門较解,帶你打通應(yīng)用和底層-video
曹春暉:談一談 Go 和 Syscall
A Quick Guide to Go's Assembler
匯編 is so easy
golang 匯編
8,從golang asm 到 at&t asm
看完golang 匯編肯定要上手實(shí)踐啦赴邻,比如將編譯好的二進(jìn)制進(jìn)行進(jìn)行g(shù)db調(diào)試查看一下與golang 自帶的tool complie 編譯生成的匯編代碼有什么區(qū)別印衔,這樣我加深理解。
想搜一些匯編視頻教程可以去下面兩個(gè)站點(diǎn)姥敛,肯定會(huì)有收獲:
- bilibili
- YouTube
以上寫的是我的學(xué)習(xí)的時(shí)候收集的一些資料及一些新的體會(huì)奸焙。肯定不全面如哪里有問題彤敛,歡迎指正与帆。