Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,365 @@
|
|||
/* ARM assembly AARCH64 Raspberry PI 3B */
|
||||
/* program yahoosearch64.s */
|
||||
|
||||
/* access RosettaCode.org and data extract */
|
||||
/* use openssl for access to port 443 */
|
||||
/* test openssl : package libssl-dev */
|
||||
/*******************************************/
|
||||
/* Constantes file */
|
||||
/*******************************************/
|
||||
/* for this file see task include a file in language AArch64 assembly*/
|
||||
.include "../includeConstantesARM64.inc"
|
||||
|
||||
.equ TAILLEBUFFER, 500
|
||||
|
||||
.equ SSL_OP_NO_SSLv3, 0x02000000
|
||||
.equ SSL_OP_NO_COMPRESSION, 0x00020000
|
||||
.equ SSL_MODE_AUTO_RETRY, 0x00000004
|
||||
.equ SSL_CTRL_MODE, 33
|
||||
|
||||
.equ BIO_C_SET_CONNECT, 100
|
||||
.equ BIO_C_DO_STATE_MACHINE, 101
|
||||
.equ BIO_C_SET_SSL, 109
|
||||
.equ BIO_C_GET_SSL, 110
|
||||
|
||||
.equ LGBUFFERREQ, 512001
|
||||
|
||||
/*********************************/
|
||||
/* Initialized data */
|
||||
/*********************************/
|
||||
.data
|
||||
szMessDebutPgm: .asciz "Début du programme. \n"
|
||||
szRetourLigne: .asciz "\n"
|
||||
szMessFinOK: .asciz "Fin normale du programme. \n"
|
||||
szMessErreur: .asciz "Erreur !!!"
|
||||
szMessExtractArea: .asciz "Extraction = "
|
||||
szNomSite1: .asciz "search.yahoo.com:443" // host name and port
|
||||
szLibStart: .asciz ">Rosetta Code" // search string
|
||||
szNomrepCertif: .asciz "/pi/certificats"
|
||||
szRequete1: .asciz "GET /search?p=\"Rosettacode.org\"&b=1 HTTP/1.1 \r\nHost: search.yahoo.com\r\nConnection: keep-alive\r\nContent-Type: text/plain\r\n\r\n"
|
||||
/*********************************/
|
||||
/* UnInitialized data */
|
||||
/*********************************/
|
||||
.bss
|
||||
.align 4
|
||||
sBufferreq: .skip LGBUFFERREQ
|
||||
szExtractArea: .skip TAILLEBUFFER
|
||||
stNewSSL: .skip 200
|
||||
/*********************************/
|
||||
/* code section */
|
||||
/*********************************/
|
||||
.text
|
||||
.global main
|
||||
main:
|
||||
ldr x0,qAdrszMessDebutPgm
|
||||
bl affichageMess // start message
|
||||
|
||||
/* connexion host port 443 and send query */
|
||||
bl envoiRequete
|
||||
cmp x0,#-1
|
||||
beq 99f // error ?
|
||||
|
||||
bl analyseReponse
|
||||
|
||||
ldr x0,qAdrszMessFinOK // end message
|
||||
bl affichageMess
|
||||
mov x0, #0 // return code ok
|
||||
b 100f
|
||||
99:
|
||||
ldr x0,qAdrszMessErreur // error
|
||||
bl affichageMess
|
||||
mov x0, #1 // return code error
|
||||
b 100f
|
||||
100:
|
||||
mov x8,EXIT // program end
|
||||
svc 0 // system call
|
||||
qAdrszMessDebutPgm: .quad szMessDebutPgm
|
||||
qAdrszMessFinOK: .quad szMessFinOK
|
||||
qAdrszMessErreur: .quad szMessErreur
|
||||
|
||||
/*********************************************************/
|
||||
/* connexion host port 443 and send query */
|
||||
/*********************************************************/
|
||||
envoiRequete:
|
||||
stp x1,lr,[sp,-16]! // save registers
|
||||
stp x2,x3,[sp,-16]! // save registers
|
||||
stp x4,x5,[sp,-16]! // save registers
|
||||
//*************************************
|
||||
// openSsl functions use *
|
||||
//*************************************
|
||||
//init ssl
|
||||
bl OPENSSL_init_crypto
|
||||
bl ERR_load_BIO_strings
|
||||
mov x2, #0
|
||||
mov x1, #0
|
||||
mov x0, #2
|
||||
bl OPENSSL_init_crypto
|
||||
mov x2, #0
|
||||
mov x1, #0
|
||||
mov x0, #0
|
||||
bl OPENSSL_init_ssl
|
||||
cmp x0,#0
|
||||
blt erreur
|
||||
bl TLS_client_method
|
||||
bl SSL_CTX_new
|
||||
cmp x0,#0
|
||||
ble erreur
|
||||
mov x20,x0 // save contex
|
||||
ldr x1,iFlag
|
||||
bl SSL_CTX_set_options
|
||||
mov x0,x20 // contex
|
||||
mov x1,#0
|
||||
ldr x2,qAdrszNomrepCertif
|
||||
bl SSL_CTX_load_verify_locations
|
||||
cmp x0,#0
|
||||
ble erreur
|
||||
mov x0,x20 // contex
|
||||
bl BIO_new_ssl_connect
|
||||
cmp x0,#0
|
||||
ble erreur
|
||||
mov x21,x0 // save bio
|
||||
mov x1,#BIO_C_GET_SSL
|
||||
mov x2,#0
|
||||
ldr x3,qAdrstNewSSL
|
||||
bl BIO_ctrl
|
||||
ldr x0,qAdrstNewSSL
|
||||
ldr x0,[x0]
|
||||
mov x1,#SSL_CTRL_MODE
|
||||
mov x2,#SSL_MODE_AUTO_RETRY
|
||||
mov x3,#0
|
||||
bl SSL_ctrl
|
||||
mov x0,x21 // bio
|
||||
mov x1,#BIO_C_SET_CONNECT
|
||||
mov x2,#0
|
||||
ldr x3,qAdrszNomSite1
|
||||
bl BIO_ctrl
|
||||
mov x0,x21 // bio
|
||||
mov x1,#BIO_C_DO_STATE_MACHINE
|
||||
mov x2,#0
|
||||
mov x3,#0
|
||||
bl BIO_ctrl
|
||||
// compute query length
|
||||
mov x2,#0
|
||||
ldr x1,qAdrszRequete1 // query
|
||||
1:
|
||||
ldrb w0,[x1,x2]
|
||||
cmp x0,#0
|
||||
add x8,x2,1
|
||||
csel x2,x8,x2,ne
|
||||
bne 1b
|
||||
// send query
|
||||
mov x0,x21 // bio
|
||||
// x1 = address query
|
||||
// x2 = length query
|
||||
mov x3,#0
|
||||
bl BIO_write // send query
|
||||
cmp x0,#0
|
||||
blt erreur
|
||||
ldr x22,qAdrsBufferreq // buffer address
|
||||
2: // begin loop to read datas
|
||||
mov x0,x21 // bio
|
||||
mov x1,x22 // buffer address
|
||||
ldr x2,qLgBuffer
|
||||
mov x3,#0
|
||||
bl BIO_read
|
||||
cmp x0,#0
|
||||
ble 4f // error ou pb server
|
||||
add x22,x22,x0
|
||||
sub x2,x22,#8
|
||||
ldr x2,[x2]
|
||||
ldr x3,qCharEnd
|
||||
cmp x2,x3 // text end ?
|
||||
beq 4f
|
||||
mov x1,#0xFFFFFF // delay loop
|
||||
3:
|
||||
subs x1,x1,1
|
||||
bgt 3b
|
||||
b 2b // loop read other chunk
|
||||
4: // read end
|
||||
//ldr x0,qAdrsBufferreq // to display buffer response of the query
|
||||
//bl affichageMess
|
||||
mov x0, x21 // close bio
|
||||
bl BIO_free_all
|
||||
mov x0,#0
|
||||
b 100f
|
||||
erreur: // error display
|
||||
ldr x1,qAdrszMessErreur
|
||||
bl afficheErreur
|
||||
mov x0,#-1 // error code
|
||||
b 100f
|
||||
100:
|
||||
ldp x4,x5,[sp],16 // restaur 2 registers
|
||||
ldp x2,x3,[sp],16 // restaur 2 registers
|
||||
ldp x1,lr,[sp],16 // restaur 2 registers
|
||||
ret // return to address lr x30
|
||||
qAdrszRequete1: .quad szRequete1
|
||||
qAdrsBufferreq: .quad sBufferreq
|
||||
iFlag: .quad SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION
|
||||
qAdrstNewSSL: .quad stNewSSL
|
||||
qAdrszNomSite1: .quad szNomSite1
|
||||
qAdrszNomrepCertif: .quad szNomrepCertif
|
||||
qCharEnd: .quad 0x0A0D0A0D300A0D0A
|
||||
qLgBuffer: .quad LGBUFFERREQ - 1
|
||||
/*********************************************************/
|
||||
/* response analyze */
|
||||
/*********************************************************/
|
||||
analyseReponse:
|
||||
stp x1,lr,[sp,-16]! // save registers
|
||||
stp x2,x3,[sp,-16]! // save registers
|
||||
ldr x0,qAdrsBufferreq // buffer address
|
||||
ldr x1,qAdrszLibStart // key text address
|
||||
mov x2,#2 // occurence key text
|
||||
mov x3,#-11 // offset
|
||||
ldr x4,qAdrszExtractArea // address result area
|
||||
bl extChaine
|
||||
cmp x0,#-1
|
||||
beq 99f
|
||||
ldr x0,qAdrszMessExtractArea
|
||||
bl affichageMess
|
||||
ldr x0,qAdrszExtractArea // résult display
|
||||
bl affichageMess
|
||||
ldr x0,qAdrszRetourLigne
|
||||
bl affichageMess
|
||||
b 100f
|
||||
99:
|
||||
ldr x0,qAdrszMessErreur // error
|
||||
bl affichageMess
|
||||
mov x0, #-1 // error return code
|
||||
b 100f
|
||||
100:
|
||||
ldp x2,x3,[sp],16 // restaur 2 registers
|
||||
ldp x1,lr,[sp],16 // restaur 2 registers
|
||||
ret // return to address lr x30
|
||||
qAdrszLibStart: .quad szLibStart
|
||||
qAdrszExtractArea: .quad szExtractArea
|
||||
qAdrszMessExtractArea: .quad szMessExtractArea
|
||||
qAdrszRetourLigne: .quad szRetourLigne
|
||||
/*********************************************************/
|
||||
/* Text Extraction behind text key */
|
||||
/*********************************************************/
|
||||
/* x0 buffer address */
|
||||
/* x1 key text to search */
|
||||
/* x2 number occurences to key text */
|
||||
/* x3 offset */
|
||||
/* x4 result address */
|
||||
extChaine:
|
||||
stp x1,lr,[sp,-16]! // save registers
|
||||
stp x2,x3,[sp,-16]! // save registers
|
||||
stp x4,x5,[sp,-16]! // save registers
|
||||
stp x6,x7,[sp,-16]! // save registers
|
||||
mov x5,x0 // save buffer address
|
||||
mov x6,x1 // save key text
|
||||
// compute text length
|
||||
mov x8,#0
|
||||
1: // loop
|
||||
ldrb w0,[x5,x8] // load a byte
|
||||
cmp x0,#0 // end ?
|
||||
add x9,x8,1
|
||||
csel x8,x9,x8,ne
|
||||
bne 1b // no -> loop
|
||||
add x8,x8,x5 // compute text end
|
||||
|
||||
mov x7,#0
|
||||
2: // compute length text key
|
||||
ldrb w0,[x6,x7]
|
||||
cmp x0,#0
|
||||
add x9,x7,1
|
||||
csel x7,x9,x7,ne
|
||||
bne 2b
|
||||
|
||||
3: // loop to search niéme(x2) key text
|
||||
mov x0,x5
|
||||
mov x1,x6
|
||||
bl rechercheSousChaine
|
||||
cmp x0,#0
|
||||
blt 100f
|
||||
subs x2,x2,1
|
||||
ble 31f
|
||||
add x5,x5,x0
|
||||
add x5,x5,x7
|
||||
b 3b
|
||||
31:
|
||||
add x0,x0,x5 // add address text to index
|
||||
add x3,x3,x0 // add offset
|
||||
sub x3,x3,1
|
||||
// and add length key text
|
||||
add x3,x3,x7
|
||||
cmp x3,x8 // > at text end
|
||||
bge 98f
|
||||
mov x0,0
|
||||
4: // character loop copy
|
||||
ldrb w2,[x3,x0]
|
||||
strb w2,[x4,x0]
|
||||
cbz x2,99f // text end ? return zero
|
||||
cmp x0,48 // extraction length
|
||||
beq 5f
|
||||
add x0,x0,1
|
||||
b 4b // and loop
|
||||
5:
|
||||
mov x2,0 // store final zéro
|
||||
strb w2,[x4,x0]
|
||||
add x0,x0,1
|
||||
add x0,x0,x3 // x0 return the last position of extraction
|
||||
// it is possible o search another text
|
||||
b 100f
|
||||
98:
|
||||
mov x0,-1 // error
|
||||
b 100f
|
||||
99:
|
||||
mov x0,0
|
||||
100:
|
||||
ldp x6,x7,[sp],16 // restaur 2 registers
|
||||
ldp x4,x5,[sp],16 // restaur 2 registers
|
||||
ldp x2,x3,[sp],16 // restaur 2 registers
|
||||
ldp x1,lr,[sp],16 // restaur 2 registers
|
||||
ret // return to address lr x30
|
||||
/******************************************************************/
|
||||
/* search substring in string */
|
||||
/******************************************************************/
|
||||
/* x0 contains address string */
|
||||
/* x1 contains address substring */
|
||||
/* x0 return start index substring or -1 if not find */
|
||||
rechercheSousChaine:
|
||||
stp x1,lr,[sp,-16]! // save registers
|
||||
stp x2,x3,[sp,-16]! // save registers
|
||||
stp x4,x5,[sp,-16]! // save registers
|
||||
stp x6,x7,[sp,-16]! // save registers
|
||||
mov x2,#0 // index position string
|
||||
mov x3,#0 // index position substring
|
||||
mov x6,#-1 // search index
|
||||
ldrb w4,[x1,x3] // load first byte substring
|
||||
cbz x4,99f // zero final ? error
|
||||
1:
|
||||
ldrb w5,[x0,x2] // load string byte
|
||||
cbz x5,99f // zero final ? yes -> not found
|
||||
cmp x5,x4 // compare character two strings
|
||||
beq 2f
|
||||
mov x6,-1 // not equal - > raz index
|
||||
mov x3,0 // and raz byte counter
|
||||
ldrb w4,[x1,x3] // and load byte
|
||||
add x2,x2,1 // and increment byte counter
|
||||
b 1b // and loop
|
||||
2: // characters equal
|
||||
cmp x6,-1 // first character equal ?
|
||||
csel x6,x2,x6,eq // yes -> start index in x6
|
||||
add x3,x3,1 // increment substring counter
|
||||
ldrb w4,[x1,x3] // and load next byte
|
||||
cbz x4,3f // zero final ? yes -> search end
|
||||
add x2,x2,1 // else increment string index
|
||||
b 1b // and loop
|
||||
3:
|
||||
mov x0,x6 // return start index substring in the string
|
||||
b 100f
|
||||
99:
|
||||
mov x0,-1 // not found
|
||||
100:
|
||||
ldp x6,x7,[sp],16 // restaur 2 registers
|
||||
ldp x4,x5,[sp],16 // restaur 2 registers
|
||||
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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue