Jump anywhere: Difference between revisions
Content added Content deleted
VincentARM (talk | contribs) (add task to aarch64 assembly raspberry pi) |
|||
Line 201: | Line 201: | ||
Although <code>JMP</code> was referred to as "unconditional" before, it does ''not'' have access to the entire address space of the CPU, unlike the 6502, Z80, and 68000. The 8086 uses a segmented memory model, where it uses 20-bit addresses despite being a 16-bit CPU. The other 4 bits are the "segment," and a <code>JMP</code> or <code>CALL</code> cannot exit that segment. |
Although <code>JMP</code> was referred to as "unconditional" before, it does ''not'' have access to the entire address space of the CPU, unlike the 6502, Z80, and 68000. The 8086 uses a segmented memory model, where it uses 20-bit addresses despite being a 16-bit CPU. The other 4 bits are the "segment," and a <code>JMP</code> or <code>CALL</code> cannot exit that segment. |
||
=={{header|AArch64 Assembly}}== |
|||
{{works with|as|Raspberry Pi 3B version Buster 64 bits <br> or android 64 bits with application Termux }} |
|||
<syntaxhighlight lang AArch64 Assembly> |
|||
/* ARM assembly AARCH64 Raspberry PI 3B */ |
|||
/* program julpanaywhere64.s */ |
|||
/************************************/ |
|||
/* Constantes */ |
|||
/************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly*/ |
|||
.include "../includeConstantesARM64.inc" |
|||
/*********************************/ |
|||
/* Initialized data */ |
|||
/*********************************/ |
|||
.data |
|||
szMessResult: .asciz "loop indice : " |
|||
szMessage1: .asciz "Display to routine call by register\n" |
|||
szMessage2: .asciz "Equal to zero.\n" |
|||
szMessage3: .asciz "Not equal to zero.\n" |
|||
szMessage4: .asciz "loop start\n" |
|||
szMessage5: .asciz "No executed.\n" |
|||
szMessResult1: .asciz "," |
|||
szMessResult2: .asciz "]\n" |
|||
szMessStart: .asciz "Program 64 bits start.\n" |
|||
szCarriageReturn: .asciz "\n" |
|||
/*********************************/ |
|||
/* UnInitialized data */ |
|||
/*********************************/ |
|||
.bss |
|||
sZoneConv: .skip 24 |
|||
/*********************************/ |
|||
/* code section */ |
|||
/*********************************/ |
|||
.text |
|||
.global main |
|||
main: // entry of program |
|||
ldr x0,qAdrszMessStart |
|||
bl affichageMess // branch and link to routine |
|||
// return here after routine execution |
|||
b label1 // branch unconditional to label |
|||
ldr x0,qAdrszMessage5 // this instruction is never executed |
|||
bl affichageMess // and this |
|||
label1: |
|||
ldr x0,qAdrszMessage4 |
|||
bl affichageMess |
|||
mov x20,0 |
|||
1: |
|||
mov x0,x20 |
|||
ldr x1,qAdrsZoneConv |
|||
bl conversion10 // decimal conversion |
|||
strb wzr,[x1,x0] |
|||
mov x0,#3 // number string to display |
|||
ldr x1,qAdrszMessResult |
|||
ldr x2,qAdrsZoneConv // insert conversion in message |
|||
ldr x3,qAdrszCarriageReturn |
|||
bl displayStrings // display message |
|||
add x20,x20,1 // increment indice |
|||
cmp x20,5 |
|||
blt 1b // branch for loop if lower |
|||
mov x0,0 |
|||
cbz x0,2f // jump to label 2 if x0 = 0 |
|||
2: |
|||
adr x1,affichageMess // load routine address in register |
|||
ldr x0,qAdrszMessage1 |
|||
blr x1 |
|||
mov x4,4 |
|||
cmp x4,10 |
|||
bgt 3f // branch if higter |
|||
mov x0,x4 |
|||
3: |
|||
mov x0,0b100 // 1 -> bit 2 |
|||
tbz x0,2,labzero // if bit 2 equal 0 jump to label |
|||
ldr x0,qAdrszMessage3 // bit 2 <> 0 |
|||
bl affichageMess |
|||
b endtest // jump end if else |
|||
labzero: // display if bit equal to 0 |
|||
ldr x0,qAdrszMessage2 |
|||
bl affichageMess |
|||
endtest: |
|||
mov x0,0b000 // 0 -> bit 2 |
|||
tbnz x0,2,4f // if bit 2 <> 0 jump to label |
|||
ldr x0,qAdrszMessage2 // bit 2 = 0 |
|||
bl affichageMess |
|||
b 5f // jump end test |
|||
4: // display if bit equal to 1 |
|||
ldr x0,qAdrszMessage3 |
|||
bl affichageMess |
|||
5: |
|||
100: // standard end of the program |
|||
mov x0, #0 // return code |
|||
mov x8,EXIT |
|||
svc #0 // perform the system call |
|||
qAdrszCarriageReturn: .quad szCarriageReturn |
|||
qAdrsZoneConv: .quad sZoneConv |
|||
qAdrszMessResult: .quad szMessResult |
|||
qAdrszMessage1: .quad szMessage1 |
|||
qAdrszMessage2: .quad szMessage2 |
|||
qAdrszMessage3: .quad szMessage3 |
|||
qAdrszMessage4: .quad szMessage4 |
|||
qAdrszMessage5: .quad szMessage5 |
|||
qAdrszMessStart: .quad szMessStart |
|||
/***************************************************/ |
|||
/* display multi strings */ |
|||
/***************************************************/ |
|||
/* x0 contains number strings address */ |
|||
/* x1 address string1 */ |
|||
/* x2 address string2 */ |
|||
/* x3 address string3 */ |
|||
/* other address on the stack */ |
|||
/* thinck to add number other address * 4 to add to the stack */ |
|||
displayStrings: // INFO: displayStrings |
|||
stp x1,lr,[sp,-16]! // save registers |
|||
stp x2,x3,[sp,-16]! // save registers |
|||
stp x4,x5,[sp,-16]! // save registers |
|||
add fp,sp,#48 // save paraméters address (6 registers saved * 8 bytes) |
|||
mov x4,x0 // save strings number |
|||
cmp x4,#0 // 0 string -> end |
|||
ble 100f // branch to equal or smaller |
|||
mov x0,x1 // string 1 |
|||
bl affichageMess |
|||
cmp x4,#1 // number > 1 |
|||
ble 100f |
|||
mov x0,x2 |
|||
bl affichageMess |
|||
cmp x4,#2 |
|||
ble 100f |
|||
mov x0,x3 |
|||
bl affichageMess |
|||
cmp x4,#3 |
|||
ble 100f |
|||
mov x3,#3 |
|||
sub x2,x4,#4 |
|||
1: // loop extract address string on stack |
|||
ldr x0,[fp,x2,lsl #3] |
|||
bl affichageMess |
|||
subs x2,x2,#1 |
|||
bge 1b |
|||
100: |
|||
ldp x4,x5,[sp],16 // restaur registers |
|||
ldp x2,x3,[sp],16 // restaur registers |
|||
ldp x1,lr,[sp],16 // restaur registers |
|||
ret // return to addtress stored in lr |
|||
/***************************************************/ |
|||
/* ROUTINES INCLUDE */ |
|||
/***************************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly */ |
|||
.include "../includeARM64.inc" |
|||
</syntaxhighlight> |
|||
{{Out}} |
|||
<pre> |
|||
Program 64 bits start. |
|||
loop start |
|||
loop indice : 0 |
|||
loop indice : 1 |
|||
loop indice : 2 |
|||
loop indice : 3 |
|||
loop indice : 4 |
|||
Display to routine call by register |
|||
Not equal to zero. |
|||
Equal to zero. |
|||
</pre> |
|||
=={{header|Ada}}== |
=={{header|Ada}}== |