golang汇编资料整理

有时看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下有哪个是非常好用的。

图1.png

下面是我以前写的一个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

以上写的是我的学习的时候收集的一些资料及一些新的体会。肯定不全面如哪里有问题,欢迎指正。

你可能感兴趣的:(golang汇编资料整理)