153 lines
5.3 KiB
Text
153 lines
5.3 KiB
Text
/* ARM assembly AARCH64 Raspberry PI 3B */
|
|
/* program julpanaywhere64.s */
|
|
|
|
/************************************/
|
|
/* Constantes */
|
|
/************************************/
|
|
/* for this file see task include a file in language AArch64 assembly*/
|
|
.include "../includeConstantesARM64.inc"
|
|
|
|
/*********************************/
|
|
/* Initialized data */
|
|
/*********************************/
|
|
.data
|
|
szMessResult: .asciz "loop indice : "
|
|
szMessage1: .asciz "Display to routine call by register\n"
|
|
szMessage2: .asciz "Equal to zero.\n"
|
|
szMessage3: .asciz "Not equal to zero.\n"
|
|
szMessage4: .asciz "loop start\n"
|
|
szMessage5: .asciz "No executed.\n"
|
|
szMessResult1: .asciz ","
|
|
szMessResult2: .asciz "]\n"
|
|
szMessStart: .asciz "Program 64 bits start.\n"
|
|
szCarriageReturn: .asciz "\n"
|
|
|
|
|
|
/*********************************/
|
|
/* UnInitialized data */
|
|
/*********************************/
|
|
.bss
|
|
sZoneConv: .skip 24
|
|
/*********************************/
|
|
/* code section */
|
|
/*********************************/
|
|
.text
|
|
.global main
|
|
main: // entry of program
|
|
ldr x0,qAdrszMessStart
|
|
bl affichageMess // branch and link to routine
|
|
// return here after routine execution
|
|
b label1 // branch unconditional to label
|
|
ldr x0,qAdrszMessage5 // this instruction is never executed
|
|
bl affichageMess // and this
|
|
label1:
|
|
ldr x0,qAdrszMessage4
|
|
bl affichageMess
|
|
mov x20,0
|
|
1:
|
|
mov x0,x20
|
|
ldr x1,qAdrsZoneConv
|
|
bl conversion10 // decimal conversion
|
|
strb wzr,[x1,x0]
|
|
mov x0,#3 // number string to display
|
|
ldr x1,qAdrszMessResult
|
|
ldr x2,qAdrsZoneConv // insert conversion in message
|
|
ldr x3,qAdrszCarriageReturn
|
|
bl displayStrings // display message
|
|
add x20,x20,1 // increment indice
|
|
cmp x20,5
|
|
blt 1b // branch for loop if lower
|
|
|
|
mov x0,0
|
|
cbz x0,2f // jump to label 2 if x0 = 0
|
|
|
|
2:
|
|
adr x1,affichageMess // load routine address in register
|
|
ldr x0,qAdrszMessage1
|
|
blr x1
|
|
|
|
mov x4,4
|
|
cmp x4,10
|
|
bgt 3f // branch if higter
|
|
mov x0,x4
|
|
3:
|
|
mov x0,0b100 // 1 -> bit 2
|
|
tbz x0,2,labzero // if bit 2 equal 0 jump to label
|
|
ldr x0,qAdrszMessage3 // bit 2 <> 0
|
|
bl affichageMess
|
|
b endtest // jump end if else
|
|
labzero: // display if bit equal to 0
|
|
ldr x0,qAdrszMessage2
|
|
bl affichageMess
|
|
endtest:
|
|
mov x0,0b000 // 0 -> bit 2
|
|
tbnz x0,2,4f // if bit 2 <> 0 jump to label
|
|
ldr x0,qAdrszMessage2 // bit 2 = 0
|
|
bl affichageMess
|
|
b 5f // jump end test
|
|
4: // display if bit equal to 1
|
|
ldr x0,qAdrszMessage3
|
|
bl affichageMess
|
|
5:
|
|
|
|
100: // standard end of the program
|
|
mov x0, #0 // return code
|
|
mov x8,EXIT
|
|
svc #0 // perform the system call
|
|
qAdrszCarriageReturn: .quad szCarriageReturn
|
|
qAdrsZoneConv: .quad sZoneConv
|
|
qAdrszMessResult: .quad szMessResult
|
|
qAdrszMessage1: .quad szMessage1
|
|
qAdrszMessage2: .quad szMessage2
|
|
qAdrszMessage3: .quad szMessage3
|
|
qAdrszMessage4: .quad szMessage4
|
|
qAdrszMessage5: .quad szMessage5
|
|
qAdrszMessStart: .quad szMessStart
|
|
|
|
/***************************************************/
|
|
/* display multi strings */
|
|
/***************************************************/
|
|
/* x0 contains number strings address */
|
|
/* x1 address string1 */
|
|
/* x2 address string2 */
|
|
/* x3 address string3 */
|
|
/* other address on the stack */
|
|
/* thinck to add number other address * 4 to add to the stack */
|
|
displayStrings: // INFO: displayStrings
|
|
stp x1,lr,[sp,-16]! // save registers
|
|
stp x2,x3,[sp,-16]! // save registers
|
|
stp x4,x5,[sp,-16]! // save registers
|
|
add fp,sp,#48 // save paraméters address (6 registers saved * 8 bytes)
|
|
mov x4,x0 // save strings number
|
|
cmp x4,#0 // 0 string -> end
|
|
ble 100f // branch to equal or smaller
|
|
mov x0,x1 // string 1
|
|
bl affichageMess
|
|
cmp x4,#1 // number > 1
|
|
ble 100f
|
|
mov x0,x2
|
|
bl affichageMess
|
|
cmp x4,#2
|
|
ble 100f
|
|
mov x0,x3
|
|
bl affichageMess
|
|
cmp x4,#3
|
|
ble 100f
|
|
mov x3,#3
|
|
sub x2,x4,#4
|
|
1: // loop extract address string on stack
|
|
ldr x0,[fp,x2,lsl #3]
|
|
bl affichageMess
|
|
subs x2,x2,#1
|
|
bge 1b
|
|
100:
|
|
ldp x4,x5,[sp],16 // restaur registers
|
|
ldp x2,x3,[sp],16 // restaur registers
|
|
ldp x1,lr,[sp],16 // restaur registers
|
|
ret // return to addtress stored in lr
|
|
|
|
/***************************************************/
|
|
/* ROUTINES INCLUDE */
|
|
/***************************************************/
|
|
/* for this file see task include a file in language AArch64 assembly */
|
|
.include "../includeARM64.inc"
|