Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
190
Task/Josephus-problem/AArch64-Assembly/josephus-problem.aarch64
Normal file
190
Task/Josephus-problem/AArch64-Assembly/josephus-problem.aarch64
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
/* ARM assembly AARCH64 Raspberry PI 3B */
|
||||
/* program josephus64.s */
|
||||
/* run with josephus64 maxi intervalle */
|
||||
/* example : josephus64 41 3
|
||||
|
||||
/*******************************************/
|
||||
/* Constantes file */
|
||||
/*******************************************/
|
||||
/* for this file see task include a file in language AArch64 assembly*/
|
||||
.include "../includeConstantesARM64.inc"
|
||||
|
||||
.equ FIRSTNODE, 0 //identification first node
|
||||
|
||||
/*******************************************/
|
||||
/* Structures */
|
||||
/********************************************/
|
||||
/* structure linkedlist*/
|
||||
.struct 0
|
||||
llist_next: // next element
|
||||
.struct llist_next + 8
|
||||
llist_value: // element value
|
||||
.struct llist_value + 8
|
||||
llist_fin:
|
||||
/*********************************/
|
||||
/* Initialized data */
|
||||
/*********************************/
|
||||
.data
|
||||
szMessDebutPgm: .asciz "Start program.\n"
|
||||
szMessFinPgm: .asciz "Program End ok.\n"
|
||||
szRetourLigne: .asciz "\n"
|
||||
szMessValElement: .asciz "Value : @ \n"
|
||||
szMessListeVide: .asciz "List empty.\n"
|
||||
szMessImpElement: .asciz "Node display: @ Value : @ Next @ \n"
|
||||
szMessErrComm: .asciz "Incomplete Command line : josephus64 <maxi> <intervalle>\n"
|
||||
/*********************************/
|
||||
/* UnInitialized data */
|
||||
/*********************************/
|
||||
.bss
|
||||
sZoneConv: .skip 100
|
||||
.align 4
|
||||
qDebutListe1: .skip llist_fin
|
||||
/*********************************/
|
||||
/* code section */
|
||||
/*********************************/
|
||||
.text
|
||||
.global main
|
||||
main: // entry of program
|
||||
mov fp,sp // copy stack address register x29 fp
|
||||
ldr x0,qAdrszMessDebutPgm
|
||||
bl affichageMess
|
||||
ldr x0,[fp] // parameter number command line
|
||||
cmp x0,#2 // correct ?
|
||||
ble erreurCommande // error
|
||||
|
||||
add x0,fp,#16 // address parameter 2
|
||||
ldr x0,[x0]
|
||||
bl conversionAtoD
|
||||
add x22,x0,FIRSTNODE // save maxi
|
||||
add x0,fp,#24 // address parameter 3
|
||||
ldr x0,[x0]
|
||||
bl conversionAtoD
|
||||
mov x21,x0 // save gap
|
||||
|
||||
mov x0,FIRSTNODE // create first node
|
||||
mov x1,0
|
||||
bl createNode
|
||||
mov x25,x0 // first node address
|
||||
mov x26,x0
|
||||
mov x24,FIRSTNODE + 1
|
||||
mov x23,1
|
||||
1: // loop create others nodes
|
||||
mov x0,x24 // key value
|
||||
mov x1,0
|
||||
bl createNode
|
||||
str x0,[x26,llist_next] // store current node address in prev node
|
||||
mov x26,x0
|
||||
add x24,x24,1
|
||||
add x23,x23,1
|
||||
cmp x23,x22 // maxi ?
|
||||
blt 1b
|
||||
str x25,[x26,llist_next] // store first node address in last pointer
|
||||
mov x24,x26
|
||||
2:
|
||||
mov x20,1 // counter for gap
|
||||
3:
|
||||
ldr x24,[x24,llist_next]
|
||||
add x20,x20,1
|
||||
cmp x20,x21 // intervalle ?
|
||||
blt 3b
|
||||
ldr x25,[x24,llist_next] // removing the node from the list
|
||||
ldr x22,[x25,llist_value]
|
||||
ldr x27,[x25,llist_next] // load pointer next
|
||||
str x27,[x24,llist_next] // ans store in prev node
|
||||
//mov x0,x25
|
||||
//bl displayNode
|
||||
cmp x27,x24
|
||||
csel x24,x24,x27,ne // next node address
|
||||
bne 2b // and loop
|
||||
|
||||
mov x0,x24
|
||||
bl displayNode // display last node
|
||||
|
||||
b 100f
|
||||
erreurCommande:
|
||||
ldr x0,qAdrszMessErrComm
|
||||
bl affichageMess
|
||||
mov x0,#1 // error code
|
||||
b 100f
|
||||
100: // program end standard
|
||||
ldr x0,qAdrszMessFinPgm
|
||||
bl affichageMess
|
||||
mov x0,0 // return code Ok
|
||||
mov x8,EXIT // system call "Exit"
|
||||
svc #0
|
||||
|
||||
qAdrszMessDebutPgm: .quad szMessDebutPgm
|
||||
qAdrszMessFinPgm: .quad szMessFinPgm
|
||||
qAdrszRetourLigne: .quad szRetourLigne
|
||||
qAdrqDebutListe1: .quad qDebutListe1
|
||||
qAdrszMessErrComm: .quad szMessErrComm
|
||||
|
||||
/******************************************************************/
|
||||
/* create node */
|
||||
/******************************************************************/
|
||||
/* x0 contains key */
|
||||
/* x1 contains zero or address next node */
|
||||
/* x0 returns address heap node */
|
||||
createNode:
|
||||
stp x20,lr,[sp,-16]! // save registres
|
||||
stp x21,x22,[sp,-16]! // save registres
|
||||
mov x20,x0 // save key
|
||||
mov x21,x1 // save key
|
||||
mov x0,#0 // allocation place heap
|
||||
mov x8,BRK // call system 'brk'
|
||||
svc #0
|
||||
mov x22,x0 // save address heap for node
|
||||
add x0,x0,llist_fin // reservation place node length
|
||||
mov x8,BRK // call system 'brk'
|
||||
svc #0
|
||||
cmp x0,#-1 // allocation error
|
||||
beq 100f
|
||||
|
||||
str x20,[x22,llist_value]
|
||||
str x21,[x22,llist_next]
|
||||
mov x0,x22
|
||||
100:
|
||||
ldp x21,x22,[sp],16 // restaur des 2 registres
|
||||
ldp x20,lr,[sp],16 // restaur des 2 registres
|
||||
ret // retour adresse lr x30
|
||||
|
||||
/******************************************************************/
|
||||
/* display infos node */
|
||||
/******************************************************************/
|
||||
/* x0 contains node address */
|
||||
displayNode:
|
||||
stp x1,lr,[sp,-16]! // save registres
|
||||
stp x2,x3,[sp,-16]! // save registres
|
||||
mov x2,x0
|
||||
ldr x1,qAdrsZoneConv
|
||||
bl conversion16
|
||||
ldr x0,qAdrszMessImpElement
|
||||
ldr x1,qAdrsZoneConv
|
||||
bl strInsertAtCharInc
|
||||
mov x3,x0
|
||||
ldr x0,[x2,llist_value]
|
||||
ldr x1,qAdrsZoneConv
|
||||
bl conversion10S
|
||||
mov x0,x3
|
||||
ldr x1,qAdrsZoneConv
|
||||
bl strInsertAtCharInc
|
||||
mov x3,x0
|
||||
ldr x0,[x2,llist_next]
|
||||
ldr x1,qAdrsZoneConv
|
||||
bl conversion16
|
||||
mov x0,x3
|
||||
ldr x1,qAdrsZoneConv
|
||||
bl strInsertAtCharInc
|
||||
bl affichageMess
|
||||
|
||||
100:
|
||||
ldp x2,x3,[sp],16 // restaur des 2 registres
|
||||
ldp x1,lr,[sp],16 // restaur des 2 registres
|
||||
ret // retour adresse lr x30
|
||||
qAdrsZoneConv: .quad sZoneConv
|
||||
qAdrszMessImpElement: .quad szMessImpElement
|
||||
/********************************************************/
|
||||
/* File Include fonctions */
|
||||
/********************************************************/
|
||||
/* for this file see task include a file in language AArch64 assembly */
|
||||
.include "../includeARM64.inc"
|
||||
Loading…
Add table
Add a link
Reference in a new issue