/* ARM assembly AARCH64 Raspberry PI 3B */ /* program inputXml64.s */ /*******************************************/ /* Constantes file */ /*******************************************/ /* for this file see task include a file in language AArch64 assembly*/ .include "../includeConstantesARM64.inc" /* program constantes */ .equ XML_ELEMENT_NODE, 1 .equ XML_ATTRIBUTE_NODE, 2 .equ XML_TEXT_NODE, 3 .equ XML_CDATA_SECTION_NODE, 4 .equ XML_ENTITY_REF_NODE, 5 .equ XML_ENTITY_NODE, 6 .equ XML_PI_NODE, 7 .equ XML_COMMENT_NODE, 8 .equ XML_DOCUMENT_NODE, 9 .equ XML_DOCUMENT_TYPE_NODE, 10 .equ XML_DOCUMENT_FRAG_NODE, 11 .equ XML_NOTATION_NODE, 12 .equ XML_HTML_DOCUMENT_NODE, 13 .equ XML_DTD_NODE, 14 .equ XML_ELEMENT_DECL, 15 .equ XML_ATTRIBUTE_DECL, 16 .equ XML_ENTITY_DECL, 17 .equ XML_NAMESPACE_DECL, 18 .equ XML_XINCLUDE_START, 19 .equ XML_XINCLUDE_END, 20 .equ XML_DOCB_DOCUMENT_NODE, 21 /*******************************************/ /* Structures */ /********************************************/ /* structure xmlNode */ .struct 0 xmlNode_private: // application data .struct xmlNode_private + 8 xmlNode_type: // type number, must be second ! .struct xmlNode_type + 8 xmlNode_name: // the name of the node, or the entity .struct xmlNode_name + 8 xmlNode_children: // parent->childs link .struct xmlNode_children + 8 xmlNode_last: // last child link .struct xmlNode_last + 8 xmlNode_parent: // child->parent link .struct xmlNode_parent + 8 xmlNode_next: // next sibling link .struct xmlNode_next + 8 xmlNode_prev: // previous sibling link .struct xmlNode_prev + 8 xmlNode_doc: // the containing document .struct xmlNode_doc + 8 xmlNode_ns: // pointer to the associated namespace .struct xmlNode_ns + 8 xmlNode_content: // the content .struct xmlNode_content + 8 xmlNode_properties: // properties list .struct xmlNode_properties + 8 xmlNode_nsDef: // namespace definitions on this node .struct xmlNode_nsDef + 8 xmlNode_psvi: // for type/PSVI informations .struct xmlNode_psvi + 8 xmlNode_line: // line number .struct xmlNode_line + 4 xmlNode_extra: // extra data for XPath/XSLT .struct xmlNode_extra + 4 xmlNode_fin: /*********************************/ /* Initialized data */ /*********************************/ .data szMessEndpgm: .asciz "Normal end of program.\n" szMessError: .asciz "Error detected !!!!. \n" szText: .ascii "\n" .ascii "\n" .ascii "\n" .ascii "\n" .ascii "\n" .ascii "\n" .ascii "\n" .ascii "\n" .asciz "" .equ LGSZTEXT, . - szText // compute text size (. is current address) szLibExtract: .asciz "Student" szLibName: .asciz "Name" szCarriageReturn: .asciz "\n" /*********************************/ /* UnInitialized data */ /*********************************/ .bss .align 4 /*********************************/ /* code section */ /*********************************/ .text .global main main: // entry of program ldr x0,qAdrszText // text buffer mov x1,#LGSZTEXT // text size mov x2,#0 // param 3 mov x3,#0 // param 4 mov x4,#0 // param 5 bl xmlReadMemory // read text in document cmp x0,#0 // error ? beq 99f mov x19,x0 // doc address mov x0,x19 bl xmlDocGetRootElement // search root return in x0 bl affElement // display elements mov x0,x19 bl xmlFreeDoc bl xmlCleanupParser ldr x0,qAdrszMessEndpgm bl affichageMess b 100f 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 qAdrszMessError: .quad szMessError qAdrszMessEndpgm: .quad szMessEndpgm qAdrszText: .quad szText qAdrszCarriageReturn: .quad szCarriageReturn /******************************************************************/ /* display name of student */ /******************************************************************/ /* x0 contains the address of node */ affElement: stp x24,lr,[sp,-16]! // save registers mov x24,x0 // save node 1: ldr x12,[x24,#xmlNode_type] // type ? cmp x12,#XML_ELEMENT_NODE bne 2f ldr x0,[x24,#xmlNode_name] // name = "Student" ? ldr x1,qAdrszLibExtract bl comparString cmp x0,#0 bne 2f // no mov x0,x24 ldr x1,qAdrszLibName // load property of "Name" bl xmlHasProp cmp x0,#0 beq 2f ldr x1,[x0,#xmlNode_children] // children node of property name ldr x0,[x1,#xmlNode_content] // and address of content bl affichageMess // for display ldr x0,qAdrszCarriageReturn bl affichageMess 2: ldr x0,[x24,#xmlNode_children] // node have children ? cbz x0,3f bl affElement // yes -> call procedure 3: ldr x1,[x24,#xmlNode_next] // other element ? cmp x1,#0 beq 100f // no -> end procedure mov x24,x1 // else loop with next element b 1b 100: ldp x24,lr,[sp],16 // restaur 2 registers ret // return to address lr x30 qAdrszLibName: .quad szLibName qAdrszLibExtract: .quad szLibExtract /************************************/ /* Strings comparaison */ /************************************/ /* x0 et x1 contains strings addresses */ /* x0 return 0 dans x0 if equal */ /* return -1 if string x0 < string x1 */ /* return 1 if string x0 > string x1 */ comparString: stp x2,lr,[sp,-16]! // save registers stp x3,x4,[sp,-16]! // save registers mov x2,#0 // indice 1: ldrb w3,[x0,x2] // one byte string 1 ldrb w4,[x1,x2] // one byte string 2 cmp w3,w4 blt 2f // less bgt 3f // greather cmp w3,#0 // 0 final beq 4f // equal and end add x2,x2,#1 // b 1b // else loop 2: mov x0,#-1 // less b 100f 3: mov x0,#1 // greather b 100f 4: mov x0,#0 // equal b 100f 100: ldp x3,x4,[sp],16 // restaur 2 registers ldp x2,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"