Skip to content

Instantly share code, notes, and snippets.

@DQNEO
Last active February 15, 2022 08:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DQNEO/d5eaa60ff9cb17926a9e7a6fab755ea8 to your computer and use it in GitHub Desktop.
Save DQNEO/d5eaa60ff9cb17926a9e7a6fab755ea8 to your computer and use it in GitHub Desktop.
Hello world in low level

Rewriting Hello world into the lowest level.

fmt.Print

package main

import (
	"fmt"
)

func main() {
	fmt.Print("Hello world\n")
}

https://play.golang.org/p/sa0vP_nSS2V

fmt.Fprint

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Fprint(os.Stdout, "Hello world\n")
}

https://play.golang.org/p/0s6y_hWixrc

os.File.Write

package main

import (
	"os"
)

func main() {
	os.Stdout.Write([]byte("Hello world\n"))
}

https://play.golang.org/p/Qu6s4ZnKxA7

syscall.Write

package main

import (
	"syscall"
)

func main() {
	syscall.Write(1, []byte("Hello world\n"))
}

https://play.golang.org/p/yhxwloZUNxK

syscall.Syscall

package main

import (
	"syscall"
	"unsafe"
)

func main() {
	var buf = []byte("Hello world\n")
	syscall.Syscall(1, 1, uintptr(unsafe.Pointer(&buf[0])), 12)
}

https://play.golang.org/p/OjruVhYIY6T

slice -> array

package main

import (
	"syscall"
	"unsafe"
)

func main() {
	var bytes = [6]byte{'H','e','l','l','o','\n'}
	syscall.Syscall(1, 1, uintptr(unsafe.Pointer(&bytes[0])), 6)
}

https://play.golang.org/p/NjDQVNyk-Hd

Assembly exit(0)

-- a.s --
TEXT	main·main(SB),0,$0
	MOVQ	$231, AX
	MOVQ	$0, DI
	SYSCALL
	
-- main.go --
package main
import (
//	"syscall"
//	"unsafe"
)

func main()
//{
//	var bytes = [6]byte{'H','e','l','l','o','\n'}
//	syscall.Syscall(1, 1, uintptr(unsafe.Pointer(&bytes[0])), 6)
//}

https://play.golang.org/p/V_q7p2DJLmg

Assembly Hello

-- a.s --
TEXT	main·main(SB),0,$0

	MOVQ $1, AX // write
	MOVQ $1, DI // stdout
	LEAQ main·bytes(SB), SI // address
	MOVQ $6, DX
	SYSCALL
	
	MOVQ	$231, AX
	MOVQ	$0, DI
	SYSCALL
	
-- main.go --
package main
var bytes = [6]byte{'H','e','l','l','o','\n'}
func main()

https://play.golang.org/p/gG3s8X4PPrJ

Assembly Hello by array

-- a.s --
#define READONLY 8
DATA    array+0(SB)/1, $'H'
DATA    array+1(SB)/1, $'e'
DATA    array+2(SB)/1, $'l'
DATA    array+3(SB)/1, $'l'
DATA    array+4(SB)/1, $'o'
DATA    array+5(SB)/1, $'\n'
GLOBL   array(SB),READONLY, $6

TEXT	main·main(SB),0,$0
	MOVQ $1, AX // write
	MOVQ $1, DI // stdout
	LEAQ array+0(SB), SI // address
	MOVQ $6, DX // len
	SYSCALL

	MOVQ	$231, AX
	MOVQ	$0, DI
	SYSCALL

-- main.go --
package main
func main()

https://play.golang.org/p/ZvWmdbiLX5c

Assembly Hello by array in binary

-- a.s --
#define READONLY 8
DATA    array+0(SB)/1, $0x48
DATA    array+1(SB)/1, $0x65
DATA    array+2(SB)/1, $0x6c
DATA    array+3(SB)/1, $0x6c
DATA    array+4(SB)/1, $0x6f
DATA    array+5(SB)/1, $0x0a
GLOBL   array(SB),READONLY, $6

TEXT	main·main(SB),0,$0
	MOVQ $1, AX // write
	MOVQ $1, DI // stdout
	LEAQ array+0(SB), SI // address
	MOVQ $6, DX // len
	SYSCALL

	MOVQ	$231, AX
	MOVQ	$0, DI
	SYSCALL

-- main.go --
package main
func main()

https://play.golang.org/p/nzoWtT9i9fx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment