Queue/Definition: Difference between revisions

add task to ARM64 assembly Raspberry Pi
(add task to ARM64 assembly Raspberry Pi)
Line 26:
<br><br>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program defqueue64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
.equ NBMAXIELEMENTS, 100
/*******************************************/
/* Structures */
/********************************************/
/* example structure for value of item */
.struct 0
value_ident: // ident
.struct value_ident + 8
value_value1: // value 1
.struct value_value1 + 8
value_value2: // value 2
.struct value_value2 + 8
value_fin:
/* example structure for queue */
.struct 0
queue_ptdeb: // begin pointer of item
.struct queue_ptdeb + 8
queue_ptfin: // end pointer of item
.struct queue_ptfin + 8
queue_stvalue: // structure of value item
.struct queue_stvalue + (value_fin * NBMAXIELEMENTS)
queue_fin:
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessEmpty: .asciz "Empty queue. \n"
szMessNotEmpty: .asciz "Not empty queue. \n"
szMessError: .asciz "Error detected !!!!. \n"
szMessResult: .asciz "Ident : @ value 1 : @ value 2 : @ \n" // message result
szCarriageReturn: .asciz "\n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
.align 4
Queue1: .skip queue_fin // queue memory place
stItem: .skip value_fin // value item memory place
sZoneConv: .skip 100
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
ldr x0,qAdrQueue1 // queue structure address
bl isEmpty
cmp x0,#0
beq 1f
ldr x0,qAdrszMessEmpty
bl affichageMess // display message empty
b 2f
1:
ldr x0,qAdrszMessNotEmpty
bl affichageMess // display message not empty
2:
// init item 1
ldr x0,qAdrstItem
mov x1,#1
str x1,[x0,#value_ident]
mov x1,#11
str x1,[x0,#value_value1]
mov x1,#12
str x1,[x0,#value_value2]
ldr x0,qAdrQueue1 // queue structure address
ldr x1,qAdrstItem
bl pushQueue // add item in queue
cmp x0,#-1 // error ?
beq 99f
// init item 2
ldr x0,qAdrstItem
mov x1,#2
str x1,[x0,#value_ident]
mov x1,#21
str x1,[x0,#value_value1]
mov x1,#22
str x1,[x0,#value_value2]
ldr x0,qAdrQueue1 // queue structure address
ldr x1,qAdrstItem
bl pushQueue // add item in queue
cmp x0,#-1
beq 99f
ldr x0,qAdrQueue1 // queue structure address
bl isEmpty
cmp x0,#0 // not empty
beq 3f
ldr x0,qAdrszMessEmpty
bl affichageMess // display message empty
b 4f
3:
ldr x0,qAdrszMessNotEmpty
bl affichageMess // display message not empty
4:
ldr x0,qAdrQueue1 // queue structure address
bl popQueue // return address item
cmp x0,#-1 // error ?
beq 99f
mov x2,x0 // save item pointer
ldr x0,[x2,#value_ident]
ldr x1,qAdrsZoneConv // conversion ident
bl conversion10S // decimal conversion
ldr x0,qAdrszMessResult
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at first @ character
mov x5,x0
ldr x0,[x2,#value_value1]
ldr x1,qAdrsZoneConv // conversion value 1
bl conversion10S // decimal conversion
mov x0,x5
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at Second @ character
mov x5,x0
ldr x0,[x2,#value_value2]
ldr x1,qAdrsZoneConv // conversion value 2
bl conversion10S // decimal conversion
mov x0,x5
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // insert result at third @ character
bl affichageMess // display message final
b 4b // loop
99: // error
ldr x0,qAdrszMessError
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
qAdrQueue1: .quad Queue1
qAdrstItem: .quad stItem
qAdrszMessError: .quad szMessError
qAdrszMessEmpty: .quad szMessEmpty
qAdrszMessNotEmpty: .quad szMessNotEmpty
qAdrszMessResult: .quad szMessResult
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrsZoneConv: .quad sZoneConv
 
/******************************************************************/
/* test if queue empty */
/******************************************************************/
/* x0 contains the address of queue structure */
/* x0 returns 0 if not empty, 1 if empty */
isEmpty:
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
ldr x1,[x0,#queue_ptdeb] // begin pointer
ldr x2,[x0,#queue_ptfin] // begin pointer
cmp x1,x2
bne 1f
mov x0,#1 // empty queue
b 2f
1:
mov x0,#0 // not empty
2:
ldp x2,x3,[sp],16 // restaur 2 registers
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
 
/******************************************************************/
/* add item in queue */
/******************************************************************/
/* x0 contains the address of queue structure */
/* x1 contains the address of item */
pushQueue:
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
add x2,x0,#queue_stvalue // address of values structure
ldr x3,[x0,#queue_ptfin] // end pointer
add x2,x2,x3 // free address of queue
ldr x4,[x1,#value_ident] // load ident item
str x4,[x2,#value_ident] // and store in queue
ldr x4,[x1,#value_value1] // idem
str x4,[x2,#value_value1]
ldr x4,[x1,#value_value2]
str x4,[x2,#value_value2]
add x3,x3,#value_fin
cmp x3,#value_fin * NBMAXIELEMENTS
beq 99f
str x3,[x0,#queue_ptfin] // store new end pointer
b 100f
99:
mov x0,#-1 // error
100:
ldp x2,x3,[sp],16 // restaur 2 registers
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
 
/******************************************************************/
/* pop queue */
/******************************************************************/
/* x0 contains the address of queue structure */
popQueue:
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
mov x1,x0 // control if empty queue
bl isEmpty
cmp x0,#1 // yes -> error
beq 99f
mov x0,x1
ldr x1,[x0,#queue_ptdeb] // begin pointer
add x2,x0,#queue_stvalue // address of begin values item
add x2,x2,x1 // address of item
add x1,x1,#value_fin
str x1,[x0,#queue_ptdeb] // store nex begin pointer
mov x0,x2 // return pointer item
b 100f
99:
mov x0,#-1 // error
100:
ldp x2,x3,[sp],16 // restaur 2 registers
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
 
</lang>
{{output}}
<pre>
Empty queue.
Not empty queue.
Ident : +1 value 1 : +11 value 2 : +12
Ident : +2 value 1 : +21 value 2 : +22
Error detected !!!!.
</pre>
=={{header|ACL2}}==
<lang Lisp>(defun enqueue (x xs)