/* ARM assembly AARCH64 Raspberry PI 3B */ /* program bincompl64.s */ /*******************************************/ /* Constantes file */ /*******************************************/ /* for this file see task include a file in language AArch64 assembly*/ .include "../includeConstantesARM64.inc" /*********************************/ /* Initialized data */ /*********************************/ .data szMessDebutPgm: .asciz "Program 64 bits start. \n" szMessFinOK: .asciz "Program normal end. \n" szMessError: .asciz "Error detected !!!!. \n" szMessNumber: .asciz "Start number : " szMessResUns: .asciz "Result unsigned : " szMessResS: .asciz "Result signed : " szMessResMvn: .asciz "Result with mvn instruction : " szCarriageReturn: .asciz "\n" /*********************************/ /* UnInitialized data */ /*********************************/ .bss .align 4 sZoneConv: .skip 24 /*********************************/ /* code section */ /*********************************/ .text .global main main: ldr x0,qAdrszMessDebutPgm bl affichageMess // start message mov x4,12345 // number mov x0,x4 ldr x1,qAdrsZoneConv bl conversion10 // decimal conversion mov x0,3 ldr x1,qAdrszMessNumber ldr x2,qAdrsZoneConv ldr x3,qAdrszCarriageReturn bl displayStrings mov x0,x4 neg x0,x0 ldr x1,qAdrsZoneConv bl conversion10 // decimal conversion unsigned mov x0,3 ldr x1,qAdrszMessResUns ldr x2,qAdrsZoneConv ldr x3,qAdrszCarriageReturn bl displayStrings mov x0,x4 neg x0,x0 ldr x1,qAdrsZoneConv bl conversion10S // decimal conversion signed mov x0,3 ldr x1,qAdrszMessResS ldr x2,qAdrsZoneConv ldr x3,qAdrszCarriageReturn bl displayStrings mov x0,x4 mvn x0,x0 // use mvn instruction ldr x1,qAdrsZoneConv bl conversion10S // decimal conversion signed mov x0,3 ldr x1,qAdrszMessResMvn ldr x2,qAdrsZoneConv ldr x3,qAdrszCarriageReturn bl displayStrings ldr x0,qAdrszMessFinOK 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 qAdrszMessDebutPgm: .quad szMessDebutPgm qAdrszMessFinOK: .quad szMessFinOK qAdrszMessError: .quad szMessError qAdrszCarriageReturn: .quad szCarriageReturn qAdrsZoneConv: .quad sZoneConv qAdrszMessNumber: .quad szMessNumber qAdrszMessResUns: .quad szMessResUns qAdrszMessResS: .quad szMessResS qAdrszMessResMvn: .quad szMessResMvn /***************************************************/ /* display multi strings */ /* new version 24/05/2023 */ /***************************************************/ /* x0 contains number strings address */ /* x1 address string1 */ /* x2 address string2 */ /* x3 address string3 */ /* x4 address string4 */ /* x5 address string5 */ /* x6 address string6 */ displayStrings: // INFO: displayStrings stp x7,lr,[sp,-16]! // save registers stp x2,fp,[sp,-16]! // save registers add fp,sp,#32 // save paraméters address (4 registers saved * 8 bytes) mov x7,x0 // save strings number cmp x7,#0 // 0 string -> end ble 100f mov x0,x1 // string 1 bl affichageMess cmp x7,#1 // number > 1 ble 100f mov x0,x2 bl affichageMess cmp x7,#2 ble 100f mov x0,x3 bl affichageMess cmp x7,#3 ble 100f mov x0,x4 bl affichageMess cmp x7,#4 ble 100f mov x0,x5 bl affichageMess cmp x7,#5 ble 100f mov x0,x6 bl affichageMess 100: ldp x2,fp,[sp],16 // restaur registers ldp x7,lr,[sp],16 // restaur registers ret /********************************************************/ /* File Include fonctions */ /********************************************************/ /* for this file see task include a file in language AArch64 assembly */ .include "../includeARM64.inc"