55 lines
2.0 KiB
Plaintext
55 lines
2.0 KiB
Plaintext
/* ARM assembly Raspberry PI */
|
|
/* program namepgm.s */
|
|
/* Constantes */
|
|
.equ STDOUT, 1
|
|
.equ WRITE, 4
|
|
.equ EXIT, 1
|
|
/* Initialized data */
|
|
.data
|
|
szMessage: .asciz "Program : " @
|
|
szRetourLigne: .asciz "\n"
|
|
|
|
|
|
.text
|
|
.global main
|
|
main:
|
|
push {fp,lr} /* save des 2 registres */
|
|
add fp,sp,#8 /* fp <- adresse début */
|
|
ldr r0, iAdrszMessage @ adresse of message
|
|
bl affichageMess @ call function
|
|
ldr r0,[fp,#4] @ recup name of program in command line
|
|
bl affichageMess @ call function
|
|
ldr r0, iAdrszRetourLigne @ adresse of message
|
|
bl affichageMess @ call function
|
|
|
|
/* fin standard du programme */
|
|
mov r0, #0 @ return code
|
|
pop {fp,lr} @restaur des 2 registres
|
|
mov r7, #EXIT @ request to exit program
|
|
swi 0 @ perform the system call
|
|
iAdrszMessage: .int szMessage
|
|
iAdrszRetourLigne: .int szRetourLigne
|
|
/******************************************************************/
|
|
/* affichage des messages avec calcul longueur */
|
|
/******************************************************************/
|
|
/* r0 contient l adresse du message */
|
|
affichageMess:
|
|
push {fp,lr} /* save des 2 registres */
|
|
push {r0,r1,r2,r7} /* save des autres registres */
|
|
mov r2,#0 /* compteur longueur */
|
|
1: /*calcul de la longueur */
|
|
ldrb r1,[r0,r2] /* recup octet position debut + indice */
|
|
cmp r1,#0 /* si 0 c est fini */
|
|
beq 1f
|
|
add r2,r2,#1 /* sinon on ajoute 1 */
|
|
b 1b
|
|
1: /* donc ici r2 contient la longueur du message */
|
|
mov r1,r0 /* adresse du message en r1 */
|
|
mov r0,#STDOUT /* code pour écrire sur la sortie standard Linux */
|
|
mov r7, #WRITE /* code de l appel systeme "write" */
|
|
swi #0 /* appel systeme */
|
|
pop {r0,r1,r2,r7} /* restaur des autres registres */
|
|
pop {fp,lr} /* restaur des 2 registres */
|
|
bx lr /* retour procedure */
|
|
|