/* 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"