Include a file: Difference between revisions
Content added Content deleted
(Modify task arm assembly) |
|||
Line 552: | Line 552: | ||
.equ CREATE, 0x8 @ Linux Syscal create file |
.equ CREATE, 0x8 @ Linux Syscal create file |
||
.equ CLOSE, 0x6 @ Linux Syscal close file |
.equ CLOSE, 0x6 @ Linux Syscal close file |
||
.equ HEAPSIZE, 100000 |
|||
.equ CHARPOS, '@' @ character insertion |
.equ CHARPOS, '@' @ character insertion |
||
Line 563: | Line 565: | ||
sDeci: .space 15,' ' |
sDeci: .space 15,' ' |
||
.asciz "\n" |
.asciz "\n" |
||
ptzZoneHeap: .int zZoneHeap |
|||
/*************************************************/ |
|||
.bss |
|||
.align 4 |
|||
zZoneHeap: .skip HEAPSIZE |
|||
zEndZoneHeap: |
|||
.text |
.text |
||
/******************************************************************/ |
/******************************************************************/ |
||
Line 808: | Line 816: | ||
pop {r4, lr} |
pop {r4, lr} |
||
bx lr |
bx lr |
||
/***************************************************/ |
|||
⚫ | |||
/***************************************************/ |
|||
// r0 contains size in byte to reserve */ |
|||
// r0 returne begin address of area */ |
|||
reserverPlace: @ INFO: reserverPlace |
|||
push {r1,r2,r3,lr} @ save des registres |
|||
mov r1,r0 |
|||
tst r1,#0b11 @ size multiple of 4 ? |
|||
beq 1f @ yes |
|||
and r1,#0xFFFFFFFC @ else align to 4 superior |
|||
⚫ | |||
1: |
|||
ldr r2,iAdrptzZoneHeap |
|||
ldr r0,[r2] |
|||
add r1,r1,r0 @ size too large ? |
|||
ldr r3,iAdrzEndZoneHeap |
|||
cmp r1,r3 |
|||
blt 2f @ no it is ok |
|||
adr r0,szMessErrTas @ yes -> error |
|||
bl affichageMess |
|||
⚫ | |||
b 100f |
|||
2: |
|||
str r1,[r2] @ store new pointer |
|||
100: @ fin standard de la fonction |
|||
pop {r1,r2,r3,lr} @ restaur des registres |
|||
bx lr @ retour de la fonction en utilisant lr |
|||
iAdrptzZoneHeap: .int ptzZoneHeap |
|||
iAdrzEndZoneHeap: .int zEndZoneHeap |
|||
szMessErrTas: .asciz "Error : heap not large !!!\n" |
|||
.align 4 |
|||
/***************************************************/ |
|||
/* liberer place sur le tas */ |
|||
/***************************************************/ |
|||
// r0 contains begin address area |
|||
libererPlace: @ INFO: libererPlace |
|||
push {r1,lr} @ save des registres |
|||
ldr r1,iAdrzZoneHeap |
|||
cmp r0,r1 |
|||
blt 99f |
|||
ldr r1,iAdrzEndZoneHeap |
|||
cmp r0,r1 |
|||
bge 99f |
|||
ldr r1,iAdrptzZoneHeap |
|||
str r0,[r1] |
|||
b 100f |
|||
99: |
|||
adr r0,szMessErrTas1 |
|||
bl affichageMess |
|||
mov r0,#-1 |
|||
100: |
|||
⚫ | |||
bx lr |
|||
iAdrzZoneHeap: .int zZoneHeap |
|||
szMessErrTas1: .asciz "Error : address < or > heap addresses !!!\n" |
|||
.align 4 |
|||
/******************************************************************/ |
/******************************************************************/ |
||
/* insert string at character insertion */ |
/* insert string at character insertion */ |
||
Line 834: | Line 899: | ||
add r3,r3,#1 // +1 for final zero |
add r3,r3,#1 // +1 for final zero |
||
mov r6,r0 // save address string 1 |
mov r6,r0 // save address string 1 |
||
mov r0,r3 |
|||
mov r0,#0 // allocation place heap |
|||
bl reserverPlace |
|||
⚫ | |||
⚫ | |||
mov r5,r0 // save address heap for output string |
mov r5,r0 // save address heap for output string |
||
add r0,r0,r3 // reservation place r3 length |
|||
⚫ | |||
⚫ | |||
cmp r0,#-1 // allocation error |
cmp r0,#-1 // allocation error |
||
beq 99f |
beq 99f |