commit f2c08962ec03c43ed8e303de69a14643690fe83d Author: parys Date: Fri Jan 26 12:54:07 2024 +0100 Ready? Set. Go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..774bbc9 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Simple programs written in x86-64 asm as an learning exercises + +## Requirements + +- [yasm](https://yasm.tortall.net/) +- [ld](https://www.gnu.org/software/binutils/) + +## Compiling + +``` +$ ./build.sh +``` diff --git a/addcarry.asm b/addcarry.asm new file mode 100644 index 0000000..805b175 --- /dev/null +++ b/addcarry.asm @@ -0,0 +1,46 @@ +section .data + +global print +print: + mov rsi, 0 + +iter: + mov al, byte [rdi + rsi] + inc rsi + cmp al, 0 + jne iter + + dec rsi + + mov rdx, rsi + mov rsi, rdi + mov rax, 1 + mov rdi, 1 + syscall + + mov rax, 0 + + ret + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +var1 ddq 0x1A000000000000000 +var2 ddq 0x2C000000000000000 +sum ddq 0 + +section .text +global _start +_start: + mov rax, qword [var1] + mov rdx, qword [var1 + 8] + + add rax, qword [var2] + adc rdx, qword [var2 + 8] + + mov qword [sum] , rax + mov qword 8[sum], rdx + + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/addfloats.asm b/addfloats.asm new file mode 100644 index 0000000..406136a --- /dev/null +++ b/addfloats.asm @@ -0,0 +1,23 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +x dd 3.4 +y dd 3.5 +var dd 0.0 + +section .text +global _start +_start: + movss xmm0, dword [x] + movss xmm1, dword [y] + + addss xmm0, xmm1 + + movss dword [var], xmm0 + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..8b8abd6 --- /dev/null +++ b/build.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +create_bin="n" + +set -e + +if [ ! $1 ]; then + echo "Provide a filename to compile!" + exit 1 +fi + +if [ ! -f $1.asm ]; then + echo "Provided filename doesn't corespond to an exisitng file!" + exit 1 +fi + +if [ ! -d "./bin/" ]; then + echo "bin directory doesn't exist" + + read -p "Should I create one? (y/N) " create_bin + + if [ ! $create_bin ]; then + exit 1 + fi + + if [ $create_bin = "y" ]; then + mkdir bin + else + exit 1 + fi +fi + +cd bin + +if [ -d "$1" ]; then + cd $1 +else + mkdir $1 && cd $1 +fi + +yasm -Worphan-labels -g dwarf2 -f elf64 ../../$1.asm -o $1.o -l $1.lst +ld -g -o $1 $1.o + +echo "Compilation successful!" diff --git a/execaprogram.asm b/execaprogram.asm new file mode 100644 index 0000000..0fadf19 --- /dev/null +++ b/execaprogram.asm @@ -0,0 +1,23 @@ +section .data + +NULL equ 0 + +newline db 10, NULL +newline_size equ $-newline + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +progName db "/bin/sh", NULL + +section .text +global _start +_start: + mov rax, 59 + mov rdi, progName + syscall + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/howmanyargs.asm b/howmanyargs.asm new file mode 100644 index 0000000..5a86915 --- /dev/null +++ b/howmanyargs.asm @@ -0,0 +1,26 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +argc db 0, 0 + +section .text +global _start +_start: + pop r8 + add r8, 0x30 + + mov byte [argc], r8b + mov byte [argc + 1], 10 + + mov rax, 1 + mov rdi, 1 + mov rsi, argc + mov rdx, 2 + syscall + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/loop.asm b/loop.asm new file mode 100644 index 0000000..d99dd11 --- /dev/null +++ b/loop.asm @@ -0,0 +1,25 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +iter_cnt db 10 +sum dw 0 + +section .text +global _start +_start: + mov cl, byte [iter_cnt] + mov ax, 2 + +iter: + add word [sum], ax + shl ax, 1 + dec cl + cmp cl, 0 + jne iter + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/main.asm b/main.asm new file mode 100644 index 0000000..c25653e --- /dev/null +++ b/main.asm @@ -0,0 +1,18 @@ +section .data + +NULL equ 0 + +newline db 10, NULL +newline_size equ $-newline + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +section .text +global _start +_start: + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/mul.asm b/mul.asm new file mode 100644 index 0000000..63dce2a --- /dev/null +++ b/mul.asm @@ -0,0 +1,19 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +result dw 0 + +section .text +global _start +_start: + mov al, 0x05 + mov bl, 0x04 + imul bl + mov word [result], ax + + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall + diff --git a/printanumber.asm b/printanumber.asm new file mode 100644 index 0000000..5f7845b --- /dev/null +++ b/printanumber.asm @@ -0,0 +1,65 @@ +section .data + +NULL equ 10 +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +num dd 1234567 +num_len db 0 + +section .bss + +string resb 255 + +section .text +global _start +_start: + mov eax, dword [num] + mov r10d, 10 + mov rbx, 0 + +iter0: + mov rdx, 0 + div r10d + inc byte [num_len] + cmp ax, 0 + jne iter0 + + mov rbx, 0 + mov rax, 0 + mov rsi, 0 + mov cl, [num_len] + mov eax, dword [num] + +iter1: + mov rdx, 0 + div r10d + add edx, 0x30 + push rdx + inc rsi + loop iter1 + + mov cl, [num_len] + mov bl, [num_len] + inc bl + mov rsi, 0 + +iter2: + mov rdx, 0 + pop rdx + mov byte [string + rsi], dl + inc rsi + loop iter2 + + mov byte [string + rsi], NULL + + mov rax, 1 + mov rdi, 1 + mov rsi, string + movzx rdx, bl + syscall + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/printcliargs.asm b/printcliargs.asm new file mode 100644 index 0000000..7fbe51a --- /dev/null +++ b/printcliargs.asm @@ -0,0 +1,70 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +newline db 10 +newline_sz equ $-newline + +arge db "Not enough arguments!", 10 +arge_size equ $-arge + +section .text +global _start +_start: + + pop rax + mov r8, rax + mov r9, 0 + cmp rax, 2 + jb print_error + + pop rax + dec r8 + +_loop0: + pop rax + mov rdx, 0 + +_loop1: + mov bl, [rax + rdx] + inc rdx + cmp bl, 0 + jne _loop1 + + mov r10, rax + dec rdx + + mov rax, 1 + mov rdi, 1 + mov rsi, r10 + syscall + + mov rcx, 0 + mov rdx, 0 + mov r11, 0 + + mov rax, 1 + mov rdi, 1 + mov rsi, newline + mov rdx, newline_sz + syscall + + mov rdx, 0 + + inc r9 + cmp r8, r9 + jne _loop0 + jmp exit + +print_error: + mov rax, 1 + mov rdi, 1 + mov rsi, arge + mov rdx, arge_size + syscall + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/printfuncandmacro.asm b/printfuncandmacro.asm new file mode 100644 index 0000000..c984bda --- /dev/null +++ b/printfuncandmacro.asm @@ -0,0 +1,78 @@ +%macro printl 2 + push rax + push rdi + push rsi + push rdx + push r11 + + mov rax, 1 + mov rdi, 1 + mov rsi, %1 + mov rdx, %2 + syscall + + pop r11 + pop rdx + pop rsi + pop rdi + pop rax +%endmacro + +global print +print: + mov rsi, 0 + +iter: + mov al, byte [rdi + rsi] + inc rsi + cmp al, 0 + jne iter + + dec rsi + + mov rdx, rsi + mov rsi, rdi + mov rax, 1 + mov rdi, 1 + syscall + + mov rax, 0 + + ret + +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +newline db 10, 0 +newline_size equ $-newline + +msg db "TEST", 0 +msg_len equ $-msg + +msg2 db "LOLOLLMAOLLLL L L L MDR", 0 +msg2_len equ $-msg2 + +section .bss + +input_size equ 255 +input resb input_size + +section .text +global _start +_start: + printl msg, msg_len + + printl newline, newline_size + + mov rdi, msg2 + call print + + mov rdi, newline + call print + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/sdivandrem.asm b/sdivandrem.asm new file mode 100644 index 0000000..f5e6e51 --- /dev/null +++ b/sdivandrem.asm @@ -0,0 +1,24 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +var db 1 +res db 0 + +section .text +global _start +_start: + mov eax, dword [var] + cdq + mov ebx, 17 + idiv ebx + mov dword [res], eax + add ebx, edx + mov dword [rem], ebx + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall + diff --git a/signedmul.asm b/signedmul.asm new file mode 100644 index 0000000..3d94e83 --- /dev/null +++ b/signedmul.asm @@ -0,0 +1,27 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +var1 dw 1200 +var2 dw -2000 +isum dw 0 +vsum dd 0 + +section .text +global _start +_start: + mov ax, word [var1] + imul ax, -13 + mov word [isum], ax + + mov ax, word [var1] + imul word [var2] + mov word [vsum], ax + mov word [vsum + 2], dx + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall + diff --git a/simplefunction.asm b/simplefunction.asm new file mode 100644 index 0000000..cf6d2f9 --- /dev/null +++ b/simplefunction.asm @@ -0,0 +1,39 @@ +global print +print: + push rax + push rdi + + mov rax, 1 + mov rdi, 1 + syscall + + pop rdi + pop rax + ret + +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +newline db 10 +newline_size equ $-newline + +msg db "TEST" +msg_len equ $-msg + +section .text +global _start +_start: + mov rsi, msg + mov rdx, msg_len + call print + + mov rsi, newline + mov rdx, newline_size + call print + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/sumlist.asm b/sumlist.asm new file mode 100644 index 0000000..79bb74b --- /dev/null +++ b/sumlist.asm @@ -0,0 +1,37 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +list dd 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 +list_len equ $-list +sum dd 0 +bsn db 10 + +section .text +global _start +_start: + mov rsi, 0 + mov rbx, list_len + shr rbx, 2 +iter: + mov eax, dword [list + (rsi * 4)] + add dword [sum], eax + inc rsi + cmp rsi, rbx + jne iter + + mov rax, 1 + mov rsi, sum + mov rdx, 1 + syscall + + mov rax, 1 + mov rsi, bsn + mov rdx, 1 + syscall + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall diff --git a/udivwithrem.asm b/udivwithrem.asm new file mode 100644 index 0000000..ca9ab65 --- /dev/null +++ b/udivwithrem.asm @@ -0,0 +1,24 @@ +section .data + +EXIT_SUCCESS equ 0 +SYS_EXIT equ 60 + +var db 70 +divisor db 3 +res db 0 +rem db 0 + +section .text +global _start +_start: + mov ax, 0 + mov al, byte [var] + div byte [divisor] + mov byte [res], al + mov byte [rem], ah + +exit: + mov rax, SYS_EXIT + mov rdi, EXIT_SUCCESS + syscall +