목차

0. Go 언어

1. 고 어셈 소개

2. 고 어셈 레퍼런스

3. 고 어셈 프로그램 빌드하는 법

4. 고 어셈 실전 예제


0. 문제


Java나 C#처럼 GC는 있는데 VM이 없어 수행이 빠르고,


C++처럼 C나 Assembly를 통해서 주소 접근이 가능하며,


Python이나 Javascript처럼 쉽게 프로그래밍하면서도 정적 타입을 지원하며,


네이티브 바이너리로 컴파일/링크/빌드 가능하면서도 플랫폼 독립적인 프로그래밍 언어가 뭘까요.


그것은 요즘 최고로 핫하다는 Go입니다. xD


1. 고 어셈 소개


Go는 그냥 기본 스펙 자체에서 "Go Assembly"라는 기계어 수준의 특수한 언어를 지원합니다.


줄여서 고 어셈이라고 불러요.


고 어셈이란 언어가 대단히 획기적인 것이, amd64, x86, ARM 등 모든 머신 아키텍처의 기계어를 거의 대부분 아우르는 통일된 문법을 쓰거든요. (바벨탑?)[각주:1]


시스템 프로그래머(해커)들이 좋아하지 않을까 하네요.



VSCode에서는 확장 기능으로 고 어셈의 자동완성을 지원하고 있으니까, 그런 툴도 이용해서 고 어셈을 즐길 수 있습니다.



3. 고 어셈 프로그램 빌드하는 법


고 어셈으로 작성한 프로그램을 빌드하는 방법이 따로 있지는 않습니다.


확장자가 .s인 파일에 고 어셈 문법으로 코딩한 다음, 일반적인 Go 프로그램을 빌드할 때와 똑같이 빌드할 수 있습니다.


$ go build


아래는 헬로월드 급으로 간단한 고 어셈 예제입니다.


$ go get -v github.com/nanitefactory/asmtest


whatever.go

package main

import "fmt"

func add(x, y int64) int64

func main() {
	fmt.Println(add(2, 3))
}


whatsoever.s

TEXT ·add(SB), $0
	MOVQ x+0(FP), BX
	MOVQ y+8(FP), BP
	ADDQ BP, BX
	MOVQ BX, ret+16(FP)
	RET


4. 고 어셈 실전 예제


Go에는 Go 언어로 작성하고 빌드한 바이너리를 고 어셈으로 디스어셈블해 주는 기능이 있습니다.


이 기능만 알면 고 어셈 프로그래밍은 더이상의 설명서 필요 없이 그냥 끝장이네요.


1) 빌드 도중에 고 어셈을 확인하는 커맨드라인 명령어

$ go build -gcflags -S compile_me.go


2) 컴파일된 오브젝트를 고 어셈으로 디스어셈블하는 커맨드라인 명령어

$ go tool compile -S compile_me.go > output.s


3) 링크된 바이너리를 고 어셈으로 디스어셈블하는 커맨드라인 명령어

$ go tool objdump executable_binary > disassembly_output


참고


이상으로 '고 어셈'의 거의 모든 것을 요약해 봤습니다.



  1. 고 어셈블리어는 벨 연구소가 개발하던 "플랜 9"의 어셈블러 문법을 기반으로 탄생했습니다. [본문으로]
Top