go + nasmを使ってみたかったのでサンプルのhello worldを出力してみました。
参考はこちら(12年前の投稿だけど):
バージョンがいろいろ狂っているので、ちょっと直したいところです。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.7 LTS
Release: 16.04
Codename: xenial
$ sudo apt-get -y install golang
$ go version
go version go1.6.2 linux/amd64 #古すぎな
$ sudo apt-get -y install nasm
$ nasm -version
NASM version 2.11.08
$ sudo apt-get -y install gccgo
$ gccgo --version
gccgo (Ubuntu 6.0.1-0ubuntu1) 6.0.0 20160414 (experimental) [trunk revision 234994]
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
確認のために肝心のhello()を2回一応呼び出す。
main.go
package main
func hello();
func main() {
hello()
hello()
}
こちらはhello worldのサンプルでもあるアセンブリファイル
hello.asm
; based on hello.asm from nasm
SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" means "here"
; len is a value, not an address
SECTION .text ; code section
global main.hello ; make label available to linker (Go)
main.hello:
; --- setup stack frame
push rbp ; save old base pointer
mov rbp,rsp ; use stack pointer as new base pointer
; --- print message
mov edx,len ; arg3, length of string to print
mov ecx,msg ; arg2, pointer to string
mov ebx,1 ; arg1, where to write, screen
mov eax,4 ; write sysout command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
; --- takedown stack frame
mov rsp,rbp ; use base pointer as new stack pointer
pop rbp ; get the old base pointer
; --- return
mov rax,0 ; error code 0, normal, no error
ret ; return
Makefileは以下。
main: main.go hello.o
gccgo hello.o main.go -o main
hello.o: hello.asm
nasm -f elf64 -o hello.o hello.asm
以下のように出力されるはず。
$ make
$ ./main
Hello World
Hello World