73 lines
1.3 KiB
ArmAsm
73 lines
1.3 KiB
ArmAsm
.section .data
|
|
inp_buf: .byte 0
|
|
|
|
.section .text
|
|
|
|
.globl main
|
|
# /*; System call to read from standard input into buffer
|
|
# ; eax= code of syscall (read = 3)
|
|
# ; Arguments: ebx= file descriptor (0 is stdin)
|
|
# ; ecx= pointer to buffer
|
|
# ; edx= maximum number of bytes to read
|
|
# ; Return value: eax= number of bytes read*/
|
|
main:
|
|
# Read into buffer
|
|
mov $3, %eax
|
|
mov $0, %ebx
|
|
mov $inp_buf, %ecx
|
|
mov $1, %edx
|
|
int $0x80
|
|
|
|
# Transform from ascii to int
|
|
sub $0x30, (inp_buf)
|
|
|
|
mov (inp_buf), %esi
|
|
|
|
loop:
|
|
# Read new value
|
|
mov $3, %eax
|
|
mov $0, %ebx
|
|
mov $inp_buf, %ecx
|
|
mov $1, %edx
|
|
int $0x80
|
|
# if non number, jump to end
|
|
cmp $0xA, (inp_buf)
|
|
je end
|
|
# Substract 0x30
|
|
sub $0x30, (inp_buf)
|
|
# Multiply esi by 10
|
|
imul $10, %esi
|
|
# Add value to esi
|
|
add (inp_buf), %esi
|
|
jmp loop
|
|
end:# Print result
|
|
|
|
add $1, %esi
|
|
mov %esi, %eax
|
|
|
|
xorl %esi, %esi
|
|
|
|
loop2:
|
|
movl $0, %edx
|
|
movl $10, %ebx
|
|
divl %ebx
|
|
addl $48, %edx
|
|
push %edx
|
|
incl %esi
|
|
cmpl $0, %eax
|
|
jz next
|
|
jmp loop2
|
|
|
|
next:
|
|
cmpl $0, %esi
|
|
jz exit
|
|
decl %esi
|
|
movl $4, %eax
|
|
movl %esp, %ecx
|
|
movl $1, %ebx
|
|
movl $1, %edx
|
|
int $0x80
|
|
addl $4, %esp
|
|
jmp next
|
|
|
|
exit:
|