/* ARM assembly Raspberry PI */ /* program Machine code */ /* REMARK 1 : this program use routines in a include file see task Include a file language arm assembly for the routine affichageMess conversion10 see at end of this program the instruction include */ /*******************************************/ /* Constantes */ /*******************************************/ .include "../constantes.inc" /*******************************************/ /* macros */ /*******************************************/ //.include "../../ficmacros32.inc" @ for developper debugging /*********************************/ /* Initialized data */ /*********************************/ .data szMessDebutPgm: .asciz "Program 32 bits start. \n" szCarriageReturn: .asciz "\n" szMessFinOK: .asciz "Program normal end. \n" @ code machine ARM 32 bits .align 4 bCodeArm: .byte 0x02,0x40,0x2D,0xE9 @ push {r1,lr} .byte 0x01,0x00,0x80,0xE0 @ add r0,r1 .byte 0x02,0x80,0xBD,0xE8 @ pop {r1,pc} /*********************************/ /* UnInitialized data */ /*********************************/ .bss sAreaConv: .skip 24 .align 4 /*********************************/ /* code section */ /*********************************/ .text .global main main: ldr r0,iAdrszMessDebutPgm bl affichageMess @ start message mov r0,#5 mov r1,#10 bl addition @ call function ldr r1,iAdrsAreaConv @ decimal conversion bl conversion10 ldr r0,iAdrsAreaConv @ display result bl affichageMess ldr r0,iAdrszCarriageReturn bl affichageMess ldr r2,iAdrbCodeArm @ code machine arm address mov r0,#10 mov r1,#20 blx r2 @ call code machine ldr r1,iAdrsAreaConv @ decimal conversion bl conversion10 ldr r0,iAdrsAreaConv @ display result bl affichageMess ldr r0,iAdrszCarriageReturn bl affichageMess ldr r0,iAdrszMessFinOK bl affichageMess 100: mov r7,#EXIT @ program end svc #0 @ system call iAdrszMessDebutPgm: .int szMessDebutPgm iAdrszMessFinOK: .int szMessFinOK iAdrszCarriageReturn: .int szCarriageReturn iAdrsAreaConv: .int sAreaConv iAdrbCodeArm: .int bCodeArm /******************************************************************/ /* add two registers */ /******************************************************************/ /* r0 contains value 1 */ /* r1 contains value 2 */ addition: push {r1,lr} @ save registers add r0,r1 100: pop {r1,pc} /***************************************************/ /* ROUTINES INCLUDE */ /***************************************************/ .include "../affichage.inc"