Setup part2
This commit is contained in:
parent
535d60ca2b
commit
bb8e67addf
|
|
@ -0,0 +1,3 @@
|
|||
main: main.asm
|
||||
nasm -g -f elf64 -o main.out main.asm
|
||||
gcc -g -no-pie -nostartfiles -o main main.out
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,315 @@
|
|||
default rel
|
||||
extern printf
|
||||
|
||||
global exitcode
|
||||
|
||||
section .data
|
||||
buf: dq 0
|
||||
dbuf: dw 0
|
||||
path: db "./input.txt", 0
|
||||
nb_lines: dw 1000
|
||||
|
||||
fmt: db "Value %s: %d", 10, 0
|
||||
|
||||
fd_str: db "file descriptor", 0
|
||||
close_str: db "close", 0
|
||||
content_str: db "Content: '%s'", 10, 0
|
||||
nbr_str: db "number", 0
|
||||
exitcode: dw 0
|
||||
|
||||
|
||||
|
||||
section .text
|
||||
|
||||
global _start
|
||||
|
||||
|
||||
printvalue:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
sub rsp, 8H
|
||||
|
||||
;; args
|
||||
mov dword [rbp-8H], edi
|
||||
mov dword [rbp-4H], esi
|
||||
|
||||
;; printf
|
||||
xor rax, rax
|
||||
lea rdi, [fmt] ; format
|
||||
mov esi, dword [rbp-8H] ; arg1
|
||||
mov edx, dword [rbp-4H] ; arg2
|
||||
call printf
|
||||
|
||||
;; leave
|
||||
mov rsp, rbp
|
||||
pop rbp
|
||||
ret
|
||||
;; End of printvalue
|
||||
|
||||
readval:
|
||||
;; rdi: FILE DESCRIPTOR
|
||||
;; rsi: offset
|
||||
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
sub rsp, 16H
|
||||
|
||||
mov qword [rbp-8H], rsi
|
||||
mov qword [rbp-16H], rdi
|
||||
|
||||
;; sys_read
|
||||
mov rax, 0 ; sys_read
|
||||
;; rdi has already file descriptor
|
||||
mov rdi, qword [rbp-16H]
|
||||
mov rsi, buf
|
||||
mov rdx, 5H
|
||||
syscall
|
||||
|
||||
;; Go to the next number
|
||||
mov rax, 8 ; sys_lseek
|
||||
mov rdi, qword [rbp-16H] ; fd
|
||||
mov rsi, qword [rbp-8H] ; advance by n chars
|
||||
mov rdx, 1 ; origin
|
||||
syscall
|
||||
|
||||
;; convert buf to an int
|
||||
xor ebx, ebx
|
||||
mov esi, buf
|
||||
mov ecx, 5
|
||||
|
||||
.next_digit:
|
||||
movzx eax, byte [esi]
|
||||
inc rsi
|
||||
sub al, '0' ; convert ascii to number (remove offset of the 0 digit)
|
||||
imul ebx, 10
|
||||
add ebx, eax ; rbx = rbx*10 + rax
|
||||
loop .next_digit ; loop until ecx = 0
|
||||
|
||||
xor rax, rax
|
||||
mov eax, ebx
|
||||
|
||||
mov rsp, rbp
|
||||
pop rbp
|
||||
ret
|
||||
;; end of readval1
|
||||
|
||||
|
||||
popmin:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
sub rsp, 22H
|
||||
|
||||
;; 8H, 0 -> min value address
|
||||
;; 12H, 8H -> min value
|
||||
;; 14H, 12H -> loop counter
|
||||
;; 22H, 14H : current address
|
||||
|
||||
;; rdi: list effective address
|
||||
mov qword [rbp-8H], rdi
|
||||
mov qword [rbp-22H], rdi ; current address
|
||||
|
||||
mov esi, [rdi]
|
||||
mov dword [rbp-12H], esi
|
||||
|
||||
mov ecx, 1000
|
||||
minloop:
|
||||
mov word [rbp-14H], cx
|
||||
|
||||
mov r9, qword [rbp-22H]
|
||||
mov edi, [r9] ; current value
|
||||
mov esi, dword [rbp-12H] ; min value
|
||||
|
||||
cmp esi, 0
|
||||
je updatemin
|
||||
|
||||
cmp edi, 0
|
||||
je next ; skip zeroes
|
||||
|
||||
cmp edi, esi
|
||||
jle updatemin
|
||||
jmp next
|
||||
|
||||
updatemin:
|
||||
mov r9, qword [rbp-22H]
|
||||
mov dword [rbp-12H], edi
|
||||
mov qword [rbp-8H], r9
|
||||
|
||||
next:
|
||||
mov r9, qword [rbp-22H]
|
||||
add r9, 4H
|
||||
mov qword [rbp-22H], r9
|
||||
|
||||
dec cx
|
||||
jnz minloop
|
||||
|
||||
mov rax, qword [rbp-8H]
|
||||
mov dword [rax], 0H
|
||||
mov eax, dword [rbp-12H]
|
||||
|
||||
mov rsp, rbp
|
||||
pop rbp
|
||||
ret
|
||||
|
||||
|
||||
_start:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
sub rsp, 2000H
|
||||
|
||||
;; 8H -> 0 : file_descriptor
|
||||
;; 12H -> 8H : buffer for readvalue
|
||||
;; 14H -> 12H : current line
|
||||
;; 19H -> 17H: read loop counter
|
||||
;; 2000H -> 1060H : list 1 (1000 digits of 4 bytes)
|
||||
;; 1000H -> 60H : list 2
|
||||
|
||||
|
||||
mov rax, 2 ; sys_open
|
||||
lea rdi, [path]
|
||||
xor rsi, rsi
|
||||
xor rdx, rdx
|
||||
syscall
|
||||
|
||||
;; store file descriptor
|
||||
mov qword [rbp-8H], rax
|
||||
|
||||
;; print file descriptor
|
||||
lea rdi, [fd_str]
|
||||
mov rsi, rax
|
||||
call printvalue
|
||||
|
||||
;; exit if open failed
|
||||
cmp dword [rbp-8H], 0
|
||||
jl exit
|
||||
|
||||
mov word [rbp-14H], 0H ; line number
|
||||
|
||||
mov cx, [nb_lines] ; number of lines
|
||||
loop0:
|
||||
mov [rbp-19H], cx ; store loop counter
|
||||
|
||||
;; read the 1st value
|
||||
mov rdi, qword [rbp-8H]
|
||||
mov rsi, 3H ; mov to the second number
|
||||
call readval
|
||||
|
||||
; store the read value
|
||||
mov [dbuf], eax
|
||||
|
||||
;; calculate list position
|
||||
xor rax, rax
|
||||
mov ax, word [rbp-14H]
|
||||
mov bx, 4H
|
||||
mul bx
|
||||
;; 14H -> 12H : line counter
|
||||
mov rbx, 2000H
|
||||
sub rbx, rax
|
||||
mov r9, rbp
|
||||
sub r9, rbx
|
||||
|
||||
; move the value to its position
|
||||
mov eax, [dbuf]
|
||||
mov dword [r9], eax
|
||||
|
||||
;; read the 2nd value
|
||||
mov rdi, qword [rbp-8H]
|
||||
mov rsi, 1H ; mov to the next line
|
||||
call readval
|
||||
|
||||
; store the read value
|
||||
mov [dbuf], eax
|
||||
|
||||
;; calculate list position
|
||||
xor rax, rax
|
||||
mov ax, word [rbp-14H]
|
||||
mov bx, 4H
|
||||
mul bx
|
||||
mov rbx, 1000H
|
||||
sub rbx, rax
|
||||
mov r9, rbp
|
||||
sub r9, rbx
|
||||
|
||||
; move the value to its position
|
||||
mov eax, [dbuf]
|
||||
mov dword [r9], eax
|
||||
|
||||
xor rax, rax
|
||||
mov ax, word [rbp-14H]
|
||||
inc ax
|
||||
mov word [rbp-14H], ax
|
||||
|
||||
mov cx, [rbp-19H] ; restore loop counter
|
||||
dec cx
|
||||
jnz loop0
|
||||
|
||||
mov qword [rbp-42H], 0 ; sum = 0
|
||||
|
||||
mov ecx, 1000
|
||||
sumloop:
|
||||
mov word [rbp-19H], cx
|
||||
|
||||
;; 50H - 46H : min1
|
||||
;; 46H - 42H : min2
|
||||
;; 42H - 34H : sum
|
||||
|
||||
lea rdi, [rbp-2000H]
|
||||
call popmin
|
||||
mov dword [rbp-50H], eax
|
||||
|
||||
lea rdi, [rbp-1000H]
|
||||
call popmin
|
||||
mov dword [rbp-46H], eax
|
||||
|
||||
xor rax, rax
|
||||
mov eax, dword [rbp-50H]
|
||||
mov ebx, dword [rbp-46H]
|
||||
|
||||
cmp eax, ebx
|
||||
jge a
|
||||
jmp b
|
||||
|
||||
a:
|
||||
sub eax, ebx
|
||||
jmp sum
|
||||
|
||||
b:
|
||||
sub ebx, eax
|
||||
mov eax, ebx
|
||||
jmp sum
|
||||
|
||||
sum:
|
||||
mov rbx, qword [rbp-42H]
|
||||
add rbx, rax
|
||||
mov qword [rbp-42H], rbx
|
||||
|
||||
mov cx, word [rbp-19H]
|
||||
dec cx
|
||||
cmp cx, 0
|
||||
jnz sumloop
|
||||
|
||||
|
||||
;; print sys_close result
|
||||
lea rdi, [nbr_str]
|
||||
mov rsi, qword [rbp-42H]
|
||||
call printvalue
|
||||
|
||||
|
||||
|
||||
close_file:
|
||||
;; sys_close
|
||||
mov rax, 3 ; sys_close
|
||||
mov edi, dword [rbp-8H]
|
||||
syscall
|
||||
|
||||
;; print sys_close result
|
||||
lea rdi, [close_str]
|
||||
mov rsi, rax
|
||||
call printvalue
|
||||
|
||||
|
||||
exit:
|
||||
;; EXIT
|
||||
mov rax, 60 ; sys_exit
|
||||
mov rdi, [exitcode]
|
||||
syscall
|
||||
|
||||
Loading…
Reference in New Issue