RosettaCodeData/Task/Conditional-structures/AArch64-Assembly/conditional-structures.aarch64

220 lines
6.9 KiB
Plaintext

/* ARM assembly AARCH64 Raspberry PI 3B */
/* program condstr64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
/*******************************************/
/* Initialized data */
/*******************************************/
.data
szMessTest1: .asciz "The test 1 is equal.\n"
szMessTest1N: .asciz "The test 1 is not equal.\n"
szMessTest1A: .asciz "The test 1A is equal.\n"
szMessTest1AN: .asciz "The test 1A is not equal.\n"
szMessTest2: .asciz "The test 2 is equal.\n"
szMessTest2N: .asciz "The test 2 is not equal.\n"
szMessTest3: .asciz "The test 3 is <.\n"
szMessTest3N: .asciz "The test 3 is >.\n"
szMessTest4: .asciz "The test 4 is <=.\n"
szMessTest4N: .asciz "The test 4 is >.\n"
szMessTest5: .asciz "The test 5 is negative.\n"
szMessTest5N: .asciz "The test 5 is positive ou equal 0.\n"
szMessTest6: .asciz "Test 6 : carry is off.\n"
szMessTest6N: .asciz "Test 6 : carry is set.\n"
szMessTest7: .asciz "Test 7 : no overflow.\n"
szMessTest7N: .asciz "Test 7 : overflow.\n"
szMessTest8: .asciz "Test 8 : then.\n"
szMessTest8N: .asciz "Test 8 : else.\n"
szMessResult: .asciz "Test result = @ \n"
/*******************************************/
/* UnInitialized data */
/*******************************************/
.bss
sZoneConv: .skip 30
/*******************************************/
/* code section */
/*******************************************/
.text
.global main
main: // entry of program
// classic test equal zero, not equal zero
//mov x1,0 // comments
mov x1,1 // or uncomments
cmp x1,0 // structure if else
bne 1f
ldr x0,qAdrszMessTest1 // if equal
b 2f
1:
ldr x0,qAdrszMessTest1N // else
2:
bl affichageMess
mov x1,0 // comments
//mov x1,1 // or uncomments
cbnz x1,3f // other test and branch if not zero
ldr x0,qAdrszMessTest1A
b 4f
3:
ldr x0,qAdrszMessTest1AN
4:
bl affichageMess
// test equal 5, not equal 5
//mov x1,#5
mov x1,10
cmp x1,5
bne 5f
ldr x0,qAdrszMessTest2
b 6f
5:
ldr x0,qAdrszMessTest2N
6:
bl affichageMess
// test < 5, > 5 SIGNED
mov x1,#-10
//mov x1,#10
cmp x1,#5
bgt 7f
ldr x0,qAdrszMessTest3
b 8f
7:
ldr x0,qAdrszMessTest3N
8:
bl affichageMess
// test < 5, > 5 UNSIGNED
//mov x1,#-10
mov x1,#2
cmp x1,#5
bhi 9f
ldr x0,qAdrszMessTest4
b 10f
9:
ldr x0,qAdrszMessTest4N
10:
bl affichageMess
// test < 0, > 0
mov x1,2
subs x1,x1,5 // s --> flags
bpl 11f
ldr x0,qAdrszMessTest5
b 12f
11:
ldr x0,qAdrszMessTest5N
12:
bl affichageMess
// carry off carry on
//mov x1,#-10 // for carry set
//mov x1,#10 // for carry off
mov x1,(2<<62) - 1 // for carry off
adds x1,x1,20 // s --> flags
bcs 13f
ldr x0,qAdrszMessTest6 // carry clear
b 14f
13:
ldr x0,qAdrszMessTest6N // carry set
14:
bl affichageMess
// overflow off overflow on
//mov x1,#-10 // for not overflow
//mov x1,#10 // for not overflow
mov x1,(2<<62) - 1 // for overflow
adds x1,x1,20 // s --> flags
bvs 15f
ldr x0,qAdrszMessTest7 // overflow off
b 16f
15:
ldr x0,qAdrszMessTest7N // overflow on
16:
bl affichageMess
// other conditionnel test csel
mov x2,-20
mov x3,25
mov x1,10 // for equal
//mov x1,#20 // for else
cmp x1,10
csel x0,x2,x3,eq // if x1=10 x0 = x2 else x0 = x3
ldr x1,qAdrsZoneConv
bl conversion10S
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at @ character
bl affichageMess
// other conditionnel test cset
//mov x1,10 // for equal
mov x1,20 // for else
cmp x1,10
cset x0,eq // if x1=10 x0 = 1 else x0 = 0
ldr x1,qAdrsZoneConv
bl conversion10S
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at @ character
bl affichageMess
// other conditionnel test cinc
mov x0,3
mov x1,10 // for equal
//mov x1,20 // for else
cmp x1,10
cinc x0,x0,eq // if x1=10 x0 = x0+1 else x0 = x0
ldr x1,qAdrsZoneConv
bl conversion10S
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at @ character
bl affichageMess
// other conditionnel test csinc
mov x0,3
mov x2,6
mov x3,11
mov x1,10 // for equal
//mov x1,20 // for else
cmp x1,10
csinc x0,x2,x3,ne // if x1<>10 x0 = x2 else x0 = x3 + 1
ldr x1,qAdrsZoneConv
bl conversion10S
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at @ character
bl affichageMess
100: // standard end of the program
mov x0,0 // return code
mov x8,EXIT // request to exit program
svc 0 // perform the system call
qAdrszMessTest1: .quad szMessTest1
qAdrszMessTest1N: .quad szMessTest1N
qAdrszMessTest1A: .quad szMessTest1A
qAdrszMessTest1AN: .quad szMessTest1AN
qAdrszMessTest2: .quad szMessTest2
qAdrszMessTest2N: .quad szMessTest2N
qAdrszMessTest3: .quad szMessTest3
qAdrszMessTest3N: .quad szMessTest3N
qAdrszMessTest4: .quad szMessTest4
qAdrszMessTest4N: .quad szMessTest4N
qAdrszMessTest5: .quad szMessTest5
qAdrszMessTest5N: .quad szMessTest5N
qAdrszMessTest6: .quad szMessTest6
qAdrszMessTest6N: .quad szMessTest6N
qAdrszMessTest7: .quad szMessTest7
qAdrszMessTest7N: .quad szMessTest7N
qAdrszMessTest8: .quad szMessTest8
qAdrszMessTest8N: .quad szMessTest8N
qAdrszMessResult: .quad szMessResult
qAdrsZoneConv: .quad sZoneConv
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"