├── .gitignore ├── Makefile ├── README.md ├── loop.asm ├── name.asm ├── square.asm └── triangle.asm /.gitignore: -------------------------------------------------------------------------------- 1 | my-asm.o 2 | a.out 3 | name.o 4 | loop.o -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | loop: loop.asm 2 | nasm -f macho64 -o loop.o loop.asm && ld loop.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie && ./a.out && rm a.out && rm loop.o 3 | 4 | name: name.asm 5 | nasm -f macho64 -o name.o name.asm && ld name.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie && ./a.out && rm a.out && rm name.o 6 | 7 | triangle: triangle.asm 8 | nasm -f macho64 -o triangle.o triangle.asm && ld triangle.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie && ./a.out && rm a.out && rm triangle.o 9 | 10 | square: square.asm 11 | nasm -f macho64 -o square.o square.asm && ld square.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie && ./a.out && rm a.out && rm square.o 12 | 13 | buildname: name.asm 14 | nasm -f macho64 -o name.o name.asm && ld name.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie 15 | 16 | buildloop: 17 | nasm -f macho64 -o loop.o loop.asm && ld loop.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie 18 | 19 | buildtriangle: 20 | nasm -f macho64 -o triangle.o triangle.asm && ld triangle.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie 21 | 22 | buildsquare: 23 | nasm -f macho64 -o square.o square.asm && ld square.o -o a.out -macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Learning some x86_64 asm for macos (this is macos syscalls so not compatible with linux) 2 | 3 | Running 4 | 5 | Name.asm 6 | 7 | ```shell 8 | make name 9 | ``` 10 | 11 | Loop.asm 12 | 13 | ```shell 14 | make loop 15 | ``` -------------------------------------------------------------------------------- /loop.asm: -------------------------------------------------------------------------------- 1 | global _main 2 | section .text 3 | 4 | %define WRITE 0x2000004 5 | %define EXIT 0x2000001 6 | %define ENDL 10 7 | 8 | print: 9 | mov rax, WRITE 10 | mov rdi, 1 11 | syscall 12 | ret 13 | 14 | exit: 15 | mov rax, EXIT 16 | xor rdi, rdi 17 | syscall 18 | 19 | _main: 20 | mov r8, 10 21 | mov r9, 1 22 | 23 | start_loop: 24 | cmp r8, r9 25 | jle exit_loop 26 | 27 | mov rsi, x 28 | mov rdx, x.len 29 | call print 30 | 31 | inc r9 32 | jmp start_loop 33 | 34 | exit_loop: 35 | mov rsi, second 36 | mov rdx, second.len 37 | call print 38 | 39 | call exit 40 | 41 | section .data 42 | x: db "Inside of the loop", ENDL 43 | .len: equ $ - x 44 | numberFormat: db '%d', 10, 0 45 | 46 | second: db "Out of the loop now", ENDL 47 | .len: equ $ - second -------------------------------------------------------------------------------- /name.asm: -------------------------------------------------------------------------------- 1 | ; Syscall docs I used: https://opensource.apple.com/source/xnu/xnu-1228.0.2/bsd/kern/syscalls.c.auto.html 2 | ; https://github.com/apple/darwin-xnu/blob/main/bsd/kern/syscalls.master 3 | 4 | global _main 5 | section .text 6 | 7 | %define WRITE 0x2000004 8 | %define READ 0x2000003 9 | %define EXIT 0x2000001 10 | 11 | _print: 12 | mov rax, WRITE 13 | mov rdi, 1 14 | syscall 15 | ret 16 | 17 | _read: 18 | mov rax, READ 19 | mov rdi, 0 20 | mov rdx, 256 21 | syscall 22 | ret 23 | 24 | _main: 25 | mov rsi, question 26 | mov rdx, question.len 27 | call _print 28 | 29 | mov rsi, name 30 | call _read 31 | 32 | mov rsi, response 33 | mov rdx, response.len 34 | call _print 35 | 36 | mov rsi, name 37 | mov rdx, 256 38 | call _print 39 | 40 | call _exit 41 | 42 | _exit: 43 | mov rax, EXIT 44 | xor rdi, rdi ; can also do `mov rdi, 0`, if want a 1 exit code then `mov rdi, 1` 45 | syscall 46 | 47 | section .data 48 | question: db "What is your name?", 10, "> " 49 | question.len: equ $ - question 50 | response: db "Hello " 51 | response.len: equ $ - response 52 | 53 | section .bss 54 | name resb 255 55 | 56 | ; Some understanding ive gained 57 | 58 | ; rdi rsi rdx rcx r8 r9 are used instead of stack on machos 59 | 60 | ; syscall value determined by rax register 61 | ; rax is the syscall number (on macos syscalls begin with 20 million or 0x2000000) 62 | ; 0x2000004 is a write syscall 63 | ; rdi is the write location, 1 being stdout 64 | ; $ is location of len, str is location of hello world 65 | ; $ - str is the relative position of len minus str which will give the length of the string 66 | ; 0x2000001 is the code for exit 67 | ; xor rdi, rdi is exlusive-or ie if the two values are the same it will return zero otherwise it will return 1 68 | ; rdi, rsi, rdx are arguments for syscalls 69 | -------------------------------------------------------------------------------- /square.asm: -------------------------------------------------------------------------------- 1 | global _main 2 | section .text 3 | _main: 4 | mov rdx, output 5 | mov r8, 20 6 | mov r9, 0 7 | 8 | mov r10, 9 9 | mov r11, 0 10 | 11 | setup_hor: 12 | mov r8, 20 13 | mov r9, 0 14 | call horizontal 15 | 16 | horizontal: 17 | mov byte [rdx], '*' 18 | inc rdx 19 | inc r9 20 | cmp r9, r8 21 | jne horizontal 22 | 23 | mov byte [rdx], 10 24 | inc rdx 25 | 26 | inc r11 27 | cmp r11, 10 28 | jne setup_hor 29 | 30 | done: 31 | mov rax, 0x2000004 32 | mov rdi, 1 33 | mov rsi, output 34 | mov rdx, output.len 35 | syscall 36 | 37 | call _exit 38 | 39 | _exit: 40 | mov rax, 0x2000001 41 | xor rdi, rdi 42 | syscall 43 | 44 | section .bss 45 | output: resb 210 46 | .len: equ 210 47 | -------------------------------------------------------------------------------- /triangle.asm: -------------------------------------------------------------------------------- 1 | global _main 2 | section .text 3 | _main: 4 | mov rdx, output 5 | mov r8, 1 6 | mov r9, 0 7 | line: 8 | mov byte [rdx], '*' 9 | inc rdx 10 | inc r9 11 | cmp r9, r8 12 | jne line 13 | lineDone: 14 | mov byte [rdx], 10 15 | inc rdx 16 | inc r8 17 | mov r9, 0 18 | cmp r8, linewidth 19 | jng line 20 | done: 21 | mov rax, 0x2000004 22 | mov rdi, 1 23 | mov rsi, output 24 | mov rdx, outputsize 25 | syscall 26 | 27 | mov rax, 0x2000001 28 | xor rdi, rdi 29 | syscall 30 | 31 | section .bss 32 | linewidth: equ 8 33 | outputsize: equ 44 34 | output: resb outputsize 35 | --------------------------------------------------------------------------------