有时看golang底层源码,发现有些是汇编直接写的,以前也没有学过所以有必要学一下golang的汇编。
由于golang汇编糅合了AT&T风格语法加plan9语法加golang自己的汇编语法。所以最好拆出来单独学习。
那要学好golang汇编要如何下手呢?
既然是汇编语言,不管是x86还是arm它们的思想都是相似的,所以我打算从16位看起,一步一步学习最终到x86-64位golang的汇编。
以下是8个阶段:
1, 8086(dos 16位)
入门我学的是16位的8086(dos系统下intel格式语法)下的汇编。汇编语言从0开始 到C语言这个老师就讲的王爽老师的《汇编语言》这本书。买这本书直接看也可以。
这本书可以让你入门,知道了汇编语言的设计思想,更能深刻认识程序的运行过程。
8086开发的debug工具不得不说dosbox可谓是真的好使,到现在还没有发现调试工具在linux下有哪个是非常好用的。
下面是我以前写的一个8086的例子,贴出来有个直观的认识:
功能是:键盘打字符输出到屏幕(模拟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语言反编译看汇编代码,查找main入口函数
- 这步为什么单拎出来,我觉的是汇编与c语言一个关系理解的更透彻些。
汇编语言入门四:打通C和汇编语言
3, AT&T语法
- 由于goland汇编是AT&T语法我在看x86的汇编之前看一下AT&T语法:
链接: https://pan.baidu.com/s/1TMd70hzy_fn_VxjQsBCInw 提取码: qac9
4, x86
- 接下来我想看x86架构下的汇编,由于golang的是汇编语法是AT&T格式,所以找到了《汇编语言程序设计》这个本书,作者是Richard Blum。
链接: https://pan.baidu.com/s/1iOHBa7K-vF34A8FhMHnlLg 提取码: yigv - 还有网上的一个文档:
http://docs.linuxtone.org/ebooks/C&CPP/c/ch18.html
5, x86-64
由于我没有找到x86-64写的比较完整的资料,所以比较零碎:
linux下写汇编程序
8086,x86,x86-64简介
x86_64体系下的参数传递规则
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 汇编入门,带你打通应用和底层》预习资料
7, golang asm
go plan9 汇编入门,带你打通应用和底层-video
曹春晖:谈一谈 Go 和 Syscall
A Quick Guide to Go's Assembler
汇编 is so easy
golang 汇编
8,从golang asm 到 at&t asm
看完golang 汇编肯定要上手实践啦,比如将编译好的二进制进行进行gdb调试查看一下与golang 自带的tool complie 编译生成的汇编代码有什么区别,这样我加深理解。
想搜一些汇编视频教程可以去下面两个站点,肯定会有收获:
- bilibili
- YouTube
以上写的是我的学习的时候收集的一些资料及一些新的体会。肯定不全面如哪里有问题,欢迎指正。