compiler-design-eth/HW0/read-write.s

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: