Golang 汇编介绍

在阅读 Golang 源代码时,总是被其中的汇编代码卡住,读起来不流畅。今天来简要了解下 Golang 中的汇编语言。

汇编分类

按指令集架构分类(针对 CPU)
  1. x86汇编(32bit):这种架构常被称为i386, x86

  2. x86汇编(64bit), 这种架构常被称为 AMD64, Intel64, x86-64, x64, 它是 AMD 设计的, 是 x86 架构的 64 位扩展, 后来公开

  3. ARM汇编, ARM处理器由于高性能, 低耗电, 常用于嵌入式, 移动设备.

按汇编格式分类(针对人的阅读习惯)
  1. Intel 格式
  2. AT&T 格式

平时我们说 golang 中汇编属于 plan9 风格,是按第二种方式分类的,其阅读风格(符号)与 Intel 与 AT&T 都有不同。plan9 汇编作者是 unix 操作系统的同一批人,bell 实验室所开发的。

Go汇编语言是基于 plan9 汇编,但是现实世界还有这么多不同架构的 CPU 在这。所以 golang 汇编在 plan9 风格下,同一个方法还有不同指令集架构的多种实现。

在哪能看到 Golang 汇编代码

  1. Golang 源代码中,如src/runtime/asm_amd64.ssrc/math/big/
  2. go tool compile -S main.go,把自己编写的代码编译成汇编代码。如:在我的 Mac Intel 机器上,amd64的架构,汇编代码生成如下:
$ cat main.go 
package main

func main() {
   
        a, b := 0, 0
        println(a + b)
}
$ go tool compile -S main.go 
"".main STEXT size=66 args=0x0 locals=0x10 funcid=0x0
        0x0000 00000 (main.go:3)        TEXT    "".main(SB), ABIInternal, $16-0
        0x0000 00000 (main.go:3)        CMPQ    SP, 16(R14)
        0x0004 00004 (main.go:3)        PCDATA  $0, $-2
        0x0004 00004 (main.go:3)        JLS     57
        0x0006 00006 (main.go:3)        PCDATA  $0, $-1
        0x0006 00006 (main.go:3) 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 语言中,如果您想要编写 shellcode,可以使用 asm 包。asm 包提供了一种用汇编语言编写代码的方法,以便在 Go 语言中使用汇编语言。 首先,您需要安装 Go 语言汇编器工具集,以便在编写汇编代码时能够编译和链接代码。您可以使用以下命令安装汇编器工具集: ``` sudo apt-get install golang-go.tools ``` 然后,您可以在 Go 语言中使用 asm 包来编写汇编代码。下面是一个简单的例子: ```go package main import ( "syscall" "unsafe" ) func main() { shellcode := []byte{ /* your shellcode goes here */ } // Allocate memory for the shellcode addr, _, err := syscall.Syscall(syscall.SYS_MMAP, 0, uintptr(len(shellcode)), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANONYMOUS|syscall.MAP_PRIVATE, 0, 0) if err != 0 { panic(err) } buf := (*[1 << 30]byte)(unsafe.Pointer(addr)) copy(buf[:], shellcode) // Call the shellcode syscall.Syscall(addr, 0, 0, 0, 0) } ``` 在上面的示例中,我们首先定义了一个 shellcode 变量,其中包含要执行的汇编代码。然后,我们使用 syscall 包中的 Syscall 函数来分配内存,并将 shellcode 复制到分配的内存中。最后,我们使用 Syscall 函数来执行 shellcode。 请注意,上述示例代码仅用于演示如何在 Go 语言中使用汇编语言编写 shellcode。在实际使用中,编写 shellcode 需要考虑许多其他因素,如平台兼容性、安全性、调试等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值