...
This commit is contained in:
@@ -5,57 +5,8 @@
|
||||
.text
|
||||
.globl _start
|
||||
_start:
|
||||
mov rdi, [rsp] # rdi = argc
|
||||
|
||||
# Calculate the size of the array
|
||||
mov rax, rdi # Start with argc
|
||||
shl rax, 3 # Multiply argc by 8
|
||||
add rax, 8 # Add space for the array size
|
||||
|
||||
# Allocate array size on the stack (aligned to 16 bytes)
|
||||
add rax, 15
|
||||
and rax, -16
|
||||
sub rsp, rax
|
||||
|
||||
# Store number of elements at the start of the array
|
||||
mov [rsp], rdi
|
||||
|
||||
mov rcx, rdi # rcx = loop counter
|
||||
lea rsi, [rsp + rax + 8] # rsi = argv[0]
|
||||
lea rdi, [rsp + 8] # rdi = destination_array[0]
|
||||
|
||||
convert_loop:
|
||||
test rcx, rcx
|
||||
jz done_converting
|
||||
|
||||
# Convert current cstring using nub_cstring_to_string
|
||||
push rcx # Save loop counter
|
||||
push rsi # Save argv[i]
|
||||
push rdi # Save destination_array[i]
|
||||
|
||||
mov rdi, [rsi] # Load current argv[i] (cstring)
|
||||
call nub_cstring_to_string
|
||||
|
||||
pop rdi # Restore destination pointer
|
||||
pop rsi # Restore argv pointer
|
||||
pop rcx # Restore loop counter
|
||||
|
||||
test rax, rax
|
||||
jz conversion_failed
|
||||
|
||||
# Store converted string pointer in our array
|
||||
mov [rdi], rax # Store converted string pointer
|
||||
add rdi, 8 # Move to next destination_array entry
|
||||
add rsi, 8 # Move to next argv entry
|
||||
dec rcx # Decrement counter
|
||||
jmp convert_loop
|
||||
|
||||
done_converting:
|
||||
mov rdi, rsp
|
||||
call main
|
||||
mov rdi, rax
|
||||
mov rax, SYS_EXIT
|
||||
syscall
|
||||
|
||||
conversion_failed:
|
||||
call nub_panic
|
||||
|
||||
Reference in New Issue
Block a user