74 lines
1.3 KiB
ArmAsm
74 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:
|