Ready? Set. Go
This commit is contained in:
commit
f2c08962ec
|
@ -0,0 +1 @@
|
|||
bin/
|
|
@ -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 <name>
|
||||
```
|
|
@ -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
|
|
@ -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
|
|
@ -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!"
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue