diff --git a/x86_64/1_stdio.asm b/x86_64/1_stdio.asm new file mode 100644 index 0000000..211c669 --- /dev/null +++ b/x86_64/1_stdio.asm @@ -0,0 +1,51 @@ +global _start + +section .data + str: db "Please give me a string: " ; \n = 0xA + + strSize: equ $ - str + ; $ = current assembler address. + ; Since str is all that is above it must be the size + + stdin: equ 0 ; POSIX + stdout: equ 1 ; POSIX + +; Uninitialized space goes here, pretty much your heap of uninitialized bytes +; for all kinds of purposes +section .bss + strBuffer: resb 64 ; reserve 64 bytes + strBufferSize: equ 64 ; same as above + +; This is where the code goes. Text. Makes sense, right? +section .text +_start: + ; x64 has the syscall function, in contrast to int in x86 and ARM + + ; Write to stdout + mov rax, 1 + mov rdi, stdout ; fd to write to + mov rsi, str ; pointer + mov rdx, strSize ; size + syscall ; all arguments are specified above! (x86 = int 0x80) + + ; Read from stdin + xor rax, rax ; 0 + mov rdi, stdin ; fd to read from + mov rsi, strBuffer ; where to store it + mov rdx, strBufferSize ; maximum number of bytes + syscall + + ; syscall return codes are always stored in register A + ; The number of bytes read in was returned through this + mov rdx, rax + + mov rax, 1 + mov rdi, stdout + mov rsi, strBuffer + syscall + + + ; Exit routine + mov rax, 60 ; 60 is the exit routine + xor rdi, rdi ; our return code (0) + syscall diff --git a/x86_64/makefile b/x86_64/makefile index 7fde932..1c18afe 100644 --- a/x86_64/makefile +++ b/x86_64/makefile @@ -2,13 +2,19 @@ CC = gcc AS = nasm LD = ld +ASSEMBLIES = $(wildcard *.asm) +PROGRAMS = $(patsubst %.asm, bin/%, $(ASSEMBLIES)) + .PHONY: all clean -all: build 0_basic +all: bin build $(PROGRAMS) clean: -rm -r build - -rm 0_basic + -rm -r bin + +bin: + mkdir bin build: mkdir build @@ -16,6 +22,5 @@ build: build/%.o: %.asm $(AS) -g -f elf64 $< -o $@ -0_basic: build/0_basic.o +bin/%: build/%.o $(LD) $< -o $@ -