; Imports:
; Exports:
global _start
section .code code
_start:
; Align stack:
push rax
; Get numbers:
mov ecx, 3
mov rdi, value1
.loop1:
push rcx
push rdi
mov r15, char_buffer ; Save a bit of space.
xor eax, eax
xor edi, edi
mov rsi, r15
mov rdi, 12
syscall
; Convert the string to u32:
; Find the string's length:
; xor eax, eax
; xor r14d, r14d
; mov rsi, r15
; Loop body:
;.loop1_1:
; inc r14d
; lodsb
; test eax, eax
; jz .loop1_1
; dec r14d
; Go through the characters to convert them to an integer:
; mov ecx, r14d
; mov rsi, r15
; add rsi, r14
; dec rsi
; mov r13d, 1
; xor ebx, ebx
; std
;.loop1_2:
; dec r14d
; xor eax, eax
; lodsd
; sub al, '0'
; imul eax, r13d
; add ebx, eax
; imul r13d, r13d, 10
; loop .loop1_2
; cld
; Save the number:
; mov eax, ebx
; stosd
;pop rdi
;pop rcx
;loop .loop1
; Calculate the value:
; Get the smaller candy price:
; mov eax, [rel value3]
; mov ebx, [rel value2]
; cmp ebx, eax
; cmovg ebx, eax ; Assumption: All x64 CPUs support CMOV.
; Divide the amount of money by the candy price:
; xor edx, edx
; mov eax, [rel value1]
; div ebx
; Convert EDX to the value to output:
;sub rsp, 32
;mov ecx, eax ; value
;mov rdx, char_buffer ; buffer
;mov r8d, 12 ; size
;mov r9d, 10 ; radix
;call _itoa_s
;add rsp, 32
; Output the number:
; Prepare index:
mov rsi, char_buffer
; Do it:
;.loop2:
; xor eax, eax
; lodsb
; test eax, eax
; jz .loop2_end
; sub rsp, 32
; mov ecx, eax ; c
; call _putch
; add rsp, 32
; jmp .loop2
;.loop2_end:
; Exit the process:
mov eax, 0x37
syscall
; Static allocations:
section .bss bss
value1: resd 1
value2: resd 1
value3: resd 1
char_buffer: resb 12