Arvorezinha – ARM Assembly
Boas noites!
Venho de novo dar continuação à saga da arvorezinha, desta vez em ARM assembly para Linux. Esta foi relativamente simples, mas também depois de se ter feito em tantos tipos de arches já não há muito a diferir :-P
Aqui segue o código:
.equ SYSCALL_BASE, 0x900000
.equ SYSCALL_EXIT, 1
.equ SYSCALL_WRITE, 4
.text
.align 2
.globl _start
_start:
mov r0,#5 @ total = 5
mov r1,#0 @ counter1 = 0
_ciclo1:
cmp r0,r1 @ compara c1 e tot
beq _exit @ se for igual sai
mov r2,#0 @ counter2 = 0
_ciclo2:
cmp r2,r1 @ compara c1 e c2
beq _estrela @ se for igual _estrela
blt _estrela @ se for menor _estrela
stmfd sp!, {r0-r2} @ guarda r0 a r2 na stack
adr r1,newline @ le \n
bl _print @ imprime
ldmfd sp!, {r0-r2} @ le da stack r0 a r2
add r1,r1,#1 @ incrementa c1
b _ciclo1 @ salta _ciclo1
_estrela:
stmfd sp!, {r0-r2} @ guarda r0 a r2 na stack
adr r1,estrela @ le *
bl _print @ imprime
ldmfd sp!, {r0-r2} @ le da stack r0 a r2
add r2,r2,#1 @ incrementa c2
b _ciclo2 @ salta _ciclo2
_exit:
mov r0,#0 @ resultado e' 0
swi SYSCALL_BASE+SYSCALL_EXIT @ sai
_print:
mov r0,#1 @ 1 == stadout
mov r2,#1 @ tamanho da string
swi SYSCALL_BASE+SYSCALL_WRITE @ imprime
bx r14 @ return
estrela:.string "*"
newline:.string "\n"
E aqui a prova-dos-nove:
:~/arvorezinha-arm$ cat /proc/cpuinfo Processor : XScale-IXP42x Family rev 1 (v5b) BogoMIPS : 266.24 Features : swp half thumb fastmult edsp CPU implementer : 0x69 CPU architecture: 5TE CPU variant : 0x0 CPU part : 0x41f CPU revision : 1 Cache type : undefined 5 Cache clean : undefined 5 Cache lockdown : undefined 5 Cache format : Harvard I size : 32768 I assoc : 32 I line length : 32 I sets : 32 D size : 32768 D assoc : 32 D line length : 32 D sets : 32 Hardware : Linksys NSLU2 Revision : 0000 Serial : 0000000000000000
:~/arvorezinha-arm$ make rm -f arvorezinha.o arvorezinha *~ Using fallback suid method as -o arvorezinha.o arvorezinha.arm.s ld -o arvorezinha arvorezinha.o
:~/arvorezinha-arm$ ./arvorezinha * ** *** **** ***** :~/arvorezinha-arm$
Download do projecto: arvorezinha-arm.tar.
Bela arvorezinha embedded!
Isto faila no Android, pelo menos no Milestone com 2.1 (ARM Cortex A8). Fica em loop infinito.