Bioinformatics/base count: Difference between revisions
Content added Content deleted
VincentARM (talk | contribs) (add task to arm assembly raspberry pi) |
VincentARM (talk | contribs) (add task to aarch64 assembly raspberry pi 3) |
||
Line 80: | Line 80: | ||
T: 155 |
T: 155 |
||
TOT= 500 |
TOT= 500 |
||
</pre> |
|||
=={{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 cptAdn64.s */ |
|||
/************************************/ |
|||
/* Constantes */ |
|||
/************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly*/ |
|||
.include "../includeConstantesARM64.inc" |
|||
.equ LIMIT, 30 |
|||
.equ SHIFT, 8 |
|||
//.include "../../ficmacros64.inc" // use for debugging |
|||
/************************************/ |
|||
/* Initialized data */ |
|||
/************************************/ |
|||
.data |
|||
szMessResult: .asciz "Result: " |
|||
szDNA1: .ascii "CGTAAAAAATTACAACGTCCTTTGGCTATCTCTTAAACTCCTGCTAAATG" |
|||
.ascii "CTCGTGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTG" |
|||
.ascii "AGGACAAAGGTCAAGATGGAGCGCATCGAACGCAATAAGGATCATTTGAT" |
|||
.ascii "GGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTT" |
|||
.ascii "CGATTCTGCTTATAACACTATGTTCTTATGAAATGGATGTTCTGAGTTGG" |
|||
.ascii "TCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTATA" |
|||
.ascii "TTTAATTTTTCTATATAGCGATCTGTATTTAAGCAATTCATTTAGGTTAT" |
|||
.ascii "CGCCGCGATGCTCGGTTCGGACCGCCAAGCATCTGGCTCCACTGCTAGTG" |
|||
.ascii "TCCTAAATTTGAATGGCAAACACAAATAAGATTTAGCAATTCGTGTAGAC" |
|||
.asciz "GACCGGGGACTTGCATGATGGGAGCAGCTTTGTTAAACTACGAACGTAAT" |
|||
szCarriageReturn: .asciz "\n" |
|||
szMessStart: .asciz "Program 64 bits start.\n" |
|||
szMessCounterA: .asciz "Base A : " |
|||
szMessCounterC: .asciz "Base C : " |
|||
szMessCounterG: .asciz "Base G : " |
|||
szMessCounterT: .asciz "Base T : " |
|||
szMessTotal: .asciz "Total : " |
|||
sPrintLine: .fill LIMIT + SHIFT + 2,1,' ' // init line with spaces |
|||
/************************************/ |
|||
/* UnInitialized data */ |
|||
/************************************/ |
|||
.bss |
|||
sZoneConv: .skip 24 |
|||
/************************************/ |
|||
/* code section */ |
|||
/************************************/ |
|||
.text |
|||
.global main |
|||
main: // entry of program |
|||
ldr x0,qAdrszMessStart |
|||
bl affichageMess |
|||
ldr x0,qAdrszDNA1 |
|||
bl printDNA |
|||
ldr x0,qAdrszDNA1 |
|||
bl countBase |
|||
100: // standard end of the program |
|||
mov x0, #0 // return code |
|||
mov x8, #EXIT // request to exit program |
|||
svc 0 // perform the system call |
|||
qAdrszDNA1: .quad szDNA1 |
|||
qAdrsZoneConv: .quad sZoneConv |
|||
qAdrszMessResult: .quad szMessResult |
|||
qAdrszCarriageReturn: .quad szCarriageReturn |
|||
qAdrszMessStart: .quad szMessStart |
|||
/***************************************************/ |
|||
/* count dna line and print */ |
|||
/***************************************************/ |
|||
/* x0 contains dna string address */ |
|||
printDNA: |
|||
stp x1,lr,[sp,-16]! |
|||
stp x2,x3,[sp,-16]! |
|||
stp x4,x5,[sp,-16]! |
|||
stp x6,x7,[sp,-16]! |
|||
stp x8,x9,[sp,-16]! |
|||
mov x8,x0 // save address |
|||
mov x4,#0 // counter |
|||
mov x3,#0 // index string |
|||
mov x4,#0 // byte line counter |
|||
mov x5,#1 // start line value |
|||
ldr x7,qAdrsPrintLine |
|||
ldr x9,qAdrsZoneConv |
|||
1: |
|||
ldrb w6,[x8,x3] // load byte of dna |
|||
cmp x6,#0 // end string ? |
|||
beq 4f // yes -> end |
|||
add x1,x7,#SHIFT |
|||
strb w6,[x1,x4] // store byte in display line |
|||
add x4,x4,#1 // increment index line |
|||
cmp x4,#LIMIT // end line ? |
|||
blt 3f |
|||
mov x0,x5 // convert decimal counter base |
|||
mov x1,x9 |
|||
bl conversion10 |
|||
mov x2,xzr |
|||
2: // copy decimal conversion in display line |
|||
ldrb w6,[x9,x2] |
|||
strb w6,[x7,x2] |
|||
add x2,x2,1 |
|||
cmp x2,x0 |
|||
blt 2b |
|||
mov x0,#0 // Zero final |
|||
add x1,x7,#LIMIT |
|||
add x1,x1,#SHIFT + 1 |
|||
strb w0,[x1] |
|||
mov x0,x7 // line display |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
add x5,x5,#LIMIT // add line size to counter |
|||
mov x4,#0 // and init line index |
|||
3: |
|||
add x3,x3,#1 // increment index string |
|||
b 1b // and loop |
|||
4: // display end line if line contains base |
|||
cmp x4,#0 |
|||
beq 100f |
|||
mov x0,x5 |
|||
mov x1,x9 |
|||
bl conversion10 |
|||
mov x2,xzr |
|||
5: // copy decimal conversion in display line |
|||
ldrb w6,[x9,x2] |
|||
strb w6,[x7,x2] |
|||
add x2,x2,1 |
|||
cmp x2,x0 |
|||
blt 5b |
|||
mov x0,#0 // Zero final |
|||
add x1,x7,x4 |
|||
add x1,x1,#SHIFT |
|||
strb w0,[x1] |
|||
mov x0,x7 // last line display |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
100: |
|||
ldp x8,x9,[sp],16 |
|||
ldp x6,x7,[sp],16 |
|||
ldp x4,x5,[sp],16 |
|||
ldp x2,x3,[sp],16 |
|||
ldp x1,lr,[sp],16 |
|||
ret |
|||
qAdrsPrintLine: .quad sPrintLine |
|||
/***************************************************/ |
|||
/* count bases */ |
|||
/***************************************************/ |
|||
/* x0 contains dna string address */ |
|||
countBase: |
|||
stp x1,lr,[sp,-16]! |
|||
stp x2,x3,[sp,-16]! |
|||
stp x4,x5,[sp,-16]! |
|||
stp x6,x7,[sp,-16]! |
|||
mov x2,#0 // string index |
|||
mov x3,#0 // A counter |
|||
mov x4,#0 // C counter |
|||
mov x5,#0 // G counter |
|||
mov x6,#0 // T counter |
|||
1: |
|||
ldrb w1,[x0,x2] // load byte of dna |
|||
cmp x1,#0 // end string ? |
|||
beq 2f |
|||
cmp x1,#'A' |
|||
cinc x3,x3,eq |
|||
cmp x1,#'C' |
|||
cinc x4,x4,eq |
|||
cmp x1,#'G' |
|||
cinc x5,x5,eq |
|||
cmp x1,#'T' |
|||
cinc x6,x6,eq |
|||
add x2,x2,#1 |
|||
b 1b |
|||
2: |
|||
mov x0,x3 // convert decimal counter A |
|||
ldr x1,qAdrsZoneConv |
|||
bl conversion10 |
|||
ldr x0,qAdrszMessCounterA |
|||
bl affichageMess |
|||
ldr x0,qAdrsZoneConv |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
mov x0,x4 // convert decimal counter C |
|||
ldr x1,qAdrsZoneConv |
|||
bl conversion10 |
|||
ldr x0,qAdrszMessCounterC |
|||
bl affichageMess |
|||
ldr x0,qAdrsZoneConv |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
mov x0,x5 // convert decimal counter G |
|||
ldr x1,qAdrsZoneConv |
|||
bl conversion10 |
|||
ldr x0,qAdrszMessCounterG |
|||
bl affichageMess |
|||
ldr x0,qAdrsZoneConv |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
mov x0,x6 // convert decimal counter T |
|||
ldr x1,qAdrsZoneConv |
|||
bl conversion10 |
|||
ldr x0,qAdrszMessCounterT |
|||
bl affichageMess |
|||
ldr x0,qAdrsZoneConv |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
add x0,x3,x4 // convert decimal total |
|||
add x0,x0,x5 |
|||
add x0,x0,x6 |
|||
ldr x1,qAdrsZoneConv |
|||
bl conversion10 |
|||
ldr x0,qAdrszMessTotal |
|||
bl affichageMess |
|||
ldr x0,qAdrsZoneConv |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
100: |
|||
ldp x6,x7,[sp],16 |
|||
ldp x4,x5,[sp],16 |
|||
ldp x2,x3,[sp],16 |
|||
ldp x1,lr,[sp],16 // TODO: retaur à completer |
|||
ret |
|||
qAdrszMessCounterA: .quad szMessCounterA |
|||
qAdrszMessCounterC: .quad szMessCounterC |
|||
qAdrszMessCounterG: .quad szMessCounterG |
|||
qAdrszMessCounterT: .quad szMessCounterT |
|||
qAdrszMessTotal: .quad szMessTotal |
|||
/***************************************************/ |
|||
/* ROUTINES INCLUDE */ |
|||
/***************************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly*/ |
|||
.include "../includeARM64.inc" |
|||
</syntaxhighlight> |
|||
{{Out}} |
|||
<pre> |
|||
Program 64 bits start. |
|||
1 CGTAAAAAATTACAACGTCCTTTGGCTATC |
|||
31 TCTTAAACTCCTGCTAAATGCTCGTGCTTT |
|||
61 CCAATTATGTAAGCGTTCCGAGACGGGGTG |
|||
91 GTCGATTCTGAGGACAAAGGTCAAGATGGA |
|||
121 GCGCATCGAACGCAATAAGGATCATTTGAT |
|||
151 GGGACGTTTCGTCGACAAAGTCTTGTTTCG |
|||
181 AGAGTAACGGCTACCGTCTTCGATTCTGCT |
|||
211 TATAACACTATGTTCTTATGAAATGGATGT |
|||
241 TCTGAGTTGGTCAGTCCCAATGTGCGGGGT |
|||
271 TTCTTTTAGTACGTCGGGAGTGGTATTATA |
|||
301 TTTAATTTTTCTATATAGCGATCTGTATTT |
|||
331 AAGCAATTCATTTAGGTTATCGCCGCGATG |
|||
361 CTCGGTTCGGACCGCCAAGCATCTGGCTCC |
|||
391 ACTGCTAGTGTCCTAAATTTGAATGGCAAA |
|||
421 CACAAATAAGATTTAGCAATTCGTGTAGAC |
|||
451 GACCGGGGACTTGCATGATGGGAGCAGCTT |
|||
481 TGTTAAACTACGAACGTAAT |
|||
Base A : 129 |
|||
Base C : 97 |
|||
Base G : 119 |
|||
Base T : 155 |
|||
Total : 500 |
|||
</pre> |
</pre> |
||
=={{header|Action!}}== |
=={{header|Action!}}== |