[
  {
    "path": ".github/workflows/directory_workflow.yml",
    "content": "name: directory_md\non: [push, pull_request]\n\njobs:\n  MainSequence:\n    name: DIRECTORY.md\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1 # v2 is broken for git diff\n      - uses: actions/setup-python@v2\n      - name: Setup Git Specs\n        run: |\n          git config --global user.name github-actions\n          git config --global user.email '${GITHUB_ACTOR}@users.noreply.github.com'\n          git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY\n      - name: Update DIRECTORY.md\n        shell: python\n        run: |\n            import os\n            from typing import Iterator\n            URL_BASE = \"https://github.com/TheAlgorithms/AArch64_Assembly/blob/main\"\n            g_output = []\n            def good_filepaths(top_dir: str = \".\") -> Iterator[str]:\n                fs_exts = tuple(\".asm .s\".split())\n                for dirpath, dirnames, filenames in os.walk(top_dir):\n                    dirnames[:] = [d for d in dirnames if d[0] not in \"._\"]\n                    for filename in filenames:\n                        if os.path.splitext(filename)[1].lower() in fs_exts:\n                            yield os.path.join(dirpath, filename).lstrip(\"./\")\n            def md_prefix(i):\n                return f\"{i * '  '}*\" if i else \"\\n##\"\n            def print_path(old_path: str, new_path: str) -> str:\n                global g_output\n                old_parts = old_path.split(os.sep)\n                for i, new_part in enumerate(new_path.split(os.sep)):\n                    if i + 1 > len(old_parts) or old_parts[i] != new_part:\n                        if new_part:\n                            g_output.append(f\"{md_prefix(i)} {new_part.replace('_', ' ').title()}\")\n                return new_path\n            def build_directory_md(top_dir: str = \".\") -> str:\n                global g_output\n                old_path = \"\"\n                for filepath in sorted(good_filepaths(), key=str.lower):\n                    filepath, filename = os.path.split(filepath)\n                    if filepath != old_path:\n                        old_path = print_path(old_path, filepath)\n                    indent = (filepath.count(os.sep) + 1) if filepath else 0\n                    url = \"/\".join((URL_BASE, filepath, filename)).replace(\" \", \"%20\")\n                    filename = os.path.splitext(filename.replace(\"_\", \" \").title())[0]\n                    g_output.append(f\"{md_prefix(indent)} [{filename}]({url})\")\n                return \"# List of all files\\n\" + \"\\n\".join(g_output)\n            with open(\"DIRECTORY.md\", \"w\") as out_file:\n                out_file.write(build_directory_md(\".\") + \"\\n\")\n      - name: Commit DIRECTORY.md\n        run: |\n         git commit -m \"updating DIRECTORY.md\" DIRECTORY.md ||  true\n         git diff DIRECTORY.md\n         git push --force origin HEAD:$GITHUB_REF || true\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at siryaka@gmail.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nWhen contributing to this repository, if your changes are subjective, controversial or people are likely to have\npolarized opinions on this matter, please first discuss the change you wish to make via issue with the owners of\nthis repository.\n\nWe welcome adding new algorithms and data structures that were mentioned in books or other reputable sources.\nWe also welcome fixing bugs in code, clarifying documentation and adding new test cases to check existing code.\n\nPlease note that we have a code of conduct, please follow it in all your interactions with the project.\n"
  },
  {
    "path": "DIRECTORY.md",
    "content": "# List of all files\n\n## Misc\n  * [2048](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/2048.s)\n  * [Hello World](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/hello_world.s)\n  * [Josephus Problem](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/josephus_problem.s)\n  * [Perfect Numbers](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/perfect_numbers.s)\n  * [Sha1](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/sha1.s)\n  * [Sha256](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/sha256.s)\n  * [Y Combinator](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/y_combinator.s)\n\n## Sorters\n  * [Bead Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/bead_sort.s)\n  * [Bogo Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/bogo_sort.s)\n  * [Bubble Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/bubble_sort.s)\n  * [Circle Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/circle_sort.s)\n  * [Cocktail Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/cocktail_sort.s)\n  * [Comb Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/comb_sort.s)\n  * [Counting Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/counting_sort.s)\n  * [Gnome Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/gnome_sort.s)\n  * [Heap Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/heap_sort.s)\n  * [Insertion Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/insertion_sort.s)\n  * [Jort Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/jort_sort.s)\n  * [Merge Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/merge_sort.s)\n  * [Pancake Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/pancake_sort.s)\n  * [Patience Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/patience_sort.s)\n  * [Permutation Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/permutation_sort.s)\n  * [Quick Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/quick_sort.s)\n  * [Radix Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/radix_sort.s)\n  * [Selection Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/selection_sort.s)\n  * [Shell Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/shell_sort.s)\n\n## String\n  * [Append](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/append.s)\n  * [Comparison](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/comparison.s)\n  * [Concatenation](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/concatenation.s)\n  * [Interpolation](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/interpolation.s)\n  * [Length](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/length.s)\n  * [Matching](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/matching.s)\n  * [Prepend](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/prepend.s)\n  * [Substring](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/substring.s)\n  * [Tokenize String](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/tokenize_string.s)\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 The Algorithms\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# The Algorithms - AArch64_Assembly\nThis repository contains algorithms and data structures implemented in AArch64 Assembly for eductional purposes.\n\n## Contribution\nYou can contribute with pleasure to this repository. Please orient on the directory structure and overall code style of this repository. If you want to ask a question or suggest something, please open an issue.\n"
  },
  {
    "path": "misc/2048.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/2048\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program 2048.s   */ \n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n.equ SIZE,       4       \n.equ TOTAL,      2048\n.equ BUFFERSIZE, 80\n \n.equ KEYSIZE,    8\n.equ IOCTL,     0x1D  // Linux syscall\n.equ SIGACTION, 0x86  // Linux syscall\n.equ SYSPOLL,   0x16  // Linux syscall\n.equ CREATPOLL, 0x14  // Linux syscall\n.equ CTLPOLL,   0x15  // Linux syscall\n \n.equ TCGETS,    0x5401\n.equ TCSETS,    0x5402\n.equ ICANON,    2\n.equ ECHO,     10\n.equ POLLIN,    1\n.equ EPOLL_CTL_ADD,    1\n \n.equ SIGINT,   2      // Issued if the user sends an interrupt signal (Ctrl + C)\n.equ SIGQUIT,  3      // Issued if the user sends a quit signal (Ctrl + D)\n.equ SIGTERM, 15      // Software termination signal (sent by kill by default)\n.equ SIGTTOU, 22\n \n/*******************************************/\n/* Structures                               */\n/********************************************/\n/* structure termios see doc linux*/\n    .struct  0\nterm_c_iflag:                    // input modes\n    .struct  term_c_iflag + 4 \nterm_c_oflag:                    // output modes\n    .struct  term_c_oflag + 4 \nterm_c_cflag:                    // control modes\n    .struct  term_c_cflag + 4 \nterm_c_lflag:                    // local modes\n    .struct  term_c_lflag + 4 \nterm_c_cc:                       // special characters\n    .struct  term_c_cc + 40      // see length if necessary \nterm_fin:\n \n/* structure sigaction see doc linux */\n    .struct  0\nsa_handler:\n    .struct  sa_handler + 8 \nsa_mask:\n    .struct  sa_mask + 8 \nsa_flags:\n    .struct  sa_flags + 8\nsa_sigaction:\n    .struct  sa_sigaction + 8\nsa_fin:\n \n/* structure poll see doc linux */\n    .struct  0\npoll_event:                        //  events mask\n    .struct  poll_event + 8\npoll_fd:                           // events returned\n    .struct  poll_fd  + 8\npoll_fin:\n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessOK:           .asciz \"Bravo !! You win. \\n\"\nszMessNotOK:        .asciz \"You lost !! \\n\"\nszMessNewGame:      .asciz \"New game (y/n) ? \\n\"\nszMessErreur:       .asciz \"Error detected.\\n\"\nszMessErrInitTerm:  .asciz \"Error terminal init.\\n\"\nszMessErrInitPoll:  .asciz \"Error poll init.\\n\"\nszMessErreurKey:    .asciz \"Error read key.\\n\"\nszMessErr:          .asciz    \"Error code hexa : @ décimal : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\nszMess0:            .asciz \"      \"\nszMess2:            .asciz \"   2  \"\nszMess4:            .asciz \"   4  \"\nszMess8:            .asciz \"   8  \"\nszMess16:           .asciz \"  16  \"\nszMess32:           .asciz \"  32  \"\nszMess64:           .asciz \"  64  \"\nszMess128:          .asciz \" 128  \"\nszMess256:          .asciz \" 256  \"\nszMess512:          .asciz \" 512  \"\nszMess1024:         .asciz \" 1024 \"\nszMess2048:         .asciz \" 2048 \"\nszCleax1:           .byte 0x1B \n                    .byte 'c'           // other console clear\n                    .byte 0\n \nszLineH:            .asciz \"-----------------------------\\n\"\nszLineV:            .asciz \"|\"\nszLineVT:           .asciz \"|      |      |      |      |\\n\"\n.align 4\nqGraine:            .quad 123456\n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\n.align 4\nsZoneConv:      .skip 24\nsBuffer:        .skip BUFFERSIZE\nqTbCase:        .skip 8 * SIZE * SIZE\nqEnd:           .skip 8                        // 0 loop  1 = end loop\nqTouche:        .skip KEYSIZE                  // value key pressed\nstOldtio:       .skip term_fin                 // old terminal state\nstCurtio:       .skip term_fin                 // current terminal state\nstSigAction:    .skip sa_fin                   // area signal structure\nstSigAction1:   .skip sa_fin\nstSigAction2:   .skip sa_fin\nstSigAction3:   .skip sa_fin\nstPoll1:        .skip poll_fin                 // area poll structure\nstPoll2:        .skip poll_fin\nstevents:       .skip 16\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main\nmain:                                // entry of program \n    mov x0,#0\n    bl initTerm                      // terminal init\n    cmp x0,0                         // error ?\n    blt 100f\n    bl initPoll                      // epoll instance init\n    cmp x0,0\n    blt 99f\n    mov x22,x0                        // save epfd\n1:                                    // begin game loop\n    ldr x0,qAdrszCleax1\n    bl affichageMess\n    bl razTable\n2:\n    bl addDigit   \n    cmp x0,#-1\n    beq 5f                            // end game\n    bl displayGame\n3:\n    mov x0,x22\n    bl waitKey\n    cmp x0,0\n    beq 3b\n    bl readKey\n    cmp x0,#-1\n    beq 99f                          // error\n    bl keyMove\n    cmp x0,#0\n    beq 3b                            // no change -> loop\n    cmp x0,#2                         // last addition = 2048 ?\n    beq 4f\n    cmp x0,#-1                        // quit ?\n    bne 2b                            // loop\n \n    b 10f\n4:                                    // last addition = 2048 \n    ldr x0,qAdrszMessOK\n    bl affichageMess\n    b 10f\n5:                                    // display message no solution\n    ldr x0,qAdrszMessNotOK\n    bl affichageMess\n \n10:                                   // display new game ?\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    ldr x0,qAdrszMessNewGame\n    bl affichageMess\n11:\n    mov x0,x22\n    bl waitKey\n    cmp x0,0\n    beq 11b\n    bl readKey\n    ldr x0,qAdrqTouche\n    ldrb w0,[x0]\n    cmp w0,#'y'\n    beq 1b\n    cmp w0,#'Y'\n    beq 1b\n99:\n    bl restauTerm                     // terminal restaur\n100:                                  // standard end of the program \n    mov x0, #0                        // return code\n    mov x8, #EXIT                     // request to exit program\n    svc #0                            // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrszMessNotOK:          .quad szMessNotOK\nqAdrszMessOK:             .quad szMessOK\nqAdrszMessNewGame:        .quad szMessNewGame\nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCleax1:             .quad szCleax1\nqAdrszMessErrInitTerm:    .quad szMessErrInitTerm\nqAdrszMessErrInitPoll:    .quad szMessErrInitPoll\nqAdrszMessErreurKey:      .quad szMessErreurKey\nqAdrstOldtio:             .quad stOldtio\nqAdrstCurtio:             .quad stCurtio\nqAdrstSigAction:          .quad stSigAction\nqAdrstSigAction1:         .quad stSigAction1\nqAdrSIG_IGN:              .quad 1\nqAdrqEnd:                 .quad qEnd\nqAdrqTouche:              .quad qTouche\nqAdrstevents:             .quad stevents\n/******************************************************************/\n/*     raz table cases                                                   */ \n/******************************************************************/\nrazTable:\n    stp x0,lr,[sp,-16]!     // save  registres\n    stp x1,x2,[sp,-16]!     // save  registres\n    ldr x1,qAdrqTbCase\n    mov x2,#0\n1:\n    str xzr,[x1,x2,lsl #3]\n    add x2,x2,#1\n    cmp x2,#SIZE * SIZE\n    blt 1b\n100:\n    ldp x1,x2,[sp],16       // restaur des  2 registres\n    ldp x0,lr,[sp],16       // restaur des  2 registres\n    ret\n/******************************************************************/\n/*     key move                                                   */ \n/******************************************************************/\n/* x0 contains key value               */\nkeyMove:\n    stp x1,lr,[sp,-16]!     // save  registres\n    lsr x0,x0,#16\n    cmp x0,#0x42                  // down arrow \n    bne 1f\n    bl moveDown\n    b 100f\n1:\n    cmp x0,#0x41                  // high arrow\n    bne 2f\n    bl moveUp\n    b 100f\n2:\n    cmp x0,#0x43                  // right arrow\n    bne 3f\n    bl moveRight\n    b 100f\n3:\n    cmp x0,#0x44                  // left arrow\n    bne 4f\n    bl moveLeft\n    b 100f\n4:\n    ldr x0,qAdrqTouche\n    ldrb w0,[x0]\n    cmp w0,#'q'                   // quit game\n    bne 5f\n    mov x0,#-1\n    b 100f\n5:\n    cmp w0,#'Q'                   // quit game\n    bne 100f\n    mov x0,#-1\n    b 100f\n \n100:\n    ldp x1,lr,[sp],16       // restaur des  2 registres\n    ret\n/******************************************************************/\n/*           move left                                   */ \n/******************************************************************/\n/* x0 return -1 if ok     */\nmoveLeft:\n    stp x1,lr,[sp,-16]!          // save  registres\n    stp x2,x3,[sp,-16]!          // save  registres\n    stp x4,x5,[sp,-16]!          // save  registres\n    stp x6,x7,[sp,-16]!          // save  registres\n    stp x8,x9,[sp,-16]!          // save  registres\n    stp x10,x11,[sp,-16]!        // save  registres\n    ldr x1,qAdrqTbCase\n    mov x0,#0                   // top move Ok\n    mov x2,#0                   // line indice\n1:\n    mov x6,#0                   // counter empty case\n    mov x7,#0                   // first digit\n    mov x10,#0                  // last digit to add\n    mov x3,#0                   // column indice\n2:\n    lsl x5,x2,#2                // change this if size <> 4\n    add x5,x5,x3                // compute table indice\n    ldr x4,[x1,x5,lsl #3]\n    cmp x4,#0\n    cinc x6,x6,eq               // positions vides\n    beq 5f\n    cmp x6,#0\n    beq 3f                      // no empty left case\n    mov x8,#0\n    str x8,[x1,x5,lsl #3]       // raz digit\n    sub x5,x5,x6\n    str x4,[x1,x5,lsl #3]       // and store to left empty position\n    mov x0,#1                   // move Ok\n3:\n    cmp x7,#0                   // first digit\n    beq 4f\n    cmp x10,x4                  // prec digit have to add \n    beq 4f\n    sub x8,x5,#1                // prec digit \n    ldr x9,[x1,x8,lsl #3]\n    cmp x4,x9                   // equal ?\n    bne 4f\n    mov x10,x4                  // save digit \n    add x4,x4,x9                // yes -> add\n    str x4,[x1,x8,lsl #3]\n    cmp x4,#TOTAL\n    beq 6f\n    mov x4,#0\n    str x4,[x1,x5,lsl #3]\n    add x6,x6,#1                // empty case + 1\n    mov x0,#1                   // move Ok\n4:\n    add x7,x7,#1                // no first digit\n \n5:                              // and loop\n    add x3,x3,#1\n    cmp x3,#SIZE\n    blt 2b\n    add x2,x2,#1\n    cmp x2,#SIZE\n    blt 1b\n    b 100f\n6:\n    mov x0,#2                   // total = 2048\n100:\n    ldp x10,x11,[sp],16         // restaur des  2 registres\n    ldp x8,x9,[sp],16           // restaur des  2 registres\n    ldp x6,x7,[sp],16           // restaur des  2 registres\n    ldp x4,x5,[sp],16           // restaur des  2 registres\n    ldp x2,x3,[sp],16           // restaur des  2 registres\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\n/******************************************************************/\n/*           move right                                   */ \n/******************************************************************/\n/* x0 return -1 if ok     */\nmoveRight:\n    stp x1,lr,[sp,-16]!          // save  registres\n    stp x2,x3,[sp,-16]!          // save  registres\n    stp x4,x5,[sp,-16]!          // save  registres\n    stp x6,x7,[sp,-16]!          // save  registres\n    stp x8,x9,[sp,-16]!          // save  registres\n    stp x10,x11,[sp,-16]!        // save  registres\n    ldr x1,qAdrqTbCase\n    mov x0,#0\n    mov x2,#0\n1:\n    mov x6,#0\n    mov x7,#0\n    mov x10,#0\n    mov x3,#SIZE-1\n2:\n    lsl x5,x2,#2                  // change this if size <> 4\n    add x5,x5,x3\n    ldr x4,[x1,x5,lsl #3]\n    cmp x4,#0\n    cinc x6,x6,eq               // positions vides\n    beq 5f\n \n    cmp x6,#0\n    beq 3f                      // no empty right case\n    mov x0,#0\n    str x0,[x1,x5,lsl #3]       // raz digit\n    add x5,x5,x6\n    str x4,[x1,x5,lsl #3]       // and store to right empty position\n    mov x0,#1\n3:\n    cmp x7,#0                   // first digit\n    beq 4f\n    add x8,x5,#1                // next digit \n    ldr x9,[x1,x8,lsl #3]\n    cmp x4,x9                   // equal ?\n    bne 4f\n    cmp x10,x4\n    beq 4f\n    mov x10,x4\n    add x4,x4,x9                // yes -> add\n    str x4,[x1,x8,lsl #3]\n    cmp x4,#TOTAL\n    beq 6f\n    mov x4,#0\n    str x4,[x1,x5,lsl #3]\n    add x6,x6,#1                // empty case + 1\n    mov x0,#1\n4:\n    add x7,x7,#1                // no first digit\n \n5:                              // and loop\n    sub x3,x3,#1\n    cmp x3,#0\n    bge 2b\n    add x2,x2,#1\n    cmp x2,#SIZE\n    blt 1b\n    b 100f\n6:\n    mov x0,#2\n100:\n    ldp x10,x11,[sp],16         // restaur des  2 registres\n    ldp x8,x9,[sp],16           // restaur des  2 registres\n    ldp x6,x7,[sp],16           // restaur des  2 registres\n    ldp x4,x5,[sp],16           // restaur des  2 registres\n    ldp x2,x3,[sp],16           // restaur des  2 registres\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\n/******************************************************************/\n/*           move down                                   */ \n/******************************************************************/\n/* x0 return -1 if ok     */\nmoveDown:\n    stp x1,lr,[sp,-16]!          // save  registres\n    stp x2,x3,[sp,-16]!          // save  registres\n    stp x4,x5,[sp,-16]!          // save  registres\n    stp x6,x7,[sp,-16]!          // save  registres\n    stp x8,x9,[sp,-16]!          // save  registres\n    stp x10,x11,[sp,-16]!        // save  registres\n    ldr x1,qAdrqTbCase\n    mov x0,#0\n    mov x3,#0\n1:\n    mov x6,#0\n    mov x7,#0\n    mov x10,#0\n    mov x2,#SIZE-1\n2:\n    lsl x5,x2,#2                  // change this if size <> 4\n    add x5,x5,x3\n    ldr x4,[x1,x5,lsl #3]\n    cmp x4,#0\n    cinc x6,x6,eq               // positions vides\n    beq 5f\n    cmp x6,#0\n    beq 3f                      // no empty right case\n    mov x0,#0\n    str x0,[x1,x5,lsl #3]       // raz digit\n    lsl x0,x6,#2\n    add x5,x5,x0\n    str x4,[x1,x5,lsl #3]       // and store to right empty position\n    mov x0,#1\n3:\n    cmp x7,#0                   // first digit\n    beq 4f\n    add x8,x5,#SIZE                // down digit \n    ldr x9,[x1,x8,lsl #3]\n    cmp x4,x9                   // equal ?\n    bne 4f\n    cmp x10,x4\n    beq 4f\n    mov x10,x4\n    add x4,x4,x9                // yes -> add\n    str x4,[x1,x8,lsl #3]\n    cmp x4,#TOTAL\n    beq 6f\n    mov x4,#0\n    str x4,[x1,x5,lsl #3]\n    add x6,x6,#1                // empty case + 1\n    mov x0,#1\n4:\n    add x7,x7,#1                   // no first digit\n \n5:                           // and loop\n    sub x2,x2,#1\n    cmp x2,#0\n    bge 2b\n    add x3,x3,#1\n    cmp x3,#SIZE\n    blt 1b\n    b 100f\n6:\n    mov x0,#2\n100:\n    ldp x10,x11,[sp],16         // restaur des  2 registres\n    ldp x8,x9,[sp],16           // restaur des  2 registres\n    ldp x6,x7,[sp],16           // restaur des  2 registres\n    ldp x4,x5,[sp],16           // restaur des  2 registres\n    ldp x2,x3,[sp],16           // restaur des  2 registres\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\n/******************************************************************/\n/*           move up                                   */ \n/******************************************************************/\n/* x0 return -1 if ok     */\nmoveUp:\n    stp x1,lr,[sp,-16]!          // save  registres\n    stp x2,x3,[sp,-16]!          // save  registres\n    stp x4,x5,[sp,-16]!          // save  registres\n    stp x6,x7,[sp,-16]!          // save  registres\n    stp x8,x9,[sp,-16]!          // save  registres\n    stp x10,x11,[sp,-16]!        // save  registres\n    ldr x1,qAdrqTbCase\n    mov x0,#0\n    mov x3,#0\n1:\n    mov x6,#0\n    mov x7,#0\n    mov x10,#0\n    mov x2,#0\n2:\n    lsl x5,x2,#2                  // change this if size <> 4\n    add x5,x5,x3\n    ldr x4,[x1,x5,lsl #3]\n    cmp x4,#0\n    cinc x6,x6,eq               // positions vides\n    beq 5f\n    cmp x6,#0\n    beq 3f                      // no empty right case\n    mov x0,#0\n    str x0,[x1,x5,lsl #3]       // raz digit\n    lsl x0,x6,#2\n    sub x5,x5,x0\n    str x4,[x1,x5,lsl #3]       // and store to right empty position\n    mov x0,#1\n3:\n    cmp x7,#0                   // first digit\n    beq 4f\n    sub x8,x5,#SIZE             // up digit \n    ldr x9,[x1,x8,lsl #3]\n    cmp x4,x9                   // equal ?\n    bne 4f\n    cmp x10,x4\n    beq 4f\n    mov x10,x4\n    add x4,x4,x9                // yes -> add\n    str x4,[x1,x8,lsl #3]\n    cmp x4,#TOTAL\n    beq 6f\n    mov x4,#0\n    str x4,[x1,x5,lsl #3]\n    add x6,x6,#1                // empty case + 1\n    mov x0,#1\n4:\n    add x7,x7,#1                // no first digit\n \n5:                              // and loop\n    add x2,x2,#1\n    cmp x2,#SIZE\n    blt 2b\n    add x3,x3,#1\n    cmp x3,#SIZE\n    blt 1b\n    b 100f\n6:\n    mov x0,#2\n100:\n    ldp x10,x11,[sp],16         // restaur des  2 registres\n    ldp x8,x9,[sp],16           // restaur des  2 registres\n    ldp x6,x7,[sp],16           // restaur des  2 registres\n    ldp x4,x5,[sp],16           // restaur des  2 registres\n    ldp x2,x3,[sp],16           // restaur des  2 registres\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\n/******************************************************************/\n/*           add new digit on game                                   */ \n/******************************************************************/\n/* x0 return -1 if ok     */\naddDigit:\n    stp x1,lr,[sp,-16]!          // save  registres\n    stp x2,x3,[sp,-16]!          // save  registres\n    stp x4,x5,[sp,-16]!          // save  registres\n    sub sp,sp,#8 * SIZE*SIZE\n    mov fp,sp\n \n    mov x0,#100\n    bl genereraleas\n    cmp x0,#10\n    mov x1,#4\n    mov x5,#2\n    csel x5,x5,x1,ge\n   // movlt x5,#4\n    //movge x5,#2\n    ldr x1,qAdrqTbCase\n    mov x3,#0\n    mov x4,#0\n1:  \n    ldr x2,[x1,x3,lsl 3]\n    cmp x2,#0\n    bne 2f\n    str x3,[fp,x4,lsl 3]\n    add x4,x4,#1\n2:\n    add x3,x3,#1\n    cmp x3,#SIZE*SIZE\n    blt 1b\n    cmp x4,#0                 // no empty case\n    beq 4f\n    cmp x4,#1\n    bne 3f\n    ldr x2,[fp]               // one case\n    str x5,[x1,x2,lsl 3]\n    mov x0,#0\n    b 100f\n3:                            // multiple case\n    sub x0,x4,#1\n    bl genereraleas\n    ldr x2,[fp,x0,lsl 3]\n    str x5,[x1,x2,lsl 3]\n    mov x0,#0\n    b 100f\n4:\n    mov x0,#-1\n100:\n    add sp,sp,#8*  (SIZE*SIZE)  // stack alignement\n    ldp x4,x5,[sp],16           // restaur des  2 registres\n    ldp x2,x3,[sp],16           // restaur des  2 registres\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\nqAdrqTbCase:         .quad qTbCase\n/******************************************************************/\n/*            display game                                      */ \n/******************************************************************/\ndisplayGame:\n    stp x1,lr,[sp,-16]!          // save  registres\n    stp x2,x3,[sp,-16]!          // save  registres\n    ldr x0,qAdrszCleax1\n    bl affichageMess\n    ldr x0,qAdrszLineH\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n    ldr x1,qAdrqTbCase\n    mov x2,#0\n1:\n    ldr x0,[x1,x2,lsl #3]\n    bl digitString\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n    add x2,x2,#1\n    cmp x2,#SIZE\n    blt 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineH\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n2:\n    ldr x0,[x1,x2,lsl #3]\n    bl digitString\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n    add x2,x2,#1\n    cmp x2,#SIZE*2\n    blt 2b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineH\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n3:\n    ldr x0,[x1,x2,lsl #3]\n    bl digitString\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n    add x2,x2,#1\n    cmp x2,#SIZE*3\n    blt 3b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineH\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n4:\n    ldr x0,[x1,x2,lsl #3]\n    bl digitString\n    bl affichageMess\n    ldr x0,qAdrszLineV\n    bl affichageMess\n    add x2,x2,#1\n    cmp x2,#SIZE*4\n    blt 4b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    ldr x0,qAdrszLineVT\n    bl affichageMess\n    ldr x0,qAdrszLineH\n    bl affichageMess\n \n100:\n    ldp x2,x3,[sp],16           // restaur des  2 registres\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\nqAdrszLineH:         .quad szLineH\nqAdrszLineV:         .quad szLineV\nqAdrszLineVT:        .quad szLineVT\n/******************************************************************/\n/*            digits string                                       */ \n/******************************************************************/\n/* x0 contains number */\n/* x0 return address string */\ndigitString:\n    stp x1,lr,[sp,-16]!          // save  registres\n    cmp x0,#0\n    bne 1f\n    ldr x0,qAdrszMess0\n    b 100f\n1:\n    cmp x0,#2\n    bne 2f\n    ldr x0,qAdrszMess2\n    b 100f\n2:\n    cmp x0,#4\n    bne 3f\n    ldr x0,qAdrszMess4\n    b 100f\n3:\n    cmp x0,#8\n    bne 4f\n    ldr x0,qAdrszMess8\n    b 100f\n4:\n    cmp x0,#16\n    bne 5f\n    ldr x0,qAdrszMess16\n    b 100f\n5:\n    cmp x0,#32\n    bne 6f\n    ldr x0,qAdrszMess32\n    b 100f\n6:\n    cmp x0,#64\n    bne 7f\n    ldr x0,qAdrszMess64\n    b 100f\n7:\n    cmp x0,#128\n    bne 8f\n    ldr x0,qAdrszMess128\n    b 100f\n8:\n    cmp x0,#256\n    bne 9f\n    ldr x0,qAdrszMess256\n    b 100f\n9:\n    cmp x0,#512\n    bne 10f\n    ldr x0,qAdrszMess512\n    b 100f\n10:\n    cmp x0,#1024\n    bne 11f\n    ldr x0,qAdrszMess1024\n    b 100f\n11:\n    cmp x0,#2048\n    bne 12f\n    ldr x0,qAdrszMess2048\n    b 100f\n12:\n    ldr x1,qAdrszMessErreur                       // error message\n    bl   displayError\n100:\n    ldp x1,lr,[sp],16           // restaur des  2 registres\n    ret\nqAdrszMess0:          .quad szMess0\nqAdrszMess2:          .quad szMess2\nqAdrszMess4:          .quad szMess4\nqAdrszMess8:          .quad szMess8\nqAdrszMess16:         .quad szMess16\nqAdrszMess32:         .quad szMess32\nqAdrszMess64:         .quad szMess64\nqAdrszMess128:        .quad szMess128\nqAdrszMess256:        .quad szMess256\nqAdrszMess512:        .quad szMess512\nqAdrszMess1024:       .quad szMess1024\nqAdrszMess2048:        .quad szMess2048\n \n//qAdrsBuffer:         .quad sBuffer\nqAdrszMessErreur :        .quad szMessErreur \n \n/***************************************************/\n/*   Generation random number                  */\n/***************************************************/\n/* x0 contains limit  */\ngenereraleas:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    ldr x1,qAdrqGraine\n    ldr x2,[x1]\n    ldr x3,qNbDep1\n    mul x2,x3,x2\n    ldr x3,qNbDep2\n    add x2,x2,x3\n    str x2,[x1]                    // maj de la graine pour l appel suivant \n    cmp x0,#0\n    beq 100f\n    udiv x3,x2,x0\n    msub x0,x3,x0,x2               // résult = remainder\n \n100:                               // end function\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/*****************************************************/\nqAdrqGraine: .quad qGraine\nqNbDep1:     .quad 0x0019660d\nqNbDep2:     .quad 0x3c6ef35f\n \n/******************************************************************/\n/*     traitement du signal                                       */ \n/******************************************************************/\nsighandler:\n    stp x0,lr,[sp,-16]!            // save  registers\n    str x1,[sp,-16]! \n    ldr x0,qAdrqEnd\n    mov x1,#1                      // maj zone end\n    str x1,[x0]\n    ldr x1,[sp],16\n    ldp x0,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/***************************************************/\n/*   display error message                         */\n/***************************************************/\n/* x0 contains error code  x1 : message address */\ndisplayError:\n    stp x2,lr,[sp,-16]!            // save  registers\n    mov x2,x0                      // save error code\n    mov x0,x1\n    bl affichageMess\n    mov x0,x2                      // error code\n    ldr x1,qAdrsZoneConv\n    bl conversion16                // conversion hexa\n    ldr x0,qAdrszMessErr           // display error message\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc               // insert result at @ character\n    mov x3,x0\n    mov x0,x2                      // error code\n    ldr x1,qAdrsZoneConv               // result address\n    bl conversion10S                // conversion decimale\n    mov x0,x3\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc               // insert result at @ character\n    bl affichageMess\n100:\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\nqAdrszMessErr:                 .quad szMessErr\n/*********************************/\n/* init terminal state            */\n/*********************************/\ninitTerm:\n    stp x1,lr,[sp,-16]!            // save  registers\n    /* read terminal state */\n    mov x0,STDIN                   // input console\n    mov x1,TCGETS\n    ldr x2,qAdrstOldtio\n    mov x8,IOCTL                   // call system Linux\n    svc 0 \n    cbnz x0,98f                    // error ?\n \n    adr x0,sighandler              // adresse routine traitement signal\n    ldr x1,qAdrstSigAction         // adresse structure sigaction\n    str x0,[x1,sa_handler]         // maj handler\n    mov x0,SIGINT                  // signal type\n    ldr x1,qAdrstSigAction\n    mov x2,0\n    mov x3,8\n    mov x8,SIGACTION               // call system\n    svc 0 \n \n    cmp x0,0                       // error ?\n    bne 98f\n    mov x0,SIGQUIT\n    ldr x1,qAdrstSigAction\n    mov x2,0                       // NULL\n    mov x8,SIGACTION               // call system \n    svc 0 \n    cmp x0,0                       // error ?\n    bne 98f\n    mov x0,SIGTERM\n    ldr x1,qAdrstSigAction\n    mov x2,0                       // NULL\n    mov x8,SIGACTION               // appel systeme \n    svc 0 \n    cmp x0,0\n    bne 98f\n    //\n    adr x0,qAdrSIG_IGN             // address signal igonre function\n    ldr x1,qAdrstSigAction1\n    str x0,[x1,sa_handler]\n    mov x0,SIGTTOU                 //invalidate other process signal\n    ldr x1,qAdrstSigAction1\n    mov x2,0                       // NULL\n    mov x8,SIGACTION               // call system \n    svc 0 \n    cmp x0,0\n    bne 98f\n    //\n    /* read terminal current state  */\n    mov x0,STDIN\n    mov x1,TCGETS\n    ldr x2,qAdrstCurtio            // address current termio\n    mov x8,IOCTL                   // call systeme \n    svc 0 \n    cmp x0,0                       // error ?\n    bne 98f\n    mov x2,ICANON | ECHO           // no key pressed echo on display\n    mvn x2,x2                      // and one key \n    ldr x1,qAdrstCurtio\n    ldr x3,[x1,#term_c_lflag]\n    and x3,x2,x2                   // add flags \n    str x3,[x1,#term_c_lflag]      // and store\n    mov x0,STDIN                   // maj terminal current state \n    mov x1,TCSETS\n    ldr x2,qAdrstCurtio\n    mov x8,IOCTL                   // call system\n    svc 0 \n    cbz x0,100f\n98:                                // error display\n    ldr x1,qAdrszMessErrInitTerm\n    bl   displayError\n    mov x0,-1\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\nqAdrstSigAction2:    .quad stSigAction2\nqAdrstSigAction3:    .quad stSigAction3\n/*********************************/\n/* init instance epool            */\n/*********************************/\ninitPoll:\n    stp x1,lr,[sp,-16]!            // save  registers\n    ldr x0,qAdrstevents\n    mov x1,STDIN                   // maj structure events\n    str x1,[x0,#poll_fd]           // maj FD\n    mov x1,POLLIN                  // action code\n    str x1,[x0,#poll_event]\n    mov x0,0\n    mov x8,CREATPOLL               // create epoll instance\n    svc 0\n    cmp x0,0                       // error ?\n    ble 98f\n    mov x10,x0                     // return FD epoll instance\n    mov x1,EPOLL_CTL_ADD\n    mov x2,STDIN                   // Fd to we want add\n    ldr x3,qAdrstevents            // structure events address\n    mov x8,CTLPOLL                 // call system control epoll\n    svc 0\n    cmp x0,0                       // error ?\n    blt 98f                       // no\n    mov x0,x10                     // return FD epoll instance\n    b 100f\n98:                                // error display\n    ldr x1,qAdrszMessErrInitPoll   // error message\n    bl   displayError\n    mov x0,-1\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/*********************************/\n/* wait key                      */\n/*********************************/\n/* x0 contains FD poll    */\nwaitKey:\n    stp x1,lr,[sp,-16]!            // save  registers\n    ldr x11,qAdrqTouche            // key address\n    str xzr,[x11]                  // raz key\n1:\n    ldr x1,qAdrqEnd                // if signal ctrl-c  -> end\n    ldr x1,[x1]\n    cbnz x1,100f\n \n    ldr x1,qAdrstevents\n    mov x2,12                      // size events\n    mov x3,1                       // timeout = 1  TODO: ??\n    mov x4,0\n    mov x8,SYSPOLL                 // call system wait POLL\n    svc 0 \n    cmp x0,0                       // key pressed ?\n    bge 100f\n98:                                // error display\n    ldr x1,qAdrszMessErreurKey        // error message\n    bl   displayError\n    mov x0,-1\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/*********************************/\n/* read key                      */\n/*********************************/\n/* x0 returns key value */\nreadKey:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x0,STDIN                   // File Descriptor\n    ldr x1,qAdrqTouche             // buffer address\n    mov x2,KEYSIZE                 // key size\n    mov x8,READ                    // read key\n    svc #0\n    cmp x0,0                       // error ?\n    ble 98f\n    ldr x2,qAdrqTouche             // key address\n    ldr x0,[x2]\n    b 100f\n98:                                // error display\n    ldr x1,qAdrszMessErreur        // error message\n    bl   displayError\n    mov x0,-1\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/*********************************/\n/* restaur terminal state        */\n/*********************************/\nrestauTerm:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x0,STDIN                   // end then restaur begin state terminal\n    mov x1,TCSETS\n    ldr x2,qAdrstOldtio\n    mov x8,IOCTL                   // call system  \n    svc 0\n    cbz x0,100f\n    ldr x1,qAdrszMessErreur        // error message\n    bl   displayError\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "misc/hello_world.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Hello_world/Text\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n.equ STDOUT, 1\n.equ SVC_WRITE, 64\n.equ SVC_EXIT, 93\n \n.text\n.global _start\n \n_start:\n\tstp x29, x30, [sp, -16]!\n\tmov x0, #STDOUT\n\tldr x1, =msg\n\tmov x2, 13\n\tmov x8, #SVC_WRITE\n\tmov x29, sp\n\tsvc #0 // write(stdout, msg, 13);\n\tldp x29, x30, [sp], 16\n\tmov x0, #0\n\tmov x8, #SVC_EXIT\n\tsvc #0 // exit(0);\n \nmsg:\t.ascii \"Hello World!\\n\"\n.align 4\n"
  },
  {
    "path": "misc/josephus_problem.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Josephus_problem\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program josephus_problem.s   */\n/* run with josephus_problem maxi intervalle */\n/* example : josephus_problem 41 3\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n.equ FIRSTNODE,        0              //identification first node \n \n/*******************************************/\n/* Structures                               */\n/********************************************/\n/* structure linkedlist*/\n    .struct  0\nllist_next:                            // next element\n    .struct  llist_next + 8\nllist_value:                           // element value\n    .struct  llist_value + 8\nllist_fin:\n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessDebutPgm:          .asciz \"Start program.\\n\"\nszMessFinPgm:            .asciz \"Program End ok.\\n\"\nszRetourLigne:            .asciz \"\\n\"\nszMessValElement:        .asciz \"Value : @ \\n\"\nszMessListeVide:         .asciz \"List empty.\\n\"\nszMessImpElement:        .asciz \"Node display: @ Value : @ Next @ \\n\"\nszMessErrComm:           .asciz \"Incomplete Command line  : josephus64 <maxi> <intervalle>\\n\"\n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss  \nsZoneConv:         .skip 100\n.align 4\nqDebutListe1:       .skip llist_fin\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                   // entry of program \n    mov fp,sp                           // copy stack address  register x29 fp\n    ldr x0,qAdrszMessDebutPgm\n    bl affichageMess\n    ldr x0,[fp]                         // parameter number command line\n    cmp x0,#2                           // correct ?\n    ble erreurCommande                  // error\n \n    add x0,fp,#16                       // address parameter 2\n    ldr x0,[x0]\n    bl conversionAtoD\n    add x22,x0,FIRSTNODE                // save maxi\n    add x0,fp,#24                       // address parameter 3\n    ldr x0,[x0]\n    bl conversionAtoD\n    mov x21,x0                          // save gap\n \n    mov x0,FIRSTNODE                    // create first node\n    mov x1,0\n    bl createNode\n    mov x25,x0                          // first node address\n    mov x26,x0\n    mov x24,FIRSTNODE + 1\n    mov x23,1\n1:                                      // loop create others nodes\n    mov x0,x24                          // key value\n    mov x1,0\n    bl createNode\n    str x0,[x26,llist_next]             // store current node address in prev node\n    mov x26,x0\n    add x24,x24,1\n    add x23,x23,1\n    cmp x23,x22                         // maxi ?\n    blt 1b\n    str x25,[x26,llist_next]            // store first node address in last pointer\n    mov x24,x26\n2:\n    mov x20,1                           // counter for gap\n3:\n    ldr x24,[x24,llist_next]\n    add x20,x20,1\n    cmp x20,x21                         // intervalle ?\n    blt 3b\n    ldr x25,[x24,llist_next]            // removing the node from the list\n    ldr x22,[x25,llist_value]\n    ldr x27,[x25,llist_next]            // load pointer next\n    str x27,[x24,llist_next]            // ans store in prev node\n    //mov x0,x25\n    //bl displayNode\n    cmp x27,x24\n    csel x24,x24,x27,ne                 // next node address \n    bne 2b                              // and loop\n \n    mov x0,x24\n    bl displayNode                      // display last node\n \n    b 100f\nerreurCommande:\n    ldr x0,qAdrszMessErrComm\n    bl affichageMess\n    mov x0,#1                          // error code\n    b 100f\n100:                                   // program end standard \n    ldr x0,qAdrszMessFinPgm\n    bl affichageMess\n    mov x0,0                          // return code Ok\n    mov x8,EXIT                       // system call \"Exit\"\n    svc #0\n \nqAdrszMessDebutPgm:      .quad szMessDebutPgm\nqAdrszMessFinPgm:        .quad szMessFinPgm\nqAdrszRetourLigne:       .quad szRetourLigne\nqAdrqDebutListe1:        .quad qDebutListe1\nqAdrszMessErrComm:       .quad szMessErrComm\n \n/******************************************************************/\n/*     create node                                             */ \n/******************************************************************/\n/* x0 contains key   */\n/* x1 contains zero or address next node */\n/* x0 returns address heap node  */\ncreateNode:\n    stp x20,lr,[sp,-16]!        // save  registres\n    stp x21,x22,[sp,-16]!       // save  registres\n    mov x20,x0                  // save key\n    mov x21,x1                  // save key\n    mov x0,#0                   // allocation place heap\n    mov x8,BRK                  // call system 'brk'\n    svc #0\n    mov x22,x0                  // save address heap for node\n    add x0,x0,llist_fin         // reservation place node length\n    mov x8,BRK                  // call system 'brk'\n    svc #0\n    cmp x0,#-1                  // allocation error\n    beq 100f\n \n    str x20,[x22,llist_value]\n    str x21,[x22,llist_next]\n    mov x0,x22\n100:\n    ldp x21,x22,[sp],16         // restaur des  2 registres\n    ldp x20,lr,[sp],16          // restaur des  2 registres\n    ret                         // retour adresse lr x30\n \n/******************************************************************/\n/*     display infos node                                     */ \n/******************************************************************/\n/* x0 contains node address */\ndisplayNode:\n    stp x1,lr,[sp,-16]!        // save  registres\n    stp x2,x3,[sp,-16]!        // save  registres\n    mov x2,x0\n    ldr x1,qAdrsZoneConv\n    bl conversion16\n    ldr x0,qAdrszMessImpElement\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc\n    mov x3,x0\n    ldr x0,[x2,llist_value]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S\n    mov x0,x3\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc\n    mov x3,x0\n    ldr x0,[x2,llist_next]\n    ldr x1,qAdrsZoneConv\n    bl conversion16\n    mov x0,x3\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc\n    bl affichageMess\n \n100:\n    ldp x2,x3,[sp],16          // restaur des  2 registres\n    ldp x1,lr,[sp],16          // restaur des  2 registres\n    ret                        // retour adresse lr x30\nqAdrsZoneConv:               .quad sZoneConv\nqAdrszMessImpElement:        .quad szMessImpElement\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "misc/perfect_numbers.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Perfect_numbers\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program perfect_numbers.s   */\n/* use Euclide Formula : if M=(2puis p)-1 is prime M * (M+1)/2 is perfect see Wikipedia  */\n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n.equ MAXI,      63\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nsMessResult:        .asciz \"Perfect  : @ \\n\"\nszMessOverflow:     .asciz \"Overflow in function isPrime.\\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss  \nsZoneConv:                  .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                               // entry of program \n    mov x4,2                        // start 2\n    mov x3,1                        // counter 2 power\n1:                                  // begin loop\n    lsl x4,x4,1                     // 2 power\n    sub x0,x4,1                     // - 1 \n    bl isPrime                      // is prime ?\n    cbz x0,2f                       // no\n    sub x0,x4,1                     // yes\n    mul x1,x0,x4                    // multiply m by m-1\n    lsr x0,x1,1                     // divide by 2\n    bl displayPerfect               // and display\n2:\n    add x3,x3,1                     // next power of 2\n    cmp x3,MAXI\n    blt 1b\n \n100:                                // standard end of the program \n    mov x0,0                        // return code\n    mov x8,EXIT                     // request to exit program\n    svc 0                           // perform the system call\nqAdrszCarriageReturn:    .quad szCarriageReturn\nqAdrsMessResult:         .quad sMessResult\n \n/******************************************************************/\n/*      Display perfect number                                */ \n/******************************************************************/\n/* x0 contains the number */\ndisplayPerfect:\n    stp x1,lr,[sp,-16]!             // save  registers\n    ldr x1,qAdrsZoneConv\n    bl conversion10                 // call décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv            // insert conversion in message\n    bl strInsertAtCharInc\n    bl affichageMess                // display message\n100:\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\nqAdrsZoneConv:                   .quad sZoneConv\n \n/***************************************************/\n/*   is a number prime ?         */\n/***************************************************/\n/* x0 contains the number */\n/* x0 return 1 if prime  else 0  */\n//2147483647  OK\n//4294967297  NOK\n//131071       OK\n//1000003    OK \n//10001363   OK\nisPrime:\n    stp x1,lr,[sp,-16]!        // save  registres\n    stp x2,x3,[sp,-16]!        // save  registres\n    mov x2,x0\n    sub x1,x0,#1\n    cmp x2,0\n    beq 99f                    // return zero\n    cmp x2,2                   // for 1 and 2 return 1\n    ble 2f\n    mov x0,#2\n    bl moduloPuR64\n    bcs 100f                   // error overflow\n    cmp x0,#1\n    bne 99f                    // no prime \n    cmp x2,3\n    beq 2f\n    mov x0,#3\n    bl moduloPuR64\n    blt 100f                   // error overflow\n    cmp x0,#1\n    bne 99f\n \n    cmp x2,5\n    beq 2f\n    mov x0,#5\n    bl moduloPuR64\n    bcs 100f                   // error overflow\n    cmp x0,#1\n    bne 99f                    // Pas premier\n \n    cmp x2,7\n    beq 2f\n    mov x0,#7\n    bl moduloPuR64\n    bcs 100f                   // error overflow\n    cmp x0,#1\n    bne 99f                    // Pas premier\n \n    cmp x2,11\n    beq 2f\n    mov x0,#11\n    bl moduloPuR64\n    bcs 100f                   // error overflow\n    cmp x0,#1\n    bne 99f                    // Pas premier\n \n    cmp x2,13\n    beq 2f\n    mov x0,#13\n    bl moduloPuR64\n    bcs 100f                   // error overflow\n    cmp x0,#1\n    bne 99f                    // Pas premier\n2:\n    cmn x0,0                   // carry à zero no error\n    mov x0,1                   // prime\n    b 100f\n99:\n    cmn x0,0                   // carry à zero no error\n    mov x0,#0                  // prime\n100:\n    ldp x2,x3,[sp],16          // restaur des  2 registres\n    ldp x1,lr,[sp],16          // restaur des  2 registres\n    ret\n \n \n/**************************************************************/\n/********************************************************/\n/*   Compute modulo de b power e modulo m  */\n/*    Exemple 4 puissance 13 modulo 497 = 445         */\n/********************************************************/\n/* x0  number  */\n/* x1 exposant */\n/* x2 modulo   */\nmoduloPuR64:\n    stp x1,lr,[sp,-16]!        // save  registres\n    stp x3,x4,[sp,-16]!        // save  registres\n    stp x5,x6,[sp,-16]!        // save  registres\n    stp x7,x8,[sp,-16]!        // save  registres\n    stp x9,x10,[sp,-16]!       // save  registres\n    cbz x0,100f\n    cbz x1,100f\n    mov x8,x0\n    mov x7,x1\n    mov x6,1                   // result\n    udiv x4,x8,x2\n    msub x9,x4,x2,x8           // remainder\n1:\n    tst x7,1                   // if bit = 1\n    beq 2f\n    mul x4,x9,x6\n    umulh x5,x9,x6\n    mov x6,x4\n    mov x0,x6\n    mov x1,x5\n    bl divisionReg128U         // division 128 bits\n    cbnz x1,99f                // overflow\n    mov x6,x3                  // remainder\n2:\n    mul x8,x9,x9\n    umulh x5,x9,x9\n    mov x0,x8\n    mov x1,x5\n    bl divisionReg128U\n    cbnz x1,99f                // overflow\n    mov x9,x3\n    lsr x7,x7,1\n    cbnz x7,1b\n    mov x0,x6                  // result\n    cmn x0,0                   // carry à zero no error\n    b 100f\n99:\n    ldr x0,qAdrszMessOverflow\n    bl  affichageMess          // display error message\n    cmp x0,0                   // carry set error\n    mov x0,-1                  // code erreur\n \n100:\n    ldp x9,x10,[sp],16          // restaur des  2 registres\n    ldp x7,x8,[sp],16          // restaur des  2 registres\n    ldp x5,x6,[sp],16          // restaur des  2 registres\n    ldp x3,x4,[sp],16          // restaur des  2 registres\n    ldp x1,lr,[sp],16          // restaur des  2 registres\n    ret                        // retour adresse lr x30\nqAdrszMessOverflow:         .quad  szMessOverflow\n/***************************************************/\n/*   division d un nombre de 128 bits par un nombre de 64 bits */\n/***************************************************/\n/* x0 contient partie basse dividende */\n/* x1 contient partie haute dividente */\n/* x2 contient le diviseur */\n/* x0 retourne partie basse quotient */\n/* x1 retourne partie haute quotient */\n/* x3 retourne le reste */\ndivisionReg128U:\n    stp x6,lr,[sp,-16]!        // save  registres\n    stp x4,x5,[sp,-16]!        // save  registres\n    mov x5,#0                  // raz du reste R\n    mov x3,#128                // compteur de boucle\n    mov x4,#0                  // dernier bit\n1:    \n    lsl x5,x5,#1               // on decale le reste de 1\n    tst x1,1<<63               // test du bit le plus à gauche\n    lsl x1,x1,#1               // on decale la partie haute du quotient de 1\n    beq 2f\n    orr  x5,x5,#1              // et on le pousse dans le reste R\n2:\n    tst x0,1<<63\n    lsl x0,x0,#1               // puis on decale la partie basse \n    beq 3f\n    orr x1,x1,#1               // et on pousse le bit de gauche dans la partie haute\n3:\n    orr x0,x0,x4               // position du dernier bit du quotient\n    mov x4,#0                  // raz du bit\n    cmp x5,x2\n    blt 4f\n    sub x5,x5,x2               // on enleve le diviseur du reste\n    mov x4,#1                  // dernier bit à 1\n4:\n                               // et boucle\n    subs x3,x3,#1\n    bgt 1b    \n    lsl x1,x1,#1               // on decale le quotient de 1\n    tst x0,1<<63\n    lsl x0,x0,#1               // puis on decale la partie basse \n    beq 5f\n    orr x1,x1,#1\n5:\n    orr x0,x0,x4               // position du dernier bit du quotient\n    mov x3,x5\n100:\n    ldp x4,x5,[sp],16          // restaur des  2 registres\n    ldp x6,lr,[sp],16          // restaur des  2 registres\n    ret                        // retour adresse lr x30\n \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "misc/sha1.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/SHA-1\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program sha1.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n.equ SHA_DIGEST_LENGTH, 20\n \n//.include \"../../ficmacros64.s\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessRosetta:         .asciz \"Rosetta Code\"\nszMessTest1:           .asciz \"abc\" \nszMessSup64:           .ascii \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n                       .ascii \"abcdefghijklmnopqrstuvwxyz\"\n                       .asciz \"1234567890AZERTYUIOP\"\nszMessTest2:           .asciz \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\"\nszMessFinPgm:          .asciz \"Program End ok.\\n\"\nszMessResult:          .asciz \"Rosetta Code => \"\nszCarriageReturn:      .asciz \"\\n\"\n \n/* array constantes Hi */\ntbConstHi:           .int 0x67452301       // H0\n                     .int 0xEFCDAB89       // H1\n                     .int 0x98BADCFE       // H2\n                     .int 0x10325476       // H3\n                     .int 0xC3D2E1F0       // H4\n/* array constantes Kt */\ntbConstKt:           .int 0x5A827999\n                     .int 0x6ED9EBA1\n                     .int 0x8F1BBCDC\n                     .int 0xCA62C1D6\n \n \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\n.align 4\niNbBlocs:                    .skip 8\nsZoneConv:                   .skip 24\nsZoneResult:                 .skip 24\nsZoneTrav:                   .skip 1000\ntbH:                         .skip 4 * 5         // 5 variables H\ntbW:                         .skip 4 * 80        // 80 words W\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                      // entry of program \n \n    ldr x0,qAdrszMessRosetta\n    //ldr x0,qAdrszMessTest1\n    //ldr x0,qAdrszMessTest2\n    //ldr x0,qAdrszMessSup64\n    bl computeSHA1                         // call routine SHA1\n \n    ldr x0,qAdrszMessResult\n    bl affichageMess                       // display message\n \n    ldr x0, qAdrsZoneResult\n    bl displaySHA1\n \n    ldr x0,qAdrszMessFinPgm\n    bl affichageMess                       // display message\n \n \n100:                                       // standard end of the program \n    mov x0,0                               // return code\n    mov x8,EXIT                            // request to exit program\n    svc 0                                  // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrszMessResult:         .quad szMessResult\nqAdrszMessRosetta:        .quad szMessRosetta\nqAdrszMessTest1:          .quad szMessTest1\nqAdrszMessTest2:          .quad szMessTest2\nqAdrsZoneTrav:            .quad sZoneTrav\nqAdrsZoneConv:            .quad sZoneConv\nqAdrszMessFinPgm:         .quad szMessFinPgm\nqAdrszMessSup64:          .quad szMessSup64\n/******************************************************************/\n/*     compute SHA1                         */ \n/******************************************************************/\n/* x0 contains the address of the message */\ncomputeSHA1:\n    stp x1,lr,[sp,-16]!       // save  registers\n    ldr x1,qAdrsZoneTrav\n    mov x2,#0                // counter length \ndebCopy:                     // copy string in work area\n    ldrb w3,[x0,x2]\n    strb w3,[x1,x2]\n    cmp x3,#0\n    add x4,x2,1\n    csel x2,x4,x2,ne\n    bne debCopy\n    lsl x6,x2,#3             // initial message length in bits \n    mov x3,#0b10000000       // add bit 1 at end of string\n    strb w3,[x1,x2]\n    add x2,x2,#1             // length in bytes\n    lsl x4,x2,#3             // length in bits\n    mov x3,#0\naddZeroes:\n    lsr x5,x2,#6\n    lsl x5,x5,#6\n    sub x5,x2,x5\n    cmp x5,#56\n    beq storeLength          // yes -> end add\n    strb w3,[x1,x2]          // add zero at message end\n    add x2,x2,#1                // increment lenght bytes \n    add x4,x4,#8                // increment length in bits\n    b addZeroes\nstoreLength:\n    add x2,x2,#4                // add four bytes\n    rev w6,w6                // inversion bits initials message length\n    str w6,[x1,x2]           // and store at end\n \n    ldr x7,qAdrtbConstHi     // constantes H address\n    ldr x4,qAdrtbH           // start area H\n    mov x5,#0\nloopConst:                   // init array H with start constantes\n    ldr w6,[x7,x5,lsl #2]    // load constante\n    str w6,[x4,x5,lsl #2]    // and store\n    add x5,x5,#1\n    cmp x5,#5\n    blt loopConst\n                             // split into block of 64 bytes\n    add x2,x2,#4                //  TODO : à revoir\n    lsr x4,x2,#6             // blocks number\n    ldr x0,qAdriNbBlocs\n    str x4,[x0]              // save block maxi\n    mov x7,#0                // n° de block et x1 contient l'adresse zone de travail\nloopBlock:                   // begin loop of each block of 64 bytes\n    mov x0,x7\n    bl inversion             // inversion each word because little indian\n    ldr x3,qAdrtbW           // working area W address\n    mov x6,#0                // indice t\n                             /* x2  address begin each block */\n    ldr x1,qAdrsZoneTrav\n    add x2,x1,x7,lsl #6      //  compute block begin  indice * 4 * 16\n \nloopPrep:                    // loop for expand 80 words\n    cmp x6,#15               // \n    bgt expand1\n    ldr w0,[x2,x6,lsl #2]    // load four byte message\n    str w0,[x3,x6,lsl #2]    // store in first 16 block \n    b expandEnd\nexpand1:\n    sub x8,x6,#3\n    ldr w9,[x3,x8,lsl #2]\n    sub x8,x6,#8\n    ldr w10,[x3,x8,lsl #2]\n    eor x9,x9,x10\n    sub x8,x6,#14\n    ldr w10,[x3,x8,lsl #2]\n    eor x9,x9,x10\n    sub x8,x6,#16\n    ldr w10,[x3,x8,lsl #2]\n    eor x9,x9,x10\n    ror w9,w9,#31\n \n    str w9,[x3,x6,lsl #2] \nexpandEnd:\n    add x6,x6,#1\n    cmp x6,#80                 // 80 words ?\n    blt loopPrep               // and loop\n    /* COMPUTING THE MESSAGE DIGEST */\n    /* x1  area H constantes address */\n    /* x3  working area W address  */\n    /* x5  address constantes K   */\n    /* x6  counter t */\n    /* x7  block counter */\n    /* x8  a, x9 b, x10 c, x11 d, x12 e */\n \n                               // init variable a b c d e\n    ldr x0,qAdrtbH\n    ldr w8,[x0]\n    ldr w9,[x0,#4]\n    ldr w10,[x0,#8]\n    ldr w11,[x0,#12]\n    ldr w12,[x0,#16]\n \n    ldr x1,qAdrtbConstHi\n    ldr x5,qAdrtbConstKt\n    mov x6,#0\nloop80T:                       // begin loop 80 t\n    cmp x6,#19\n    bgt T2\n    ldr w0,[x5]                // load constantes k0\n    and x2,x9,x10              // b and c\n    mvn w4,w9                  // not b\n    and x4,x4,x11              // and d\n    orr x2,x2,x4\n    b T_fin\nT2:\n    cmp x6,#39             \n    bgt T3\n    ldr w0,[x5,#4]             // load constantes k1\n    eor x2,x9,x10\n    eor x2,x2,x11\n    b T_fin\nT3:\n    cmp x6,#59             \n    bgt T4\n    ldr w0,[x5,#8]             // load constantes k2\n    and x2,x9,x10\n    and x4,x9,x11\n    orr x2,x2,x4\n    and x4,x10,x11\n    orr x2,x2,x4\n    b T_fin\nT4:\n    ldr w0,[x5,#12]            // load constantes k3\n    eor x2,x9,x10\n    eor x2,x2,x11\n    b T_fin\nT_fin:\n    ror w4,w8,#27            // left rotate a to 5\n    add w2,w2,w4\n    //affregtit Tfin 0\n    //affregtit Tfin 8\n    add w2,w2,w12\n    ldr w4,[x3,x6,lsl #2]    // Wt\n    add w2,w2,w4\n    add w2,w2,w0                // Kt\n    mov x12,x11              // e = d\n    mov x11,x10              // d = c\n    ror w10,w9,#2            // c\n    mov x9,x8                // b = a\n    mov x8,x2                // nouveau a\n \n    add x6,x6,#1             // increment t\n    cmp x6,#80\n    blt loop80T\n                             // other bloc\n    add x7,x7,1                // increment block\n    ldr x0,qAdriNbBlocs\n    ldr w4,[x0]              // restaur maxi block\n    cmp x7,x4                // maxi ?\n    bge End\n                             // End block\n    ldr x0,qAdrtbH           // start area H\n    ldr w3,[x0]\n    add w3,w3,w8\n    str w3,[x0]              // store a in H0\n    ldr w3,[x0,#4]\n    add w3,w3,w9\n    str w3,[x0,#4]           // store b in H1\n    ldr w3,[x0,#8]\n    add w3,w3,w10\n    str w3,[x0,#8]           // store c in H2\n    ldr w3,[x0,#12]\n    add w3,w3,w11\n    str w3,[x0,#12]          // store d in H3\n    ldr w3,[x0,#16]\n    add w3,w3,w12\n    str w3,[x0,#16]          // store e in H4\n    b loopBlock              //  loop\n \nEnd:\n                             // compute final result\n    ldr x0,qAdrtbH           // start area H\n    ldr x2,qAdrsZoneResult\n    ldr w1,[x0]\n    add x1,x1,x8\n    rev w1,w1\n    str w1,[x2]\n    ldr w1,[x0,#4]\n    add x1,x1,x9\n    rev w1,w1\n    str w1,[x2,#4]\n    ldr w1,[x0,#8]\n    add x1,x1,x10\n    rev w1,w1\n    str w1,[x2,#8]\n    ldr w1,[x0,#12]\n    add x1,x1,x11\n    rev w1,w1\n    str w1,[x2,#12]\n    ldr w1,[x0,#16]\n    add x1,x1,x12\n    rev w1,w1\n    str w1,[x2,#16]\n    mov x0,#0                    // routine OK\n100:\n \n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\nqAdrtbConstHi:            .quad tbConstHi\nqAdrtbConstKt:            .quad tbConstKt\nqAdrtbH:                  .quad tbH\nqAdrtbW:                  .quad tbW\nqAdrsZoneResult:          .quad sZoneResult\nqAdriNbBlocs:             .quad iNbBlocs\n/******************************************************************/\n/*     inversion des mots de 32 bits d'un bloc                    */ \n/******************************************************************/\n/* x0 contains N° block   */\ninversion:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    ldr x1,qAdrsZoneTrav\n    add x1,x1,x0,lsl 6           // debut du bloc\n    mov x2,#0\n1:                               // start loop\n    ldr w3,[x1,x2,lsl #2]\n    rev w3,w3\n    str w3,[x1,x2,lsl #2]\n    add x2,x2,#1\n    cmp x2,#16\n    blt 1b\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n/******************************************************************/\n/*     display hash  SHA1                         */ \n/******************************************************************/\n/* x0 contains the address of hash  */\ndisplaySHA1:\n    stp x1,lr,[sp,-16]!       // save  registers\n    stp x2,x3,[sp,-16]!       // save  registers\n    mov x3,x0\n    mov x2,#0\n1:\n    ldr w0,[x3,x2,lsl #2]          // load 4 bytes\n    rev w0,w0                      // reverse bytes\n    ldr x1,qAdrsZoneConv\n    bl conversion16_4W                // conversion hexa\n    ldr x0,qAdrsZoneConv\n    bl affichageMess\n    add x2,x2,#1\n    cmp x2,#SHA_DIGEST_LENGTH / 4\n    blt 1b                         // and loop\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess               // display message\n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     conversion  hexadecimal register 32 bits                   */ \n/******************************************************************/\n/* x0 contains value and x1 address zone receptrice   */\nconversion16_4W:\n    stp x0,lr,[sp,-48]!        // save  registres\n    stp x1,x2,[sp,32]          // save  registres\n    stp x3,x4,[sp,16]          // save  registres\n    mov x2,#28                 // start bit position\n    mov x4,#0xF0000000         // mask\n    mov x3,x0                  // save entry value\n1:                             // start loop\n    and x0,x3,x4               // value register and mask\n    lsr x0,x0,x2               // right shift\n    cmp x0,#10                 // >= 10 ?\n    bge 2f                     // yes\n    add x0,x0,#48              // no is digit\n    b 3f\n2:\n    add x0,x0,#55              // else is a letter A-F\n3:\n    strb w0,[x1],#1            // load result  and + 1 in address\n    lsr x4,x4,#4               // shift mask 4 bits left\n    subs x2,x2,#4              // decrement counter 4 bits <= zero  ?\n    bge 1b                     // no -> loop\n \n100:                           // fin standard de la fonction\n    ldp x3,x4,[sp,16]          // restaur des  2 registres\n    ldp x1,x2,[sp,32]          // restaur des  2 registres\n    ldp x0,lr,[sp],48          // restaur des  2 registres\n    ret    \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "misc/sha256.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/SHA-256\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program sha256.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n.equ LGHASH, 32                  // result length \n \n/*******************************************/\n/* Structures                               */\n/********************************************/\n/* example structure  variables  */\n    .struct  0\nvar_a:                     // a\n    .struct  var_a + 4\nvar_b:                     // b\n    .struct  var_b + 4\nvar_c:                     // c\n    .struct  var_c + 4\nvar_d:                     // d\n    .struct  var_d + 4\nvar_e:                     // e\n    .struct  var_e + 4\nvar_f:                     // f\n    .struct  var_f + 4\nvar_g:                     // g\n    .struct  var_g + 4\nvar_h:                     // h\n    .struct  var_h + 4\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessRosetta:        .asciz \"Rosetta code\"\nszMessTest1:           .asciz \"abc\" \nszMessSup64:           .ascii \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n                       .ascii \"abcdefghijklmnopqrstuvwxyz\"\n                       .asciz \"1234567890AZERTYUIOP\"\nszMessTest2:           .asciz \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\"\nszMessFinPgm:          .asciz \"Program End ok.\\n\"\nszMessResult:          .asciz \"Rosetta code => \"\nszCarriageReturn:   .asciz \"\\n\"\n \n/* array constantes Hi */\ntbConstHi:           .int 0x6A09E667       // H0\n                     .int 0xBB67AE85       // H1\n                     .int 0x3C6EF372       // H2\n                     .int 0xA54FF53A       // H3\n                     .int 0x510E527F       // H4\n                     .int 0x9B05688C       // H5\n                     .int 0x1F83D9AB       // H6\n                     .int 0x5BE0CD19       // H7\n/* array  64 constantes Kt */\ntbConstKt:\n  .int 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5\n  .int 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174\n  .int 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da\n  .int 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967\n  .int 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85\n  .int 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070\n  .int 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3\n  .int 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\n.align 4\nqNbBlocs:                    .skip 8\nsZoneConv:                   .skip 24\nsZoneTrav:                   .skip 1000\n.align 8\ntbH:                         .skip 4 * 8         // 8 variables H\ntbabcdefgh:                  .skip 4 * 8\ntbW:                         .skip 4 * 64        // 64 words W\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                      // entry of program \n \n    ldr x0,qAdrszMessRosetta\n    //ldr x0,qAdrszMessTest1\n    //ldr x0,qAdrszMessTest2\n    //ldr x0,qAdrszMessSup64\n    bl computeSHA256                       // call routine SHA1\n \n    ldr x0,qAdrszMessResult\n    bl affichageMess                       // display message\n \n    ldr x0, qAdrtbH\n    bl displaySHA1\n \n    ldr x0,qAdrszMessFinPgm\n    bl affichageMess                       // display message\n \n \n100:                                       // standard end of the program \n    mov x0,0                               // return code\n    mov x8,EXIT                            // request to exit program\n    svc 0                                  // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrszMessResult:         .quad szMessResult\nqAdrszMessRosetta:        .quad szMessRosetta\nqAdrszMessTest1:          .quad szMessTest1\nqAdrszMessTest2:          .quad szMessTest2\nqAdrsZoneTrav:            .quad sZoneTrav\nqAdrsZoneConv:            .quad sZoneConv\nqAdrszMessFinPgm:         .quad szMessFinPgm\nqAdrszMessSup64:          .quad szMessSup64\n/******************************************************************/\n/*     compute SHA1                         */ \n/******************************************************************/\n/* x0 contains the address of the message */\ncomputeSHA256:\n    stp x1,lr,[sp,-16]!      // save  registers\n    ldr x1,qAdrsZoneTrav\n    mov x2,#0                // counter length \ndebCopy:                     // copy string in work area\n    ldrb w3,[x0,x2]\n    strb w3,[x1,x2]\n    cmp x3,#0\n    add x4,x2,1\n    csel x2,x4,x2,ne\n    bne debCopy\n    lsl x6,x2,#3             // initial message length in bits \n    mov x3,#0b10000000       // add bit 1 at end of string\n    strb w3,[x1,x2]\n    add x2,x2,#1             // length in bytes\n    lsl x4,x2,#3             // length in bits\n    mov x3,#0\naddZeroes:\n    lsr x5,x2,#6\n    lsl x5,x5,#6\n    sub x5,x2,x5\n    cmp x5,#56\n    beq storeLength          // yes -> end add\n    strb w3,[x1,x2]          // add zero at message end\n    add x2,x2,#1              // increment lenght bytes \n    add x4,x4,#8             // increment length in bits\n    b addZeroes\nstoreLength:\n    add x2,x2,#4             // add four bytes\n    rev w6,w6                // inversion bits initials message length\n    str w6,[x1,x2]           // and store at end\n \n    ldr x7,qAdrtbConstHi     // constantes H address\n    ldr x4,qAdrtbH           // start area H\n    mov x5,#0\nloopConst:                   // init array H with start constantes\n    ldr w6,[x7,x5,lsl #2]    // load constante\n    str w6,[x4,x5,lsl #2]    // and store\n    add x5,x5,#1\n    cmp x5,#8\n    blt loopConst\n                             // split into block of 64 bytes\n    add x2,x2,#4                // \n    lsr x4,x2,#6             // blocks number\n    ldr x0,qAdrqNbBlocs\n    str x4,[x0]              // save block maxi\n    mov x7,#0                // n° de block et x1 contient l adresse zone de travail\nloopBlock:                   // begin loop of each block of 64 bytes\n    mov x0,x7\n    bl inversion             // inversion each word because little indian\n    ldr x3,qAdrtbW           // working area W address\n    mov x6,#0                // indice t\n                             /* x2  address begin each block */\n    ldr x1,qAdrsZoneTrav\n    add x2,x1,x7,lsl #6      //  compute block begin  indice * 4 * 16\n    //vidregtit avantloop\n    //mov x0,x2\n    //vidmemtit  verifBloc x0 10\nloopPrep:                    // loop for expand 80 words\n    cmp x6,#15               // \n    bgt expand1\n    ldr w0,[x2,x6,lsl #2]    // load word message\n    str w0,[x3,x6,lsl #2]    // store in first 16 block \n    b expandEnd\n \nexpand1:\n    sub x8,x6,#2\n    ldr w9,[x3,x8,lsl #2]\n    ror w10,w9,#17           // fonction e1 (256)\n    ror w11,w9,#19\n    eor w10,w10,w11\n    lsr w11,w9,#10\n    eor w10,w10,w11\n    sub x8,x6,#7\n    ldr w9,[x3,x8,lsl #2]\n    add w9,w9,w10            // + w - 7\n    sub x8,x6,#15\n    ldr w10,[x3,x8,lsl #2]\n    ror w11,w10,#7          // fonction e0 (256)\n    ror w12,w10,#18\n    eor w11,w11,w12\n    lsr w12,w10,#3\n    eor w10,w11,w12\n    add w9,w9,w10\n    sub x8,x6,#16\n    ldr w11,[x3,x8,lsl #2]\n    add w9,w9,w11\n \n    str w9,[x3,x6,lsl #2] \nexpandEnd:\n    add x6,x6,#1\n    cmp x6,#64                 // 64 words ?\n    blt loopPrep               // and loop\n \n \n    /* COMPUTING THE MESSAGE DIGEST */\n    /* x1  area H constantes address */\n    /* x3  working area W address  */\n    /* x5  address constantes K   */\n    /* x6  counter t */\n    /* x7  block counter */\n    /* x8  addresse variables a b c d e f g h  */\n    //ldr x0,qAdrtbW\n    //vidmemtit  verifW80 x0 20\n                               // init variable a b c d e f g h\n    ldr x0,qAdrtbH\n    ldr x8,qAdrtbabcdefgh\n    mov x1,#0\nloopInita:\n    ldr w9,[x0,x1,lsl #2]\n    str w9,[x8,x1,lsl #2]\n    add x1,x1,#1\n    cmp x1,#8\n    blt loopInita\n \n \n    ldr x1,qAdrtbConstHi\n    ldr x5,qAdrtbConstKt\n    mov x6,#0\nloop64T:                      // begin loop 64 t\n    ldr w9,[x8,#var_h]\n    ldr w10,[x8,#var_e]       // calcul T1\n    ror w11,w10,#6            // fonction sigma 1\n    ror w12,w10,#11\n    eor w11,w11,w12\n    ror w12,w10,#25\n    eor w11,w11,w12\n    add w9,w9,w11             // h + sigma1 (e)\n    ldr w0,[x8,#var_f]        //  fonction ch  x and y xor (non x and z)\n    ldr w4,[x8,#var_g]\n    and w11,w10,w0\n    mvn w12,w10\n    and w12,w12,w4\n    eor w11,w11,w12\n    add w9,w9,w11             // h + sigma1 (e) + ch (e,f,g)\n    ldr w0,[x5,x6,lsl #2]     // load constantes k0\n    add w9,w9,w0\n    ldr w0,[x3,x6,lsl #2]     // Wt\n    add w9,w9,w0\n                              // calcul T2\n    ldr w10,[x8,#var_a]       // fonction sigma 0\n    ror w11,w10,#2\n    ror w12,w10,#13\n    eor w11,w11,w12\n    ror w12,w10,#22\n    eor w11,w11,w12\n    ldr w2,[x8,#var_b]\n    ldr w4,[x8,#var_c]\n                              // fonction maj x and y xor x and z xor y and z\n    and w12,w10,w2\n    and w0,w10,w4\n    eor w12,w12,w0\n    and w0,w2,w4\n    eor w12,w12,w0            //\n    add w12,w12,w11           // T2\n                              // compute variables\n    ldr w4,[x8,#var_g]\n    str w4,[x8,#var_h]\n    ldr w4,[x8,#var_f]\n    str w4,[x8,#var_g]\n    ldr w4,[x8,#var_e]\n    str w4,[x8,#var_f]\n    ldr w4,[x8,#var_d]\n    add w4,w4,w9              // add T1\n    str w4,[x8,#var_e]\n    ldr w4,[x8,#var_c]\n    str w4,[x8,#var_d]\n    ldr w4,[x8,#var_b]\n    str w4,[x8,#var_c]\n    ldr w4,[x8,#var_a]\n    str w4,[x8,#var_b]\n    add w4,w9,w12             // add T1 T2\n    str w4,[x8,#var_a]\n \n    add x6,x6,#1              // increment t\n    cmp x6,#64\n    blt loop64T\n                              // End block\n    ldr x0,qAdrtbH            // start area H\n    mov x10,#0\nloopStoreH:\n    ldr w9,[x8,x10,lsl #2]\n    ldr w3,[x0,x10,lsl #2]\n    add w3,w3,w9\n    str w3,[x0,x10,lsl #2]    // store variables in H0\n    add x10,x10,#1\n    cmp x10,#8\n    blt loopStoreH\n                              // other bloc\n    add x7,x7,#1                 // increment block\n    ldr x0,qAdrqNbBlocs\n    ldr x4,[x0]               // restaur maxi block\n    cmp x7,x4                 // maxi ?\n \n    blt loopBlock             //  loop other block\n \n    mov x0,#0                 // routine OK\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\nqAdrtbConstHi:            .quad tbConstHi\nqAdrtbConstKt:            .quad tbConstKt\nqAdrtbH:                  .quad tbH\nqAdrtbW:                  .quad tbW\nqAdrtbabcdefgh:           .quad tbabcdefgh\nqAdrqNbBlocs:             .quad qNbBlocs\n/******************************************************************/\n/*     inversion des mots de 32 bits d un bloc                    */ \n/******************************************************************/\n/* x0 contains N° block   */\ninversion:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    ldr x1,qAdrsZoneTrav\n    add x1,x1,x0,lsl #6           // debut du bloc\n    mov x2,#0\n1:                                                  // start loop\n    ldr w3,[x1,x2,lsl #2]\n    rev w3,w3\n    str w3,[x1,x2,lsl #2]\n    add x2,x2,#1\n    cmp x2,#16\n    blt 1b\n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     display hash  SHA1                         */ \n/******************************************************************/\n/* x0 contains the address of hash  */\ndisplaySHA1:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    mov x3,x0\n    mov x2,#0\n1:\n    ldr w0,[x3,x2,lsl #2]          // load 4 bytes\n    //rev x0,x0                    // reverse bytes\n    ldr x1,qAdrsZoneConv\n    bl conversion16_4W             // conversion hexa\n    ldr x0,qAdrsZoneConv\n    bl affichageMess\n    add x2,x2,#1\n    cmp x2,#LGHASH / 4\n    blt 1b                         // and loop\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess               // display message\n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     conversion  hexadecimal register 32 bits                   */ \n/******************************************************************/\n/* x0 contains value and x1 address zone receptrice   */\nconversion16_4W:\n    stp x0,lr,[sp,-48]!        // save  registres\n    stp x1,x2,[sp,32]          // save  registres\n    stp x3,x4,[sp,16]          // save  registres\n    mov x2,#28                 // start bit position\n    mov x4,#0xF0000000         // mask\n    mov x3,x0                  // save entry value\n1:                             // start loop\n    and x0,x3,x4               // value register and mask\n    lsr x0,x0,x2               // right shift\n    cmp x0,#10                 // >= 10 ?\n    bge 2f                     // yes\n    add x0,x0,#48              // no is digit\n    b 3f\n2:\n    add x0,x0,#55              // else is a letter A-F\n3:\n    strb w0,[x1],#1            // load result  and + 1 in address\n    lsr x4,x4,#4               // shift mask 4 bits left\n    subs x2,x2,#4              // decrement counter 4 bits <= zero  ?\n    bge 1b                     // no -> loop\n \n100:                           // fin standard de la fonction\n    ldp x3,x4,[sp,16]          // restaur des  2 registres\n    ldp x1,x2,[sp,32]          // restaur des  2 registres\n    ldp x0,lr,[sp],48          // restaur des  2 registres\n    ret    \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "misc/y_combinator.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Y_combinator\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program y_combinator.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*******************************************/\n/* Structures                               */\n/********************************************/\n/* structure function*/\n    .struct  0\nfunc_fn:                    // next element\n    .struct  func_fn + 8 \nfunc_f_:                    // next element\n    .struct  func_f_ + 8 \nfunc_num:\n    .struct  func_num + 8 \nfunc_fin:\n \n/* Initialized data */\n.data\nszMessStartPgm:            .asciz \"Program start \\n\"\nszMessEndPgm:              .asciz \"Program normal end.\\n\"\nszMessError:               .asciz \"\\033[31mError Allocation !!!\\n\"\n \nszFactorielle:             .asciz \"Function factorielle : \\n\"\nszFibonacci:               .asciz \"Function Fibonacci : \\n\"\nszCarriageReturn:          .asciz \"\\n\"\n \n/* datas message display */\nszMessResult:            .ascii \"Result value : @ \\n\"\n \n/* UnInitialized data */\n.bss \nsZoneConv:                .skip 100\n/*  code section */\n.text\n.global main \nmain:                                           // program start\n    ldr x0,qAdrszMessStartPgm                   // display start message\n    bl affichageMess\n    adr x0,facFunc                              // function factorielle address\n    bl YFunc                                    // create Ycombinator\n    mov x19,x0                                   // save Ycombinator\n    ldr x0,qAdrszFactorielle                    // display message\n    bl affichageMess\n    mov x20,#1                                   // loop counter\n1:  // start loop\n    mov x0,x20\n    bl numFunc                                  // create number structure\n    cmp x0,#-1                                  // allocation error ?\n    beq 99f\n    mov x1,x0                                   // structure number address\n    mov x0,x19                                  // Ycombinator address\n    bl callFunc                                 // call \n    ldr x0,[x0,#func_num]                       // load result\n    ldr x1,qAdrsZoneConv                        // and convert ascii string\n    bl conversion10S                            // decimal conversion\n    ldr x0,qAdrszMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc                       // insert result at @ character\n    bl affichageMess                            // display message final\n \n    add x20,x20,#1                              // increment loop counter\n    cmp x20,#10                                 // end ?\n    ble 1b                                      // no -> loop\n/*********Fibonacci  *************/\n    adr x0,fibFunc                              // function fibonacci address\n    bl YFunc                                    // create Ycombinator\n    mov x19,x0                                  // save Ycombinator\n    ldr x0,qAdrszFibonacci                      // display message\n    bl affichageMess\n    mov x20,#1                                  // loop counter\n2:  // start loop\n    mov x0,x20\n    bl numFunc                                  // create number structure\n    cmp x0,#-1                                  // allocation error ?\n    beq 99f\n    mov x1,x0                                   // structure number address\n    mov x0,x19                                   // Ycombinator address\n    bl callFunc                                 // call \n    ldr x0,[x0,#func_num]                       // load result\n    ldr x1,qAdrsZoneConv                        // and convert ascii string\n    bl conversion10S\n    ldr x0,qAdrszMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc                       // insert result at @ character\n    bl affichageMess\n    add x20,x20,#1                                   // increment loop counter\n    cmp x20,#10                                  // end ?\n    ble 2b                                      // no -> loop\n    ldr x0,qAdrszMessEndPgm                     // display end message\n    bl affichageMess\n    b 100f\n99:                                             // display error message \n    ldr x0,qAdrszMessError\n    bl affichageMess\n100:                                            // standard end of the program\n    mov x0,0                                    // return code\n    mov x8,EXIT                                 // request to exit program\n    svc 0                                       // perform system call\nqAdrszMessStartPgm:        .quad szMessStartPgm\nqAdrszMessEndPgm:          .quad szMessEndPgm\nqAdrszFactorielle:         .quad szFactorielle\nqAdrszFibonacci:           .quad szFibonacci\nqAdrszMessError:           .quad szMessError\nqAdrszCarriageReturn:      .quad szCarriageReturn\nqAdrszMessResult:          .quad szMessResult\nqAdrsZoneConv:             .quad sZoneConv\n/******************************************************************/\n/*     factorielle function                         */ \n/******************************************************************/\n/* x0 contains the Y combinator address  */\n/* x1 contains the number structure  */\nfacFunc:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    mov x2,x0                   // save Y combinator address\n    ldr x0,[x1,#func_num]       // load number\n    cmp x0,#1                   // > 1 ?\n    bgt 1f                      // yes\n    mov x0,#1                   // create structure number value 1\n    bl numFunc\n    b 100f\n1:\n    mov x3,x0                   // save number\n    sub x0,x0,#1                   // decrement number\n    bl numFunc                  // and create new structure number\n    cmp x0,#-1                  // allocation error ?\n    beq 100f\n    mov x1,x0                   // new structure number -> param 1\n    ldr x0,[x2,#func_f_]        // load function address to execute\n    bl callFunc                 // call\n    ldr x1,[x0,#func_num]       // load new result\n    mul x0,x1,x3                // and multiply by precedent\n    bl numFunc                  // and create new structure number\n                                // and return her address in x0\n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     fibonacci function                         */ \n/******************************************************************/\n/* x0 contains the Y combinator address  */\n/* x1 contains the number structure  */\nfibFunc:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    stp x4,x5,[sp,-16]!            // save  registers\n    mov x2,x0                   // save Y combinator address\n    ldr x0,[x1,#func_num]       // load number\n    cmp x0,#1                   // > 1 ?\n    bgt 1f                      // yes\n    mov x0,#1                   // create structure number value 1\n    bl numFunc\n    b 100f\n1:\n    mov x3,x0                   // save number\n    sub x0,x0,#1                // decrement number\n    bl numFunc                  // and create new structure number\n    cmp x0,#-1                  // allocation error ?\n    beq 100f\n    mov x1,x0                   // new structure number -> param 1\n    ldr x0,[x2,#func_f_]        // load function address to execute\n    bl callFunc                 // call\n    ldr x4,[x0,#func_num]       // load new result\n    sub x0,x3,#2                // new number - 2\n    bl numFunc                  // and create new structure number\n    cmp x0,#-1                  // allocation error ?\n    beq 100f\n    mov x1,x0                   // new structure number -> param 1\n    ldr x0,[x2,#func_f_]        // load function address to execute\n    bl callFunc                 // call\n    ldr x1,[x0,#func_num]       // load new result\n    add x0,x1,x4                // add two results\n    bl numFunc                  // and create new structure number\n                                // and return her address in x0\n100:\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     call function                         */ \n/******************************************************************/\n/* x0 contains the address of the function  */\n/* x1 contains the address of the function 1 */\ncallFunc:\n    stp x2,lr,[sp,-16]!            // save  registers\n    ldr x2,[x0,#func_fn]           // load function address to execute\n    blr x2                         // and call it\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     create Y combinator function                         */ \n/******************************************************************/\n/* x0 contains the address of the function  */\nYFunc:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x1,#0\n    bl newFunc\n    cmp x0,#-1                     // allocation error ?\n    beq 100f\n    str x0,[x0,#func_f_]           // store function and return in x0\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     create structure number function                         */ \n/******************************************************************/\n/* x0 contains the number  */\nnumFunc:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    mov x2,x0                      // save number\n    mov x0,#0                      // function null\n    mov x1,#0                      // function null\n    bl newFunc\n    cmp x0,#-1                     // allocation error ?\n    beq 100f\n    str x2,[x0,#func_num]          // store number in new structure\n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     new function                                               */ \n/******************************************************************/\n/* x0 contains the function address   */\n/* x1 contains the function address 1   */\nnewFunc:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x3,x4,[sp,-16]!            // save  registers\n    stp x5,x8,[sp,-16]!            // save  registers\n    mov x4,x0                      // save address\n    mov x5,x1                      // save adresse 1\n                                   // allocation place on the heap\n    mov x0,#0                      // allocation place heap\n    mov x8,BRK                     // call system 'brk'\n    svc #0\n    mov x6,x0                      // save address heap for output string\n    add x0,x0,#func_fin            // reservation place one element\n    mov x8,BRK                     // call system 'brk'\n    svc #0\n    cmp x0,#-1                     // allocation error\n    beq 100f\n    mov x0,x6\n    str x4,[x0,#func_fn]           // store address\n    str x5,[x0,#func_f_]\n    str xzr,[x0,#func_num]         // store zero to number\n100:\n    ldp x5,x8,[sp],16              // restaur  2 registers\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/bead_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Bead_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program bead_sort.s */\n/* En français tri par gravité ou tri par bille (ne pas confondre \n   avec tri par bulle (bubble sort)) */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\nTableNumber:     .quad   10,9,8,7,6,5,4,3,2,1\n                  .equ NBELEMENTS, (. - TableNumber) / 8\n           //.equ NBELEMENTS, 4 // for others tests\n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:            .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                         // entry of program \n \n1:\n    ldr x0,qAdrTableNumber    // address number table\n    mov x1,#NBELEMENTS        // number of élements \n    bl beadSort\n    ldr x0,qAdrTableNumber    // address number table\n    mov x1,#NBELEMENTS        // number of élements \n    bl displayTable\n \n    ldr x0,qAdrTableNumber    // address number table\n    mov x1,#NBELEMENTS        // number of élements \n    bl isSorted               // control sort\n    cmp x0,#1                 // sorted ?\n    beq 2f\n    ldr x0,qAdrszMessSortNok  // no !! error sort\n    bl affichageMess\n    b 100f\n2:                            // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                          // standard end of the program \n    mov x0, #0                // return code\n    mov x8, #EXIT             // request to exit program\n    svc #0                    // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!          // save  registers\n    stp x3,x4,[sp,-16]!          // save  registers\n    mov x2,#0\n    ldr x4,[x0,x2,lsl #3]        // load A[0]\n1:\n    add x2,x2,#1\n    cmp x2,x1                    // end ?\n    bge 99f\n    ldr x3,[x0,x2, lsl #3]       // load A[i]\n    cmp x3,x4                    // compare A[i],A[i-1]\n    blt 98f                      // smaller -> error -> return\n    mov x4,x3                    // no -> A[i-1] = A[i]\n    b 1b                         // and loop \n98:\n    mov x0,#0                    // error\n    b 100f\n99:\n    mov x0,#1                    // ok -> return\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n/******************************************************************/\n/*         bead sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of element */\n/* Caution registers x2-x12 are not saved */\nbeadSort:\n    stp x1,lr,[sp,-16]!       // save  registers\n    mov x12,x1                // save elements number\n                              //search max\n    ldr x10,[x0]              // load value A[0] in max\n    mov x4,#1\n1:                            // loop search max\n    cmp x4,x12                // end ?\n    bge 21f                   // yes\n    ldr x2,[x0,x4,lsl #3]     // load value A[i]\n    cmp x2,x10                // compare with max\n    csel x10,x2,x10,gt        // if greather\n    add x4,x4,#1\n    b 1b                      // loop\n21:\n    mul x5,x10,x12            // max * elements number\n    lsl x5,x5,#3              // 8 bytes for each number\n    sub sp,sp,x5              // allocate on the stack\n    mov fp,sp                 // frame pointer = stack address\n                              // marks beads\n    mov x3,x0                 // save table address\n    mov x0,#0                 // start index x\n2:\n    mov x1,#0                 // index y\n    ldr x8,[x3,x0,lsl #3]     // load A[x]\n    mul x6,x0,x10             // compute bead x\n3:\n    add x9,x6,x1              // compute bead y\n    mov x4,#1                 // value to store\n    str x4,[fp,x9,lsl #3]     // store to stack area\n    add x1,x1,#1\n    cmp x1,x8\n    blt 3b\n31:                           // init to zéro the bead end \n    cmp x1,x10                // max ?\n    bge 32f\n    add x9,x6,x1              // compute bead y\n    mov x4,#0\n    str x4,[fp,x9,lsl #3]\n    add x1,x1,#1\n    b 31b\n32:\n    add x0,x0,#1              // increment x\n    cmp x0,x12                // end ?\n    blt 2b\n                              // count beads\n    mov x1,#0                 // y\n4:\n    mov x0,#0                 // start index x\n    mov x8,#0                 // sum\n5:\n    mul x6,x0,x10             // compute bead x\n    add x9,x6,x1              // compute bead y\n    ldr x4,[fp,x9,lsl #3]\n    add x8,x8,x4\n    mov x4,#0\n    str x4,[fp,x9,lsl #3]     // raz bead\n    add x0,x0,#1\n    cmp x0,x12\n    blt 5b\n    sub x0,x12,x8             // compute end - sum\n6:\n    mul x6,x0,x10             // compute bead x\n    add x9,x6,x1              // compute bead y\n    mov x4,#1\n    str x4,[fp,x9,lsl #3]     // store new bead at end\n    add x0,x0,#1\n    cmp x0,x12\n    blt 6b\n \n    add x1,x1,#1\n    cmp x1,x10\n    blt 4b\n \n                              // final compute\n    mov x0,#0                 // start index x\n7:\n    mov x1,#0                 // start index y\n    mul x6,x0,x10             // compute bead x\n8:\n    add x9,x6,x1              // compute bead y\n    ldr x4,[fp,x9,lsl #3]     // load bead [x,y]\n    add x1,x1,#1              // add to x1 before str (index start at zéro)\n    cmp x4,#1\n    bne 9f\n    str x1,[x3,x0, lsl #3]    // store A[x]\n9:\n    cmp x1,x10                // compare max\n    blt 8b\n    add x0,x0,#1\n    cmp x0,x12                // end ?\n    blt 7b\n \n    mov x0,#0\n    add sp,sp,x5              // stack alignement\n100:\n    ldp x1,lr,[sp],16         // restaur  2 registers\n    ret                       // return to address lr x30\n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains elements number  */\ndisplayTable:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    mov x2,x0                    // table address\n    mov x4,x1                    // elements number\n    mov x3,#0\n1:                               // loop display table\n    ldr x0,[x2,x3,lsl #3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10              // décimal conversion \n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv         // insert conversion\n    bl strInsertAtCharInc\n    bl affichageMess             // display message\n    add x3,x3,#1\n    cmp x3,x4                    // end ?\n    blt 1b                       // no -> loop\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\nqAdrsZoneConv:           .quad sZoneConv\n \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/bogo_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Bogosort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program bogo_sort.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nsMessResult:      .asciz \"Value  : @ \\n\"\nszCarriageReturn: .asciz \"\\n\"\n \n.align 4\nqGraine:  .quad 123456\nTableNumber:       .quad   1,2,3,4,5,6,7,8,9,10\n                   .equ NBELEMENTS, (. - TableNumber) / 8\n \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:          .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                           // entry of program \n \n1:\n    ldr x0,qAdrTableNumber                      // address number table\n    mov x1,#NBELEMENTS                          // number of élements \n    bl knuthShuffle\n                                                // table  display elements\n    ldr x0,qAdrTableNumber                      // address number table\n    mov x1,#NBELEMENTS                          // number of élements \n    bl displayTable\n \n    ldr x0,qAdrTableNumber                      // address number table\n    mov x1,#NBELEMENTS                          // number of élements \n    bl isSorted                                 // control sort\n    cmp x0,#1                                   // sorted ?\n    bne 1b                                      // no -> loop\n \n \n100:                                            // standard end of the program \n    mov x0, #0                                  // return code\n    mov x8, #EXIT                               // request to exit program\n    svc #0                                      // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\n \n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!          // save  registers\n    stp x3,x4,[sp,-16]!          // save  registers\n    mov x2,#0\n    ldr x4,[x0,x2,lsl #3]        // load A[0]\n1:\n    add x2,x2,#1\n    cmp x2,x1                    // end ?\n    bge 99f\n    ldr x3,[x0,x2, lsl #3]       // load A[i]\n    cmp x3,x4                    // compare A[i],A[i-1]\n    blt 98f                      // smaller -> error -> return\n    mov x4,x3                    // no -> A[i-1] = A[i]\n    b 1b                         // and loop \n98:\n    mov x0,#0                    // error\n    b 100f\n99:\n    mov x0,#1                    // ok -> return\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains elements number  */\ndisplayTable:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    mov x2,x0                    // table address\n    mov x4,x1                    // elements number\n    mov x3,#0\n1:                               // loop display table\n    ldr x0,[x2,x3,lsl #3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10              // décimal conversion \n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv         // insert conversion\n    bl strInsertAtCharInc\n    bl affichageMess             // display message\n    add x3,x3,#1\n    cmp x3,x4                    // end ?\n    blt 1b                       // no -> loop\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\nqAdrsZoneConv:           .quad sZoneConv\n/******************************************************************/\n/*     shuffle game                                       */ \n/******************************************************************/\n/* x0 contains boxs address           */\n/* x1 contains elements number        */\nknuthShuffle:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    stp x4,x5,[sp,-16]!            // save  registers\n    mov x5,x0                      // save table address\n    mov x2,#0                      // start index\n1:\n    mov x0,x2                      // generate aleas\n    bl genereraleas\n    ldr x3,[x5,x2,lsl #3]          // swap number on the table\n    ldr x4,[x5,x0,lsl #3]\n    str x4,[x5,x2,lsl #3]\n    str x3,[x5,x0,lsl #3]\n    add x2,x2,1                                         // next number\n    cmp x2,x1                                         // end ?\n    blt 1b                                            // no -> loop\n \n100:\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/***************************************************/\n/*   Generation random number                  */\n/***************************************************/\n/* x0 contains limit  */\ngenereraleas:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    ldr x1,qAdrqGraine\n    ldr x2,[x1]\n    ldr x3,qNbDep1\n    mul x2,x3,x2\n    ldr x3,qNbDep2\n    add x2,x2,x3\n    str x2,[x1]                    // maj de la graine pour l appel suivant \n    cmp x0,#0\n    beq 100f\n    udiv x3,x2,x0\n    msub x0,x3,x0,x2               // résult = remainder\n \n100:                               // end function\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\nqAdrqGraine: .quad qGraine\nqNbDep1:     .quad 0x0019660d\nqNbDep2:     .quad 0x3c6ef35f\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/bubble_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program bubble_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\n#TableNumber:     .quad   10,9,8,7,6,5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0\n    mov x2,NBELEMENTS                              // number of élements \n    bl bubbleSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         bubble sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first element    */\n/* x2 contains the number of element */\nbubbleSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    sub x2,x2,1                // compute i = n - 1\n    add x8,x1,1\n1:                             // start loop 1\n    mov x3,x1                  // start index\n    mov x9,0\n    sub x7,x2,1\n2:                             // start loop 2\n    add x4,x3,1\n    ldr x5,[x0,x3,lsl 3]       // load value A[j]\n    ldr x6,[x0,x4,lsl 3]       // load value A[j+1]\n    cmp x6,x5                  // compare value\n    bge 3f \n    str x6,[x0,x3,lsl 3]       // if smaller inversion\n    str x5,[x0,x4,lsl 3] \n    mov x9,1                   // top table not sorted\n3:\n    add x3,x3,1                // increment index j\n    cmp x3,x7                  // end ?\n    ble 2b                     // no -> loop 2\n    cmp x9,0                   // table sorted ?\n    beq 100f                   // yes -> end\n \n    sub x2,x2,1                // decrement i\n    cmp x2,x8                  // end ?\n    bge 1b                     // no -> loop 1\n \n100:\n    ldp x8,x9,[sp],16          // restaur  2 registers\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/circle_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_Algorithms/Circle_Sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program circle_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nszMessSortBefore:   .asciz \"Display table before sort.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\n#TableNumber:       .quad   1,2,3,4,5,6,7,8,9,10\n#TableNumber:       .quad   9,5,12,8,2,12,6\nTableNumber:       .quad   10,9,8,7,6,5,4,3,2,1\n                   .equ NBELEMENTS, (. - TableNumber) / 8\n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:            .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                               // entry of program \n    ldr x0,qAdrszMessSortBefore\n    bl affichageMess\n    ldr x0,qAdrTableNumber          // address number table\n    bl displayTable\n1:\n    ldr x0,qAdrTableNumber          // address number table\n    mov x1,#0\n    mov x2,#NBELEMENTS -1           // number of élements \n    mov x3,#0\n    bl circleSort\n    cmp x0,#0\n    bne 1b\n    ldr x0,qAdrTableNumber          // address number table\n    mov x1,#NBELEMENTS              // number of élements \n    bl displayTable\n \n    ldr x0,qAdrTableNumber          // address number table\n    mov x1,#NBELEMENTS              // number of élements \n    bl isSorted                     // control sort\n    cmp x0,#1                       // sorted ?\n    beq 2f                                    \n    ldr x0,qAdrszMessSortNok        // no !! error sort\n    bl affichageMess\n    b 100f\n2:                                  // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                // standard end of the program \n    mov x0, #0                      // return code\n    mov x8, #EXIT                   // request to exit program\n    svc #0                          // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\nqAdrszMessSortBefore:     .quad szMessSortBefore\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!          // save  registers\n    stp x3,x4,[sp,-16]!          // save  registers\n    mov x2,#0\n    ldr x4,[x0,x2,lsl #3]\n1:\n    add x2,x2,#1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl #3]\n    cmp x3,x4\n    blt 98f                      // smaller -> error\n    mov x4,x3                    // A[i-1] = A[i]\n    b 1b                         // else loop\n98:\n    mov x0,#0                    // error\n    b 100f\n99:\n    mov x0,#1                    // ok -> return\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n/******************************************************************/\n/*         circle sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first index */\n/* x2 contains the last index */\n/* x3 contains number of swaps */\ncircleSort:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    stp x4,x5,[sp,-16]!          // save  registers\n    stp x6,x7,[sp,-16]!          // save  registers\n    stp x8,x9,[sp,-16]!          // save  registers\n    stp x10,x11,[sp,-16]!        // save  registers\n    cmp x1,x2\n    beq 99f\n    mov x7,x0                    // save address\n    mov x8,x1                    // low\n    mov x9,x2                    // high\n    sub x4,x2,x1\n    lsr x4,x4,#1\n    mov x10,x4                   // mid\n1:                               // start loop\n    cmp x1,x2\n    bge 3f\n    ldr x5,[x0,x1,lsl #3]\n    ldr x6,[x0,x2,lsl #3]\n    cmp x5,x6\n    ble 2f\n    str x6,[x0,x1,lsl #3]        // swap values\n    str x5,[x0,x2,lsl #3] \n    add x3,x3,#1\n2:\n    add x1,x1,#1                 // increment lo\n    sub x2,x2,#1                 // decrement hi\n    b 1b                         // and loop\n3:\n    cmp x1,x2                    // compare lo hi\n    bne 4f                       // not egal\n    ldr x5,[x0,x1,lsl #3]\n    add x2,x2,#1\n    ldr x6,[x0,x2,lsl #3]\n    cmp x5,x6 \n    ble 4f\n    str x6,[x0,x1,lsl #3]        //  swap\n    str x5,[x0,x2,lsl #3] \n    add x3,x3,#1\n4:\n    mov x1,x8                    // low\n    mov x2,x10                   // mid\n    add x2,x2,x1\n    bl circleSort\n    mov x3,x0                    // swaps\n    mov x0,x7                    // table address\n    mov x1,x8                    // low\n    mov x2,x10                   // mid\n    add x1,x2,x1\n    add x1,x1,#1\n    mov x2,x9                    // high\n    bl circleSort\n    mov x3,x0                    // swaps\n99:\n    mov x0,x3                    // return number swaps\n100:\n    ldp x10,x11,[sp],16          // restaur  2 registers\n    ldp x8,x9,[sp],16            // restaur  2 registers\n    ldp x6,x7,[sp],16            // restaur  2 registers\n    ldp x4,x5,[sp],16            // restaur  2 registers\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    mov x2,x0                    // table address\n    mov x3,#0\n1:                               // loop display table\n    ldr x0,[x2,x3,lsl #3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10              // décimal conversion \n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv         // insert conversion\n    bl strInsertAtCharInc\n    bl affichageMess             // display message\n    add x3,x3,#1\n    cmp x3,#NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\nqAdrsZoneConv:           .quad sZoneConv\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/cocktail_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Cocktail_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program cocktail_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\nTableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0\n    mov x2,NBELEMENTS                              // number of élements \n    bl cocktailSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         cocktail sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first element    */\n/* x2 contains the number of element */\ncocktailSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    sub x2,x2,1                // compute i = n - 1\n1:                             // start loop 1\n    mov x3,x1                  // start index\n    mov x9,0\n    sub x7,x2,1\n2:                             // start loop 2\n    add x4,x3,1\n    ldr x5,[x0,x3,lsl 3]       // load value A[j]\n    ldr x6,[x0,x4,lsl 3]       // load value A[j+1]\n    cmp x6,x5                  // compare value\n    bge 3f \n    str x6,[x0,x3,lsl 3]       // if smaller inversion\n    str x5,[x0,x4,lsl 3] \n    mov x9,1                   // top table not sorted\n3:\n    add x3,x3,1                // increment index j\n    cmp x3,x7                  // end ?\n    ble 2b                     // no -> loop 2\n    cmp x9,0                   // table sorted ?\n    beq 100f                   // yes -> end\n    mov x9,0\n    mov x3,x7\n4:\n    add x4,x3,1\n    ldr x5,[x0,x3,lsl 3]       // load value A[j]\n    ldr x6,[x0,x4,lsl 3]       // load value A[j+1]\n    cmp x6,x5                  // compare value\n    bge 5f \n    str x6,[x0,x3,lsl 3]       // if smaller inversion\n    str x5,[x0,x4,lsl 3] \n    mov x9,1                   // top table not sorted\n5:\n    sub x3,x3,1                // decrement index j\n    cmp x3,x1                  // end ?\n    bge 4b                     // no -> loop 2\n \n    cmp x9,0                   // table sorted ?\n    bne 1b                     // no -> loop 1\n \n100:\n    ldp x8,x9,[sp],16          // restaur  2 registers\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/comb_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Comb_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program comb_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\nTableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0\n    mov x2,NBELEMENTS                              // number of élements \n    bl combSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         comb sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first element    */\n/* x2 contains the number of element */\n/* this routine use à factor to 1.28  see wikipedia for best factor */\ncombSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    sub x9,x2,x1               // compute gap\n    sub x2,x2,1                // compute end index n - 1\n    mov x7,100\n1:                             // start loop 1\n    mul x9,x7,x9               // gap multiply by 100\n    lsr x9,x9,7                // divide by 128\n    cmp x9,0\n    mov x3,1\n    csel x9,x9,x3,ne\n    mov x3,x1                  // start index\n    mov x8,0                   // swaps\n2:                             // start loop 2\n    add x4,x3,x9               // add gap to indice\n    cmp x4,x2\n    bgt 4f\n    ldr x5,[x0,x3,lsl 3]       // load value A[j]\n    ldr x6,[x0,x4,lsl 3]       // load value A[j+1]\n    cmp x6,x5                  // compare value\n    bge 3f \n    str x6,[x0,x3,lsl 3]       // if smaller inversion\n    str x5,[x0,x4,lsl 3] \n    mov x8,1                   // swaps\n3:\n    add x3,x3,1                // increment index j\n    b 2b\n \n4:\n    //bl displayTable\n    cmp x9,1                   // gap = 1 ?\n    bne 1b                     // no loop\n    cmp x8,1                   // swaps ?\n    beq 1b                     // yes -> loop 1\n \n100:\n    ldp x8,x9,[sp],16          // restaur  2 registers\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/counting_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Counting_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program counting_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#Caution : number strictly positive and not too big\nTableNumber:      .quad   1,3,6,2,5,9,10,8,4,5\n//TableNumber:     .quad   10,9,8,7,6,5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl searchMinMax\n    mov x3,NBELEMENTS\n    bl countSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return table address  r1 return min  r2 return max */\nsearchMinMax:\n    stp x3,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x3,x1                        // save size\n    mov x1,1<<62                     // min\n    mov x2,0                         // max\n    mov x4,0                         // index\n1:\n    ldr x5,[x0,x4,lsl 3]\n    cmp x5,x1\n    csel x1,x5,x1,lt\n    cmp x5,x2\n    csel x2,x5,x2,gt\n    add x4,x4,1\n    cmp x4,x3\n    blt 1b\n100:\n    ldp x4,x5,[sp],16                // restaur  2 registers\n    ldp x3,lr,[sp],16                // restaur  2 registers\n    ret                              // return to address lr x30\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         count sort                                             */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the minimum          */\n/* x2 contains the maximum          */\n/* x3 contains area size            */ \n/* caution : the count area is in the stack. if max is very large, risk of error */ \ncountSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    sub x3,x3,1                // compute endidx = n - 1\n    sub x5,x2,x1               // compute max - min\n    add x5,x5,1                // + 1\n    lsl x9,x5,3                // 8 bytes by number\n    sub sp,sp,x9               // reserve count area in stack\n    mov fp,sp                  // frame pointer = stack\n    mov x6,0\n    mov x4,0\n1:                             // loop init stack area \n    str x6,[fp,x4, lsl 3]\n    add x4,x4,#1\n    cmp x4,x5\n    blt 1b\n    mov x4,#0                  // indice\n2:                             // start loop 2\n    ldr x5,[x0,x4,lsl 3]       // load value A[j]\n    sub x5,x5,x1               // - min\n    ldr x6,[fp,x5,lsl 3]       // load count of value\n    add x6,x6,1                // increment counter\n    str x6,[fp,x5,lsl 3]       // and store \n    add x4,x4,1                // increment indice\n    cmp x4,x3                  // end ?\n    ble 2b                     // no -> loop 2\n \n    mov x7,0                   // z\n    mov x4,x1                  // index = min\n3:                             // start loop 3\n    sub x6,x4,x1               // compute index - min\n    ldr x5,[fp,x6,lsl 3]       // load count\n4:                             // start loop 4\n    cmp x5,0                   // count <> zéro\n    beq 5f\n    str x4,[x0,x7,lsl 3]       // store value A[j]\n    add x7,x7,1                // increment z\n    sub x5,x5,1                // decrement count  \n    b  4b\n \n5:\n    add x4,x4,1                // increment index\n    cmp x4,x2                  // max ?\n    ble 3b                     // no -> loop 3\n \n    add sp,sp,x9               // stack alignement\n \n100:\n    ldp x8,x9,[sp],16          // restaur  2 registers\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2                       // table address\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/gnome_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Gnome_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program gnome_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\n#TableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl gnomeSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         gnome sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first element    */\n/* x2 contains the number of element */\ngnomeSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    sub x2,x2,1                // compute end index n - 1\n    add x3,x1,1                // index i\n    add x7,x1,2                // index j\n1:                             // start loop 1\n    cmp x3,x2\n    bgt 100f\n    sub x4,x3,1                // \n    ldr x5,[x0,x3,lsl 3]       // load value A[j]\n    ldr x6,[x0,x4,lsl 3]       // load value A[j+1]\n    cmp x5,x6                  // compare value\n    bge 2f \n    str x6,[x0,x3,lsl 3]       // if smaller inversion\n    str x5,[x0,x4,lsl 3] \n    sub x3,x3,1                // i = i - 1\n    cmp x3,x1\n    bne 1b                     // loop 1\n2:\n    mov x3,x7                  // i = j\n    add x7,x7,1                // j = j + 1\n    b 1b                       // loop 1\n \n100:\n    ldp x8,x9,[sp],16          // restaur  2 registers\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/heap_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Heapsort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program heap_sort.s   */\n/* look Pseudocode begin this task  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:  .asciz \"\\n\"\n \n.align 4\n//TableNumber:         .quad   1,3,6,2,5,9,10,8,4,7\nTableNumber:         .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                           // entry of program \n \n1:\n    ldr x0,qAdrTableNumber                      // address number table\n    mov x1,#NBELEMENTS                          // number of élements \n    bl heapSort\n    ldr x0,qAdrTableNumber                      // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                      // address number table\n    mov x1,#NBELEMENTS                          // number of élements \n    bl isSorted                                 // control sort\n    cmp x0,#1                                   // sorted ?\n    beq 2f                                    \n    ldr x0,qAdrszMessSortNok                    // no !! error sort\n    bl affichageMess\n    b 100f\n2:                                              // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                            // standard end of the program \n    mov x0, #0                                  // return code\n    mov x8, #EXIT                               // request to exit program\n    svc #0                                      // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,#0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                      // not sorted\n    b 100f\n99:\n    mov x0,1                      // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         heap sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of element */\nheapSort:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    bl heapify                     // first place table in max-heap order\n    sub x3,x1,1\n1:\n    cmp x3,0\n    ble 100f\n    mov x1,0                       // swap the root(maximum value) of the heap with the last element of the heap)\n    mov x2,x3\n    bl swapElement\n    sub x3,x3,1\n    mov x1,0\n    mov x2,x3                      // put the heap back in max-heap order\n    bl siftDown\n    b 1b\n \n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*      place table in max-heap order                             */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of element */\nheapify:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    str x4,[sp,-16]!               // save  registers\n    mov x4,x1\n    sub x3,x1,2\n    lsr x3,x3,1\n1:\n    cmp x3,0\n    blt 100f\n    mov x1,x3\n    sub x2,x4,1\n    bl siftDown\n    sub x3,x3,1\n    b 1b\n100:\n    ldr x4,[sp],16                 // restaur  1 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     swap two elements of table                                  */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first index */\n/* x2 contains the second index */\nswapElement:\n    stp x2,lr,[sp,-16]!            // save  registers\n    stp x3,x4,[sp,-16]!            // save  registers\n    ldr x3,[x0,x1,lsl #3]          // swap number on the table\n    ldr x4,[x0,x2,lsl #3]\n    str x4,[x0,x1,lsl #3]\n    str x3,[x0,x2,lsl #3]\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/******************************************************************/\n/*     put the heap back in max-heap order                        */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first index */\n/* x2 contains the last index */\nsiftDown:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    stp x4,x5,[sp,-16]!            // save  registers\n    stp x6,x7,[sp,-16]!            // save  registers\n                                   // x1 = root = start\n    mov x3,x2                      // save last index\n1:\n    lsl x4,x1,1\n    add x4,x4,1\n    cmp x4,x3\n    bgt 100f\n    add x5,x4,1\n    cmp x5,x3\n    bgt 2f\n    ldr x6,[x0,x4,lsl 3]           // compare elements on the table\n    ldr x7,[x0,x5,lsl 3]\n    cmp x6,x7\n    csel x4,x5,x4,lt\n    //movlt x4,x5\n2:\n    ldr x7,[x0,x4,lsl 3]           // compare elements on the table\n    ldr x6,[x0,x1,lsl 3]           // root\n    cmp x6,x7\n    bge 100f\n    mov x2,x4                      // and x1 is root\n    bl swapElement\n    mov x1,x4                      // root = child\n    b 1b\n \n100: \n    ldp x6,x7,[sp],16              // restaur  2 registers\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\nqAdrsZoneConv:            .quad sZoneConv\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/insertion_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Insertion_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program insertion_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\nTableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl insertionSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         insertion sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first element    */\n/* x2 contains the number of element */\ninsertionSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    add x3,x1,1                // index i\n1:                             // start loop 1\n    ldr x4,[x0,x3,lsl 3]       // load value A[i]\n    sub x5,x3,1                // index j\n2:                             // start loop 2\n    ldr x6,[x0,x5,lsl 3]       // load value A[j]\n    cmp x6,x4                  // compare value\n    ble 3f \n    add x5,x5,1                // increment index j\n    str x6,[x0,x5,lsl 3]       // store value A[j+1}\n    sub x5,x5,2                // j = j - 1\n    cmp x5,x1                  // compare first element\n    bge 2b                     // loop 2\n3:\n    add x5,x5,1                // increment index j\n    str x4,[x0,x5,lsl 3]       // store value A[i}\n    add x3,x3,1                // increment index i\n    cmp x3,x2                  // end ?\n    blt 1b                     // loop 1\n \n100:\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/jort_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/JortSort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program jort_sort.s */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessOk:         .asciz \"Ok, the list is sorted. \\n\"\nszMessNotOk:      .asciz \"Ouah!! this list is unsorted.\\n\"\nszCarriageReturn:  .asciz \"\\n\"\ntbNumber:           .quad 3\n                    .quad 4\n                    .quad 20\n                    .quad 5\n                    .equ LGTBNUMBER, (. - tbNumber)/8  // number element of area \n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \nsZoneConversion:        .skip 100\n.align 4\ntbNumberSorted:      .skip 8 * LGTBNUMBER\n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain:                             // entry of program\n    ldr x0,qAdrtbNumber\n    ldr x1,qAdrtbNumberSorted\n    mov x2,LGTBNUMBER\n    bl insertionSort              // sort area\n    ldr x0,qAdrtbNumber\n    ldr x1,qAdrtbNumberSorted\n    mov x2,LGTBNUMBER\n    bl comparArea                // control area\n    cbz x0,1f\n    ldr x0,qAdrszMessNotOk       // not sorted\n    bl affichageMess\n    b 100f\n1:                               // ok it is good\n    ldr x0,qAdrszMessOk\n    bl affichageMess\n100:                             // standard end of the program\n    mov x0, #0                   // return code\n    mov x8, #EXIT                // request to exit program\n    svc 0                        // perform the system call\n \nqAdrtbNumber:          .quad tbNumber\nqAdrtbNumberSorted:    .quad tbNumberSorted\nqAdrszMessNotOk:       .quad szMessNotOk\nqAdrszMessOk:          .quad szMessOk\nqAdrszCarriageReturn:  .quad szCarriageReturn\n/******************************************************************/\n/*     insertion sort                                             */ \n/******************************************************************/\n/* x0 contains the address of area to sort  */\n/* x1 contains the address of area sorted   */\n/* x2 contains the number of element */\ninsertionSort:\n    stp x1,lr,[sp,-16]!         // save  registers\n    stp x2,x3,[sp,-16]!         // save  registers\n    mov x3,0\n1:                              // copy area unsorted to other area\n    ldr x4,[x0,x3,lsl 3]\n    str x4,[x1,x3,lsl 3]\n    add x3,x3,1\n    cmp x3,x2\n    blt 1b\n \n    mov x3,1                   // and sort area\n2:\n    ldr x4,[x1,x3,lsl 3]\n    subs x5,x3,1\n3:\n    cbz x5,4f\n    ldr x6,[x1,x5,lsl 3]\n    cmp x6,x4\n    ble 4f\n    add x7,x5,1\n    str x6,[x1,x7,lsl 3]\n    subs x5,x5,1\n    b 3b\n4:\n    add x5,x5,1\n    str x4,[x1,x5,lsl 3]\n    add x3,x3,1\n    cmp x3,x2\n    blt 2b\n100:\n    ldp x2,x3,[sp],16           // restaur  2 registers\n    ldp x1,lr,[sp],16           // restaur  2 registers\n    ret\n/******************************************************************/\n/*     Comparaison elements of two areas                          */ \n/******************************************************************/\n/* x0 contains the address of area to sort  */\n/* x1 contains the address of area sorted   */\n/* x2 contains the number of element */\ncomparArea:\n    stp x1,lr,[sp,-16]!         // save  registers\n    stp x2,x3,[sp,-16]!         // save  registers\n    mov x3,0\n1:\n    ldr x4,[x0,x3,lsl 3]        // load element area 1\n    ldr x5,[x1,x3,lsl 3]        // load element area 2\n    cmp x4,x5                   // equal ?\n    bne 99f                     // no -> error\n    add x3,x3,1                 // yes increment indice\n    cmp x3,x2                   // maxi ?\n    blt 1b                      // no -> loop\n    mov x0,0                    // yes -> it is ok \n    b 100f\n99:\n    mov x0,1 \n100:\n    ldp x2,x3,[sp],16           // restaur  2 registers\n    ldp x1,lr,[sp],16           // restaur  2 registers\n    ret\n \n \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/merge_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program merge_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,11,6,2,5,9,10,8,4,7\n#TableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl mergeSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         merge                                              */ \n/******************************************************************/\n/* r0 contains the address of table */\n/* r1 contains first start index\n/* r2 contains second start index */\n/* r3 contains the last index   */ \nmerge:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    str x8,[sp,-16]!\n    mov x5,x2                  // init index x2->x5 \n1:                             // begin loop first section\n    ldr x6,[x0,x1,lsl 3]       // load value first section index r1\n    ldr x7,[x0,x5,lsl 3]       // load value second section index r5\n    cmp x6,x7\n    ble 4f                     // <=  -> location first section OK\n    str x7,[x0,x1,lsl 3]       // store value second section in first section\n    add x8,x5,1\n    cmp x8,x3                  // end second section ?\n    ble 2f\n    str x6,[x0,x5,lsl 3]\n    b 4f                       // loop\n2:                             // loop insert element part 1 into part 2\n    sub x4,x8,1\n    ldr x7,[x0,x8,lsl 3]       // load value 2\n    cmp x6,x7                  // value < \n    bge 3f\n    str x6,[x0,x4,lsl 3]       // store value \n    b 4f                       // loop\n3:\n    str x7,[x0,x4,lsl 3]       // store value 2\n    add x8,x8,1\n    cmp x8,x3                  // end second section ?\n    ble 2b                     // no loop \n    sub x8,x8,1\n    str x6,[x0,x8,lsl 3]       // store value 1\n4:\n    add x1,x1,1\n    cmp x1,x2                  // end first section ?\n    blt 1b\n \n100:\n    ldr x8,[sp],16             // restaur 1 register\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n/******************************************************************/\n/*      merge sort                                                */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the index of first element */\n/* x2 contains the number of element */\nmergeSort:\n    stp x3,lr,[sp,-16]!    // save  registers\n    stp x4,x5,[sp,-16]!    // save  registers\n    stp x6,x7,[sp,-16]!    // save  registers\n    cmp x2,2               // end ?\n    blt 100f\n    lsr x4,x2,1            // number of element of each subset\n    add x5,x4,1\n    tst x2,#1              // odd ?\n    csel x4,x5,x4,ne\n    mov x5,x1              // save first element\n    mov x6,x2              // save number of element\n    mov x7,x4              // save number of element of each subset\n    mov x2,x4\n    bl mergeSort\n    mov x1,x7              // restaur number of element of each subset\n    mov x2,x6              // restaur  number of element\n    sub x2,x2,x1\n    mov x3,x5              // restaur first element\n    add x1,x1,x3              // + 1\n    bl mergeSort           // sort first subset\n    mov x1,x5              // restaur first element\n    mov x2,x7              // restaur number of element of each subset\n    add x2,x2,x1\n    mov x3,x6              // restaur  number of element\n    add x3,x3,x1 \n    sub x3,x3,1              // last index\n    bl merge\n100:\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x3,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at // character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/pancake_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Pancake_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program pancake_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nsMessCounter:       .asciz \"sorted in  @ flips \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,11,6,2,-5,9,10,8,4,7\n#TableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl pancakeSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n    mov x0,x10                                     // display counter\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                               // décimal conversion\n    ldr x0,qAdrsMessCounter\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc                          // insert result at @ character\n    bl affichageMess                               // display message\n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\nqAdrsMessCounter:         .quad sMessCounter\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/******************************************************************/\n/*         flip                                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains first start index\n/* x2 contains the number of elements  */\n/* x3 contains the position of flip   */ \nflip:\n    //push {r1-r6,lr}             // save registers\n    stp x1,lr,[sp,-16]!           // save  registers\n    stp x2,x3,[sp,-16]!           // save  registers\n    stp x4,x5,[sp,-16]!           // save  registers\n    str x6,   [sp,-16]!           // save  registers\n    add x10,x10,#1                // flips counter\n    cmp x3,x2\n    sub x4,x2,1\n    csel x3,x4,x3,ge               // last index if position >= size\n1:\n    cmp x1,x3\n    bge 100f\n    ldr x5,[x0,x1,lsl 3]         // load value first  index \n    ldr x6,[x0,x3,lsl 3]         // load value position index\n    str x6,[x0,x1,lsl 3]         // inversion\n    str x5,[x0,x3,lsl 3]         // \n    sub x3,x3,1\n    add x1,x1,1\n    b 1b\n100:\n    ldr x6,   [sp],16              // restaur  1 register\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         pancake sort                                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains first start index\n/* x2 contains the number of elements  */\npancakeSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    sub x7,x2,1                // last index\n1:\n    mov x5,x1                  // index\n    mov x4,0                   // max\n    mov x3,0                   // position\n    mov x8,1                   // top sorted\n    ldr x9,[x0,x5,lsl 3]       // load value A[i-1]\n2:\n    ldr x6,[x0,x5,lsl 3]       // load value \n    cmp x6,x4                  // compare max\n    csel x4,x6,x4,ge           // max = A[i}\n    csel x3,x5,x3,ge           // position = index\n    cmp x6,x9                  // cmp A[i] A[i-1] sorted ?\n    csel x8,xzr,x8,lt          // no\n    mov x9,x6                  //  A[i-1] = A[i]\n    add x5,x5,1                // increment index\n    cmp x5,x7                  // end ?\n    ble 2b\n    cmp x8,1                   // sorted ?\n    beq 100f                   // yes -> end\n    cmp x3,x7                  // position ok ?\n    beq 4f                     // yes\n    cmp x3,0                   // first position ?\n    beq 3f\n    bl flip                    // flip if not greather in first position\n3:\n    mov x3,x7                  // and flip the whole stack\n    bl flip\n4:  \n    //bl displayTable          // to display an intermediate state\n    subs x7,x7,1               // decrement number of pancake\n    bge 1b                     // and loop\n100:\n    ldp x8,x9,[sp],16          // restaur  2 registers\n    ldp x6,x7,[sp],16          // restaur  2 registers\n    ldp x4,x5,[sp],16          // restaur  2 registers\n    ldp x2,x3,[sp],16          // restaur  2 registers\n    ldp x1,lr,[sp],16          // restaur  2 registers\n    ret                        // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/patience_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Patience_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program patience_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*******************************************/\n/* Structures                               */\n/********************************************/\n/* structure Doublylinkedlist*/\n    .struct  0\ndllist_head:                    // head node\n    .struct  dllist_head + 8\ndllist_tail:                    // tail node\n    .struct  dllist_tail  + 8\ndllist_fin:\n/* structure Node Doublylinked List*/\n    .struct  0\nNDlist_next:                    // next element\n    .struct  NDlist_next + 8 \nNDlist_prev:                    // previous element\n    .struct  NDlist_prev + 8 \nNDlist_value:                   // element value or key\n    .struct  NDlist_value + 8\nNDlist_fin:\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,11,6,2,-5,9,10,8,4,7\n#TableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl patienceSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         patience sort                                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains first start index\n/* x2 contains the number of elements  */\npatienceSort:\n    stp x1,lr,[sp,-16]!        // save  registers\n    stp x2,x3,[sp,-16]!        // save  registers\n    stp x4,x5,[sp,-16]!        // save  registers\n    stp x6,x7,[sp,-16]!        // save  registers\n    stp x8,x9,[sp,-16]!        // save  registers\n    lsl x9,x2,1                // compute total size of piles (2 list pointer by pile )\n    lsl x10,x9,3               // 8 bytes by number\n    sub sp,sp,x10              // reserve place to stack\n    mov fp,sp                  // frame pointer = stack\n    mov x3,0                   // index\n    mov x4,0\n1:\n    str x4,[fp,x3,lsl 3]       // init piles area \n    add x3,x3,1                // increment index\n    cmp x3,x9\n    blt 1b\n    mov x3,0                   // index value\n    mov x4,0                   // counter first pile\n    mov x8,x0                  // save table address\n2:\n    ldr x1,[x8,x3,lsl 3]       // load value \n    add x0,fp,x4,lsl 4         // pile address\n    bl isEmpty\n    cmp x0,0                   // pile empty ?\n    bne 3f\n    add x0,fp,x4,lsl 4         // pile address\n    bl insertHead              // insert value x1\n    b 5f\n3:\n    add x0,fp,x4,lsl 4         // pile address\n    ldr x5,[x0,dllist_head]\n    ldr x5,[x5,NDlist_value]   // load first list value\n    cmp x1,x5                  // compare value and last value on the pile\n    blt 4f\n    add x0,fp,x4,lsl 4         // pile address\n    bl insertHead              // insert value x1\n    b 5f\n4:                             // value is smaller créate a new pile\n    add x4,x4,1\n    add x0,fp,x4,lsl 4         // pile address\n    bl insertHead              // insert value x1\n5:  \n    add x3,x3,1                // increment index value\n    cmp x3,x2                  // end \n    blt 2b                     // and loop\n \n    /* step 2 */\n    mov x6,0                   // index value table\n6:\n    mov x3,0                   // index pile\n    mov x5, 1<<62              // min\n7:                             // search minimum\n    add x0,fp,x3,lsl 4\n    bl isEmpty\n    cmp x0,0\n    beq 8f\n    add x0,fp,x3,lsl 4\n    bl searchMinList\n    cmp x0,x5                 // compare min global\n    bge 8f\n    mov x5,x0                 // smaller -> store new min\n    mov x7,x1                 // and pointer to min\n    add x9,fp,x3,lsl 4        // and head list\n8:\n    add x3,x3,1               // next pile\n    cmp x3,x4                 // end ?\n    ble 7b\n    str x5,[x8,x6,lsl 3]      // store min to table value\n    mov x0,x9                 // and suppress the value in the pile\n    mov x1,x7\n    bl suppressNode\n    add x6,x6,1               // increment index value\n    cmp x6,x2                 // end ?\n    blt 6b\n \n    add sp,sp,x10             // stack alignement\n100:\n    ldp x8,x9,[sp],16         // restaur  2 registers\n    ldp x6,x7,[sp],16         // restaur  2 registers\n    ldp x4,x5,[sp],16         // restaur  2 registers\n    ldp x2,x3,[sp],16         // restaur  2 registers\n    ldp x1,lr,[sp],16         // restaur  2 registers\n    ret                       // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at // character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/******************************************************************/\n/*     list is empty ?                         */ \n/******************************************************************/\n/* x0 contains the address of the list structure */\n/* x0 return 0 if empty  else return 1 */\nisEmpty:\n    ldr x0,[x0,#dllist_head]\n    cmp x0,0\n    cset x0,ne\n    ret                                // return\n/******************************************************************/\n/*     insert value at list head                        */ \n/******************************************************************/\n/* x0 contains the address of the list structure */\n/* x1 contains value */\ninsertHead:\n    stp x1,lr,[sp,-16]!                  // save  registers\n    stp x2,x3,[sp,-16]!                  // save  registers\n    stp x4,x5,[sp,-16]!                  // save  registers\n    mov x4,x0                            // save address\n    mov x0,x1                            // value\n    bl createNode\n    cmp x0,#-1                           // allocation error ?\n    beq 100f\n    ldr x2,[x4,#dllist_head]             // load address first node\n    str x2,[x0,#NDlist_next]             // store in next pointer on new node\n    mov x1,#0\n    str x1,[x0,#NDlist_prev]             // store zero in previous pointer on new node\n    str x0,[x4,#dllist_head]             // store address new node in address head list \n    cmp x2,#0                            // address first node is null ?\n    beq 1f\n    str x0,[x2,#NDlist_prev]             // no store adresse new node in previous pointer\n    b 100f\n1:\n    str x0,[x4,#dllist_tail]             // else store new node in tail address\n100:\n    ldp x4,x5,[sp],16                    // restaur  2 registers\n    ldp x2,x3,[sp],16                    // restaur  2 registers\n    ldp x1,lr,[sp],16                    // restaur  2 registers\n    ret                                  // return to address lr x30\n \n/******************************************************************/\n/*     search value minimum                                               */ \n/******************************************************************/\n/* x0 contains the address of the list structure */\n/* x0 return min   */\n/* x1 return address of node */\nsearchMinList:\n    stp x2,lr,[sp,-16]!                  // save  registers\n    stp x3,x4,[sp,-16]!                  // save  registers\n    ldr x0,[x0,#dllist_head]             // load first node\n    mov x3,1<<62\n    mov x1,0\n1:\n    cmp x0,0                             // null -> end \n    beq 99f\n    ldr x2,[x0,#NDlist_value]            // load node value\n    cmp x2,x3                            // min ?\n    bge 2f\n    mov x3,x2                            // value -> min\n    mov x1,x0                            // store pointer \n2:\n    ldr x0,[x0,#NDlist_next]             // load addresse next node \n    b 1b                                 // and loop\n99:\n    mov x0,x3                            // return minimum\n100:\n    ldp x3,x4,[sp],16                    // restaur  2 registers\n    ldp x2,lr,[sp],16                    // restaur  2 registers\n    ret                                  // return to address lr x30\n/******************************************************************/\n/*     suppress node                                               */ \n/******************************************************************/\n/* x0 contains the address of the list structure */\n/* x1 contains the address to node to suppress  */\nsuppressNode:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    ldr x2,[x1,#NDlist_next]         // load addresse next node \n    ldr x3,[x1,#NDlist_prev]         // load addresse prev node \n    cmp x3,#0\n    beq 1f\n    str x2,[x3,#NDlist_next] \n    b 2f\n1:\n    str x3,[x0,#NDlist_next] \n2:\n    cmp x2,#0\n    beq 3f\n    str x3,[x2,#NDlist_prev]\n    b 100f\n3:\n    str x2,[x0,#NDlist_prev]\n100:\n \n    ldp x3,x4,[sp],16               // restaur  2 registers\n    ldp x2,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/******************************************************************/\n/*     Create new node                                            */ \n/******************************************************************/\n/* x0 contains the value */\n/* x0 return node address or -1 if allocation error*/\ncreateNode:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    stp x4,x8,[sp,-16]!              // save  registers\n    mov x4,x0                        // save value\n                                     // allocation place on the heap\n    mov x0,0                         // allocation place heap\n    mov x8,BRK                       // call system 'brk'\n    svc 0\n    mov x3,x0                        // save address heap for output string\n    add x0,x0,NDlist_fin                // reservation place one element\n    mov x8,BRK                       // call system 'brk'\n    svc #0\n    cmp x0,-1                        // allocation error\n    beq 100f\n    mov x0,x3\n    str x4,[x0,#NDlist_value]        // store value\n    mov x2,0\n    str x2,[x0,#NDlist_next]         // store zero to pointer next\n    str x2,[x0,#NDlist_prev]         // store zero to pointer previous\n100:\n    ldp x4,x8,[sp],16                // restaur  2 registers\n    ldp x2,x3,[sp],16                // restaur  2 registers\n    ldp x1,lr,[sp],16                // restaur  2 registers\n    ret                              // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/permutation_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Permutation_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program permutation_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*******************************************/\n/* Structures                               */\n/********************************************/\n/* structure permutations  */\n    .struct  0\nperm_adrtable:                    // table value address\n    .struct  perm_adrtable + 8\nperm_size:                        // elements number\n    .struct  perm_size + 8\nperm_adrheap:                     // Init to zéro at the first call\n    .struct  perm_adrheap + 8\nperm_end:\n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessCounter:       .asciz \"sorted in  @ permutations \\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\n \nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7,11\nTableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\nstPermutation:   .skip perm_end\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrstPermutation                       // address structure permutation\n    ldr x1,qAdrTableNumber                         // address number table\n    str x1,[x0,perm_adrtable]\n    mov x1,NBELEMENTS                              // elements number\n    str x1,[x0,perm_size]\n    mov x1,0                                       // first call\n    str x1,[x0,perm_adrheap]\n    mov x20,0                                      // counter\n1:\n    ldr x0,qAdrstPermutation                       // address structure permutation\n    bl newPermutation                              // call for each permutation\n    cmp x0,0                                       // end ?\n    blt 99f                                        // yes -> error\n    //bl displayTable                              // for display after each permutation\n    add x20,x20,1                                  // increment counter\n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    bne 1b                                         // no -> loop\n \n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n    ldr x0,qAdrszMessSortOk                        // address OK message\n    bl affichageMess\n    mov x0,x20                                     // display counter\n    ldr x1,qAdrsZoneConv \n    bl conversion10S                               // décimal conversion \n    ldr x0,qAdrsMessCounter\n    ldr x1,qAdrsZoneConv                           // insert conversion\n    bl strInsertAtCharInc\n    bl affichageMess                               // display message\n    b 100f\n99:\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n    ldr x0,qAdrszMessSortNok                       // address not OK message\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrstPermutation:        .quad stPermutation\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\nqAdrsMessCounter:         .quad sMessCounter\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/***************************************************/\n/*   return permutation one by one                 */\n/* sur une idée de vincent Moresmau                */\n/* use algorytm heap iteratif see wikipedia        */\n/***************************************************/\n/* x0 contains the address of structure permutations */\n/* x0 return address  of value table or zéro if end */\nnewPermutation:\n    stp x1,lr,[sp,-16]!             // save  registers\n    stp x2,x3,[sp,-16]!             // save  registers\n    stp x4,x5,[sp,-16]!             // save  registers\n    stp x6,x7,[sp,-16]!             // save  registers\n    ldr x2,[x0,perm_adrheap]\n    cmp x2,0\n    bne 2f\n                                    // first call -> init area on heap\n    mov x7,x0\n    ldr x1,[x7,perm_size]\n    lsl x3,x1,3                     // 8 bytes by count table\n    add x3,x3,8                     // 8 bytes for current index \n    mov x0,0                        // allocation place heap\n    mov x8,BRK                      // call system 'brk'\n    svc 0\n    mov x2,x0                       // save address heap\n    add x0,x0,x3                    // reservation place\n    mov x8,BRK                      // call system 'brk'\n    svc #0\n    cmp x0,-1                       // allocation error\n    beq 100f\n    add x8,x2,8                     // address begin area counters\n    mov x3,0\n1:                                  // loop init\n    str xzr,[x8,x3,lsl 3]           // init to zéro area heap\n    add x3,x3,1\n    cmp x3,x1\n    blt 1b\n    str xzr,[x2]                    // store zero to index \n    str x2,[x7,perm_adrheap]        // store heap address on structure permutation\n    ldr x0,[x7,perm_adrtable]       // return first permutation\n    b 100f\n \n2:                                  // other calls x2 contains heap address\n    mov x7,x0                       // structure address \n    ldr x1,[x7,perm_size]           // elements number\n    ldr x0,[x7,perm_adrtable]  \n    add x8,x2,8                     // begin address area count\n    ldr x3,[x2]                     // load current index\n3:\n    ldr x4,[x8,x3,lsl 3]            // load count [i]\n    cmp x4,x3                       // compare with i\n    bge 6f\n    tst x3,#1                       // even ?\n    bne 4f\n    ldr x5,[x0]                     // yes load value A[0]\n    ldr x6,[x0,x3,lsl 3]            // and swap with value A[i]\n    str x6,[x0]\n    str x5,[x0,x3,lsl 3]\n    b 5f\n4:\n    ldr x5,[x0,x4,lsl 3]            // no load value A[count[i]]\n    ldr x6,[x0,x3,lsl 3]            // and swap with value A[i]\n    str x6,[x0,x4,lsl 3]\n    str x5,[x0,x3,lsl 3]\n5:\n    add x4,x4,1\n    str x4,[x8,x3,lsl 3]            // store new count [i]\n    str xzr,[x2]                    // store new index\n    b 100f                          // and return new permutation in x0\n6:\n    str xzr,[x8,x3,lsl 3]           // store zero in count [i]\n    add x3,x3,1                     // increment index\n    cmp x3,x1                       // end \n    blt 3b                          // loop \n    mov x0,0                        // if end -> return zero\n \n 100:                               // end function\n    ldp x6,x7,[sp],16               // restaur  1 register\n    ldp x4,x5,[sp],16               // restaur  1 register\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at // character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/quick_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Quicksort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program quick_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,6,2,5,9,10,8,4,7,11\n#TableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl quickSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/***************************************************/\n/*   Appel récursif Tri Rapide quicksort           */\n/***************************************************/\n/* x0 contains the address of table */\n/* x1 contains index of first item  */\n/* x2 contains the number of elements  > 0  */\nquickSort:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    str x5,   [sp,-16]!             // save  registers\n    sub x2,x2,1                     // last item index\n    cmp x1,x2                       // first > last ? \n    bge 100f                        // yes -> end\n    mov x4,x0                       // save x0\n    mov x5,x2                       // save x2\n    bl partition1                   // cutting into 2 parts\n    mov x2,x0                       // index partition\n    mov x0,x4                       // table address\n    bl quickSort                    // sort lower part\n    add x1,x2,1                     // index begin = index partition + 1\n    add x2,x5,1                     // number of elements\n    bl quickSort                    // sort higter part\n \n 100:                               // end function\n    ldr x5,   [sp],16               // restaur  1 register\n    ldp x3,x4,[sp],16               // restaur  2 registers\n    ldp x2,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n \n/******************************************************************/\n/*      Partition table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains index of first item  */\n/* x2 contains index of last item   */\npartition1:\n    stp x1,lr,[sp,-16]!             // save  registers\n    stp x2,x3,[sp,-16]!             // save  registers\n    stp x4,x5,[sp,-16]!             // save  registers\n    stp x6,x7,[sp,-16]!             // save  registers\n    ldr x3,[x0,x2,lsl 3]            // load value last index\n    mov x4,x1                       // init with first index\n    mov x5,x1                       // init with first index\n1:                                  // begin loop\n    ldr x6,[x0,x5,lsl 3]            // load value\n    cmp x6,x3                       // compare value\n    bge 2f\n    ldr x7,[x0,x4,lsl 3]            // if < swap value table\n    str x6,[x0,x4,lsl 3]\n    str x7,[x0,x5,lsl 3]\n    add x4,x4,1                     // and increment index 1\n2:\n    add x5,x5,1                     // increment index 2\n    cmp x5,x2                       // end ?\n    blt 1b                          // no loop\n    ldr x7,[x0,x4,lsl 3]            // swap value\n    str x3,[x0,x4,lsl 3]\n    str x7,[x0,x2,lsl 3]\n    mov x0,x4                       // return index partition\n100:\n    ldp x6,x7,[sp],16               // restaur  2 registers\n    ldp x4,x5,[sp],16               // restaur  2 registers\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at // character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/radix_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Radix_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program radix_sort.s  */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   12485,301,16,25,5006,9,-154389710,26,4400,71,115\n#TableNumber:     .quad   10,9,8,7,6,-5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0                                       // first element\n    mov x2,NBELEMENTS                              // number of élements \n    bl radixSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!             // save  registers\n    stp x3,x4,[sp,-16]!             // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/******************************************************************/\n/*         radix sort                                             */ \n/******************************************************************/\n/* r0 contains the address of table */\n/* r1 contains the first element    */\n/* r2 contains the number of element */\n/* no registers save                 */\nradixSort:\n    str lr,[sp,-16]!                      // save  1 register\n    mov x7,0b1111                         // mask one digit hexa\n    mov x10,0                             // digit counter\n1:\n    add x3,x1,1                           // start index i\n2:                                        // start loop\n    ldr x4,[x0,x3,lsl 3]                  // load value A[i]\n    and x8,x4,x7                          // and mask\n    sub x5,x3,1                           // index j\n3:\n    ldr x6,[x0,x5,lsl 3]                  // load value A[j]\n    and x9,x6,x7                          // and mask\n    cmp x9,x8                             // compare one digit hexa\n    ble 4f\n    add x5,x5,1                           // increment index j\n    str x6,[x0,x5,lsl 3]                  // store value A[j+1]\n    sub x5,x5,2                           // j = j - 1\n    cmp x5,x1\n    bge 3b                                // loop if j >= first item\n4:\n    add x5,x5,1                           // increment index j\n    str x4,[x0,x5,lsl 3]                  // store value A[i] in A[j+1]\n    add x3,x3,1                           // increment index i\n    cmp x3,x2                             // end ?\n    blt 2b                                // no -> loop\n \n    //bl displayTable\n    lsl x7,x7,4                           // shift mask 4 bits left\n    add x10,x10,1                         // increment counter\n    cmp x10,16                            // 16 digits ?\n    blt 1b                                // no loop \n100:\n \n    ldr lr,[sp],16                        // restaur  1 registers\n    ret                                   // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10S                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at // character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n    mov x0,x2\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/selection_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Selection_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program selection_sort.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  : @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\n#TableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\nTableNumber:     .quad   10,9,8,7,6,5,4,3,2,1\n                 .equ NBELEMENTS, (. - TableNumber) / 8 \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:       .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                              // entry of program \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,0\n    mov x2,NBELEMENTS                              // number of élements \n    bl selectionSort\n    ldr x0,qAdrTableNumber                         // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                         // address number table\n    mov x1,NBELEMENTS                              // number of élements \n    bl isSorted                                    // control sort\n    cmp x0,1                                       // sorted ?\n    beq 1f                                    \n    ldr x0,qAdrszMessSortNok                       // no !! error sort\n    bl affichageMess\n    b 100f\n1:                                                 // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                               // standard end of the program \n    mov x0,0                                       // return code\n    mov x8,EXIT                                    // request to exit program\n    svc 0                                          // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x2,lr,[sp,-16]!              // save  registers\n    stp x3,x4,[sp,-16]!              // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n    mov x0,0                       // not sorted\n    b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x3,x4,[sp],16              // restaur  2 registers\n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*         selection sort                                              */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the first element    */\n/* x2 contains the number of element */\nselectionSort:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    stp x4,x5,[sp,-16]!              // save  registers\n    stp x6,x7,[sp,-16]!              // save  registers\n    mov x3,x1                        // start index i\n    sub x7,x2,1                      // compute n - 1\n1:                                   // start loop\n    mov x4,x3\n    add x5,x3,1                      // init index 2\n2: \n    ldr x1,[x0,x4,lsl 3]             // load value A[mini]\n    ldr x6,[x0,x5,lsl 3]             // load value A[j]\n    cmp x6,x1                        // compare value\n    csel x4,x5,x4,lt                 // j -> mini\n    add x5,x5,1                      // increment index j\n    cmp x5,x2                        // end ?\n    blt 2b                           // no -> loop\n    cmp x4,x3                        // mini <> j ?\n    beq 3f                           // no\n    ldr x1,[x0,x4,lsl 3]             // yes swap A[i] A[mini]\n    ldr x6,[x0,x3,lsl 3]\n    str x1,[x0,x3,lsl 3]\n    str x6,[x0,x4,lsl 3]\n3:\n    add x3,x3,1                      // increment i\n    cmp x3,x7                        // end ?\n    blt 1b                           // no -> loop \n \n100:\n    ldp x6,x7,[sp],16                // restaur  2 registers\n    ldp x4,x5,[sp],16                // restaur  2 registers\n    ldp x2,x3,[sp],16                // restaur  2 registers\n    ldp x1,lr,[sp],16                // restaur  2 registers\n    ret                              // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!              // save  registers\n    stp x2,x3,[sp,-16]!              // save  registers\n    mov x2,x0                        // table address\n    mov x3,0\n1:                                   // loop display table\n    ldr x0,[x2,x3,lsl 3]\n    ldr x1,qAdrsZoneConv\n    bl conversion10                  // décimal conversion\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc            // insert result at @ character\n    bl affichageMess                 // display message\n    add x3,x3,1\n    cmp x3,NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16               // restaur  2 registers\n    ldp x1,lr,[sp],16               // restaur  2 registers\n    ret                             // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "sorters/shell_sort.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Sorting_algorithms/Shell_sort\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program shell_sort.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nszMessSortOk:       .asciz \"Table sorted.\\n\"\nszMessSortNok:      .asciz \"Table not sorted !!!!!.\\n\"\nsMessResult:        .asciz \"Value  :  @ \\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \n.align 4\nTableNumber:      .quad   1,3,6,2,5,9,10,8,4,7\n//TableNumber:     .quad   10,9,8,7,6,5,4,3,2,1\n                   .equ NBELEMENTS, (. - TableNumber) / 8\n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:              .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                             // entry of program \n \n1:\n    ldr x0,qAdrTableNumber                        // address number table\n    mov x1,0                                      // not use in routine\n    mov x2,NBELEMENTS                             // number of élements \n    bl shellSort\n    ldr x0,qAdrTableNumber                        // address number table\n    bl displayTable\n \n    ldr x0,qAdrTableNumber                        // address number table\n    mov x1,#NBELEMENTS                            // number of élements \n    bl isSorted                                   // control sort\n    cmp x0,#1                                     // sorted ?\n    beq 2f\n    ldr x0,qAdrszMessSortNok                      // no !! error sort\n    bl affichageMess\n    b 100f\n2:                                                // yes\n    ldr x0,qAdrszMessSortOk\n    bl affichageMess\n100:                                              // standard end of the program \n    mov x0,0                                      // return code\n    mov x8,EXIT                                   // request to exit program\n    svc 0                                         // perform the system call\n \nqAdrsZoneConv:            .quad sZoneConv\nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResult:          .quad sMessResult\nqAdrTableNumber:          .quad TableNumber\nqAdrszMessSortOk:         .quad szMessSortOk\nqAdrszMessSortNok:        .quad szMessSortNok\n/******************************************************************/\n/*     control sorted table                                   */ \n/******************************************************************/\n/* x0 contains the address of table */\n/* x1 contains the number of elements  > 0  */\n/* x0 return 0  if not sorted   1  if sorted */\nisSorted:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    stp x4,x5,[sp,-16]!            // save  registers\n    mov x2,0\n    ldr x4,[x0,x2,lsl 3]\n1:\n    add x2,x2,1\n    cmp x2,x1\n    bge 99f\n    ldr x3,[x0,x2, lsl 3]\n    cmp x3,x4\n    blt 98f\n    mov x4,x3\n    b 1b\n98:\n   mov x0,0                        // error not sorted\n   b 100f\n99:\n    mov x0,1                       // sorted\n100:\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/***************************************************/\n/*   shell Sort                                    */\n/***************************************************/\n \n/* x0 contains the address of table */\n/* x1 contains the first element but not use !!   */\n/*   this routine use first element at index zero !!!  */\n/* x2 contains the number of element */\nshellSort:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    stp x4,x5,[sp,-16]!          // save  registers\n    stp x6,x7,[sp,-16]!          // save  registers\n    sub x2,x2,1                  // index last item\n    mov x1,x2                    // init gap = last item\n1:                               // start loop 1\n    lsr x1,x1,1                     // gap = gap / 2\n    cbz x1,100f                  // if gap = 0 -> end\n    mov x3,x1                    // init loop indice 1 \n2:                               // start loop 2\n    ldr x4,[x0,x3,lsl 3]        // load first value\n    mov x5,x3                    // init loop indice 2\n3:                               // start loop 3\n    cmp x5,x1                    // indice < gap\n    blt 4f                       // yes -> end loop 2\n    sub x6,x5,x1                 // index = indice - gap\n    ldr x7,[x0,x6,lsl 3]         // load second value\n    cmp x4,x7                    // compare values\n    bge 4f\n    str x7,[x0,x5,lsl 3]         // store if <\n    sub x5,x5,x1                    // indice = indice - gap\n    b 3b                         // and loop\n4:                               // end loop 3\n    str x4,[x0,x5,lsl 3]         // store value 1 at indice 2\n    add x3,x3,1                  // increment indice 1\n    cmp x3,x2                    // end ?\n    ble 2b                       // no -> loop 2\n    b 1b                         // yes loop for new gap\n \n100:                             // end function\n    ldp x6,x7,[sp],16            // restaur  2 registers\n    ldp x4,x5,[sp],16            // restaur  2 registers\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n \n/******************************************************************/\n/*      Display table elements                                */ \n/******************************************************************/\n/* x0 contains the address of table */\ndisplayTable:\n    stp x1,lr,[sp,-16]!          // save  registers\n    stp x2,x3,[sp,-16]!          // save  registers\n    mov x2,x0                    // table address\n    mov x3,0\n1:                               // loop display table\n    ldr x0,[x2,x3,lsl #3]\n    ldr x1,qAdrsZoneConv         // display value\n    bl conversion10              // call function\n    ldr x0,qAdrsMessResult\n    ldr x1,qAdrsZoneConv\n    bl strInsertAtCharInc        // insert result at @ character\n    bl affichageMess             // display message\n    add x3,x3,1\n    cmp x3,#NBELEMENTS - 1\n    ble 1b\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:\n    ldp x2,x3,[sp],16            // restaur  2 registers\n    ldp x1,lr,[sp],16            // restaur  2 registers\n    ret                          // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/append.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_append\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program append.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n.equ BUFFERSIZE,          100\n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessString:            .asciz \"String :\\n\"\nszString1:              .asciz \"Alphabet : \"\nsComplement:            .fill BUFFERSIZE,1,0\nszString2:              .asciz \"abcdefghijklmnopqrstuvwxyz\"\n \nszCarriageReturn:       .asciz \"\\n\"\n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain: \n \n    ldr x0,qAdrszMessString               // display message\n    bl affichageMess\n    ldr x0,qAdrszString1                  // display begin string\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn           // display return line\n    bl affichageMess\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszString2\n    bl append                             // append sting2 to string1\n    ldr x0,qAdrszMessString\n    bl affichageMess\n    ldr x0,qAdrszString1                  // display string\n    bl affichageMess \n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n100:                                      // standard end of the program\n    mov x0,0                              // return code\n    mov x8,EXIT                           // request to exit program\n    svc 0                                 // perform system call\nqAdrszMessString:         .quad szMessString\nqAdrszString1:            .quad szString1\nqAdrszString2:            .quad szString2\nqAdrszCarriageReturn:     .quad szCarriageReturn\n/**************************************************/\n/*     append two strings                         */ \n/**************************************************/\n/* x0 contains the address of the string1 */\n/* x1 contains the address of the string2 */\nappend:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x2,#0                      // counter byte string 1\n1:\n    ldrb w3,[x0,x2]                // load byte string 1\n    cmp x3,#0                      // zero final ?\n    add x4,x2,1\n    csel x2,x4,x2,ne               // if x3 not equal 0, x2 = X2 +1 else x2\n    bne 1b                         // no -> loop\n    mov x4,#0                      // counter byte string 2\n2:\n    ldrb w3,[x1,x4]                // load byte string 2\n    strb w3,[x0,x2]                // store byte string 1\n    cbz x3,100f                    // zero final ?\n    add x2,x2,1                    // no -> increment counter 1\n    add x4,x4,1                    // no -> increment counter 2\n    b 2b                           // no -> loop\n100:\n \n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/comparison.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_comparison\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program comparison.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessStringEqu:    .asciz \"The strings are equals.\\n\"\nszMessStringNotEqu: .asciz \"The strings are not equals.\\n\"\nszCarriageReturn:   .asciz \"\\n\"\n \nszString1:          .asciz \"ABCDE\"\nszString2:          .asciz \"ABCDE\"\nszString3:          .asciz \"ABCFG\"\nszString4:          .asciz \"ABC\"\nszString5:          .asciz \"abcde\"\n/*******************************************/\n/* UnInitialized data                       /\n/*******************************************/\n.bss \n/*******************************************/\n/*  code section */\n/*******************************************/\n.text\n.global main \nmain:                         // entry of program\n \n    ldr x0,qAdrszString1\n    ldr x1,qAdrszString2\n    bl Comparaison\n \n    ldr x0,qAdrszString1\n    ldr x1,qAdrszString3\n    bl Comparaison\n \n    ldr x0,qAdrszString1\n    ldr x1,qAdrszString4\n    bl Comparaison\n                             // case sensitive comparisons ABCDE et abcde\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszString5\n    bl Comparaison\n                             // case insensitive comparisons  ABCDE et abcde\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszString5\n    bl comparStringsInsensitive\n    cbnz x0,1f\n    ldr x0,qAdrszMessStringEqu\n    bl affichageMess\n    b 2f\n1:\n    ldr x0,qAdrszMessStringNotEqu\n    bl affichageMess\n \n2:\n \n100:                             // standard end of the program\n    mov x0,0                     // return code\n    mov x8,EXIT                  // request to exit program\n    svc 0                        // perform the system call\nqAdrszString1:           .quad szString1\nqAdrszString2:           .quad szString2\nqAdrszString3:           .quad szString3\nqAdrszString4:           .quad szString4\nqAdrszString5:           .quad szString5\nqAdrszMessStringEqu:     .quad szMessStringEqu\nqAdrszMessStringNotEqu:  .quad szMessStringNotEqu\nqAdrszCarriageReturn:    .quad  szCarriageReturn\n/*********************************************/\n/* comparaison                               */\n/*********************************************/\n/* x0 contains address String 1           */\n/* x1 contains address String 2         */\nComparaison: \n    stp x1,lr,[sp,-16]!            // save  registers\n    bl comparStrings\n    cbnz x0,1f\n    ldr x0,qAdrszMessStringEqu\n    bl affichageMess\n    b 2f\n1:\n    ldr x0,qAdrszMessStringNotEqu\n    bl affichageMess\n \n2:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/************************************/       \n/* Strings case sensitive comparisons  */\n/************************************/      \n/* x0 et x1 contains the address of strings */\n/* return 0 in x0 if equals */\n/* return -1 if string x0 < string x1 */\n/* return 1  if string x0 > string x1 */\ncomparStrings:\n    stp x1,lr,[sp,-16]!    // save  registers\n    stp x2,x3,[sp,-16]!    // save  registers\n    stp x4,x5,[sp,-16]!    // save  registers\n    mov x2,#0              // counter\n1:    \n    ldrb w3,[x0,x2]        // byte string 1\n    ldrb w4,[x1,x2]        // byte string 2\n    cmp x3,x4\n    blt 2f\n    bgt 3f\n    cbz x3,4f              // 0 end string\n    add x2,x2,1            // else add 1 in counter\n    b 1b                   // and loop */\n2:\n    mov x0,-1              // lower\n    b 100f\n3:\n    mov x0,1               // higher \n    b 100f\n4:\n    mov x0,0               // equal\n100:\n    ldp x4,x5,[sp],16      // restaur  2 registers\n    ldp x2,x3,[sp],16      // restaur  2 registers\n    ldp x1,lr,[sp],16      // restaur  2 registers\n    ret                    // return to address lr x30\n/************************************/       \n/* Strings case insensitive comparisons    */\n/************************************/      \n/* x0 et x1 contains the address of strings */\n/* return 0 in x0 if equals */\n/* return -1 if string x0 < string x1 */\n/* return 1  if string x0 > string x1 */\ncomparStringsInsensitive:\n    stp x1,lr,[sp,-16]!    // save  registers\n    stp x2,x3,[sp,-16]!    // save  registers\n    stp x4,x5,[sp,-16]!    // save  registers\n    mov x2,#0              // counter\n \n1:    \n    ldrb w3,[x0,x2]        // byte string 1\n    ldrb w4,[x1,x2]        // byte string 2\n                           // majuscules --> minuscules  byte 1\n    cmp x3,65\n    blt 2f\n    cmp x3,90\n    bgt 2f\n    add x3,x3,32\n2:                         // majuscules --> minuscules  byte 2\n    cmp x4,65\n    blt 3f\n    cmp x4,90\n    bgt 3f\n    add x4,x4,32\n3:    \n    cmp x3,x4\n    blt 4f\n    bgt 5f\n    cbz x3,6f              // 0 end string\n    add x2,x2,1            // else add 1 in counter\n    b 1b                   // and loop\n4:\n    mov x0,-1              // lower\n    b 100f\n5:\n    mov x0,1               // higher \n    b 100f\n6:\n    mov x0,0               // equal\n100:\n    ldp x4,x5,[sp],16      // restaur  2 registers\n    ldp x2,x3,[sp],16      // restaur  2 registers\n    ldp x1,lr,[sp],16      // restaur  2 registers\n    ret                    // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/concatenation.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_concatenation\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program concatenation.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessFinal:   .asciz \"The final string is \\n\"\n \nszString:            .asciz \"Hello \"\nszString1:           .asciz \" the world. \\n\"\n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \nszFinalString:   .skip 255\n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain:\n                                   // load string \n    ldr x1,qAdrszString\n    ldr x2,qAdrszFinalString\n    mov x4,0\n1:\n    ldrb w0,[x1,x4]                // load byte of string\n    strb w0,[x2,x4]\n    cmp x0,0                       // compar with zero ?\n    add x3,x4,1\n    csel x4,x3,x4,ne               // if x0 <> 0 x4 = x4 +1 sinon x4\n    bne 1b\n    ldr x1,qAdrszString1\n    mov x3,0\n2:\n    ldrb w0,[x1,x3]                // load byte of string 1\n    strb w0,[x2,x4]\n    cmp x0,0                       // compar with zero ?\n    add x5,x4,1\n    csel x4,x5,x4,ne\n    add x5,x3,1\n    csel x3,x5,x3,ne\n    bne 2b\n    mov x0,x2                      // display final string\n    bl affichageMess\n100:                               // standard end of the program */\n    mov x0,0                       // return code\n    mov x8,EXIT                    // request to exit program\n    svc 0                          // perform the system call\nqAdrszString:             .quad szString\nqAdrszString1:            .quad szString1\nqAdrszFinalString:        .quad szFinalString\nqAdrszMessFinal:          .quad szMessFinal\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/interpolation.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_interpolation_(included)\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program interpolation.s   */\n/* In assembler, there is no function to insert a chain */\n/* so this program offers two functions to insert    */\n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n.equ CHARPOS,       '@'\n \n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszString:           .asciz \" string \"\nszString1:          .asciz \"insert\"\nszString2:          .asciz \"abcd@efg\"\nszString3:          .asciz \"abcdef @\"\nszString4:          .asciz \"@ abcdef\"\nszCarriageReturn:   .asciz \"\\n\"\n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain:                            // entry of program\n \n    ldr x0,qAdrszString          // string address\n    ldr x1,qAdrszString1         // string address\n    mov x2,#0\n    bl strInsert                 // \n                                 // return new pointer\n    bl affichageMess             // display result string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n    ldr x0,qAdrszString          // string address\n    ldr x1,qAdrszString1         // string address\n    mov x2,#3\n    bl strInsert                 // \n                                 // return new pointer\n    bl affichageMess             // display result string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n    ldr x0,qAdrszString          // string address\n    ldr x1,qAdrszString1         // string address\n    mov x2,#40\n    bl strInsert                 // \n                                 // return new pointer\n    bl affichageMess             // display result string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n    ldr x0,qAdrszString2         // string address\n    ldr x1,qAdrszString1         // string address\n    bl strInsertAtChar           // \n                                 // return new pointer\n    bl affichageMess             // display result string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n    ldr x0,qAdrszString3         // string address\n    ldr x1,qAdrszString1         // string address\n    bl strInsertAtChar           // \n                                 // return new pointer\n    bl affichageMess             // display result string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n    ldr x0,qAdrszString4         // string address\n    ldr x1,qAdrszString1         // string address\n    bl strInsertAtChar           // \n                                 // return new pointer\n    bl affichageMess             // display result string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n100:                             // standard end of the program\n    mov x0, #0                   // return code\n    mov x8, #EXIT                // request to exit program\n    svc 0                        // perform the system call\nqAdrszString:          .quad szString\nqAdrszString1:         .quad szString1\nqAdrszString2:         .quad szString2\nqAdrszString3:         .quad szString3\nqAdrszString4:         .quad szString4\nqAdrszCarriageReturn:  .quad szCarriageReturn\n/******************************************************************/\n/*   insertion of a sub-chain in a chain in the desired position  */ \n/******************************************************************/\n/* x0 contains the address of string 1 */\n/* x1 contains the address of string to insert */\n/* x2 contains the position of insertion : \n      0 start string \n      if x2 > lenght string 1 insert at end of string*/\n/* x0 return the address of new string  on the heap */\nstrInsert:\n    stp x1,lr,[sp,-16]!                      // save  registers\n    stp x2,x3,[sp,-16]!                      // save  registers\n    mov x3,#0                                // length counter \n1:                                           // compute length of string 1\n    ldrb w4,[x0,x3]\n    cmp w4,#0\n    cinc  x3,x3,ne                           // increment to one if not equal\n    bne 1b                                   // loop if not equal\n    mov x5,#0                                // length counter insertion string\n2:                                           // compute length of insertion string\n    ldrb w4,[x1,x5]\n    cmp x4,#0\n    cinc  x5,x5,ne                           // increment to one if not equal\n    bne 2b\n    cmp x5,#0\n    beq 99f                                  // string empty -> error\n    add x3,x3,x5                             // add 2 length\n    add x3,x3,#1                             // +1 for final zero\n    mov x6,x0                                // save address string 1\n    mov x0,#0                                // allocation place heap\n    mov x8,BRK                               // call system 'brk'\n    svc #0\n    mov x5,x0                                // save address heap for output string\n    add x0,x0,x3                             // reservation place x3 length\n    mov x8,BRK                               // call system 'brk'\n    svc #0\n    cmp x0,#-1                               // allocation error\n    beq 99f\n    //\n    mov x8,#0                                // index load characters string 1\n    cmp x2,#0                                // index insertion = 0\n    beq 5f                                   // insertion at string 1 begin\n3:                                           // loop copy characters string 1\n    ldrb w0,[x6,x8]                          // load character\n    cmp w0,#0                                // end string ?\n    beq 5f                                   // insertion at end\n    strb w0,[x5,x8]                          // store character in output string\n    add x8,x8,#1                             // increment index\n    cmp x8,x2                                // < insertion index ?\n    blt 3b                                   // yes -> loop\n5:\n    mov x4,x8                                // init index character output string\n    mov x3,#0                                // index load characters insertion string\n6:\n    ldrb w0,[x1,x3]                          // load characters insertion string\n    cmp w0,#0                                // end string ?\n    beq 7f\n    strb w0,[x5,x4]                          // store in output string\n    add x3,x3,#1                             // increment index\n    add x4,x4,#1                             // increment output index\n    b 6b                                     // and loop\n7:\n    ldrb w0,[x6,x8]                          // load other character string 1\n    strb w0,[x5,x4]                          // store in output string\n    cmp x0,#0                                // end string 1 ?\n    beq 8f                                   // yes -> end\n    add x4,x4,#1                             // increment output index\n    add x8,x8,#1                             // increment index\n    b 7b                                     // and loop\n8:\n    mov x0,x5                                // return output string address \n    b 100f\n99:                                          // error\n    mov x0,#-1\n100:\n    ldp x2,x3,[sp],16                        // restaur  2 registers\n    ldp x1,lr,[sp],16                        // restaur  2 registers\n    ret\n/******************************************************************/\n/*   insert string at character insertion                         */ \n/******************************************************************/\n/* x0 contains the address of string 1 */\n/* x1 contains the address of insertion string   */\n/* x0 return the address of new string  on the heap */\n/* or -1 if error   */\nstrInsertAtChar:\n    stp x1,lr,[sp,-16]!                      // save  registers\n    stp x2,x3,[sp,-16]!                      // save  registers\n    mov x3,#0                                // length counter \n1:                                           // compute length of string 1\n    ldrb w4,[x0,x3]\n    cmp w4,#0\n    cinc  x3,x3,ne                           // increment to one if not equal\n    bne 1b                                   // loop if not equal\n    mov x5,#0                                // length counter insertion string\n2:                                           // compute length to insertion string\n    ldrb w4,[x1,x5]\n    cmp x4,#0\n    cinc  x5,x5,ne                           // increment to one if not equal\n    bne 2b                                   // and loop\n    cmp x5,#0\n    beq 99f                                  // string empty -> error\n    add x3,x3,x5                             // add 2 length\n    add x3,x3,#1                             // +1 for final zero\n    mov x6,x0                                // save address string 1\n    mov x0,#0                                // allocation place heap\n    mov x8,BRK                               // call system 'brk' \n    svc #0\n    mov x5,x0                                // save address heap for output string\n    add x0,x0,x3                             // reservation place x3 length\n    mov x8,BRK                               // call system 'brk'\n    svc #0\n    cmp x0,#-1                               // allocation error\n    beq 99f\n \n    mov x2,0\n    mov x4,0               \n3:                                           // loop copy string begin \n    ldrb w3,[x6,x2]\n    cmp w3,0\n    beq 99f\n    cmp w3,CHARPOS                           // insertion character ?\n    beq 5f                                   // yes\n    strb w3,[x5,x4]                          // no store character in output string\n    add x2,x2,1\n    add x4,x4,1\n    b 3b                                     // and loop\n5:                                           // x4 contains position insertion\n    add x8,x4,1                              // init index character output string\n                                             // at position insertion + one\n    mov x3,#0                                // index load characters insertion string\n6:\n    ldrb w0,[x1,x3]                          // load characters insertion string\n    cmp w0,#0                                // end string ?\n    beq 7f                                   // yes \n    strb w0,[x5,x4]                          // store in output string\n    add x3,x3,#1                             // increment index\n    add x4,x4,#1                             // increment output index\n    b 6b                                     // and loop\n7:                                           // loop copy end string \n    ldrb w0,[x6,x8]                          // load other character string 1\n    strb w0,[x5,x4]                          // store in output string\n    cmp x0,#0                                // end string 1 ?\n    beq 8f                                   // yes -> end\n    add x4,x4,#1                             // increment output index\n    add x8,x8,#1                             // increment index\n    b 7b                                     // and loop\n8:\n    mov x0,x5                                // return output string address \n    b 100f\n99:                                          // error\n    mov x0,#-1\n100:\n    ldp x2,x3,[sp],16                        // restaur  2 registers\n    ldp x1,lr,[sp],16                        // restaur  2 registers\n    ret\n \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/length.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_length\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program length.s   */ \n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*********************************/\n/* Initialized data              */\n/*********************************/\n.data\nsMessResultByte:        .asciz \"===Byte Length=== : @ \\n\"\nsMessResultChar:        .asciz \"===Character Length=== : @ \\n\"\nszString1:              .asciz \"møøse€\"\nszCarriageReturn:       .asciz \"\\n\"\n \n/*********************************/\n/* UnInitialized data            */\n/*********************************/\n.bss\nsZoneConv:        .skip 24\n/*********************************/\n/*  code section                 */\n/*********************************/\n.text\n.global main \nmain:                                 // entry of program \n    ldr x0,qAdrszString1\n    bl affichageMess                  // display string\n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n    ldr x0,qAdrszString1\n    mov x1,#0\n1:                                    // loop compute length bytes\n    ldrb w2,[x0,x1]\n    cmp w2,#0\n    cinc x1,x1,ne\n    bne 1b\n \n    mov x0,x1                         // result display\n    ldr x1,qAdrsZoneConv\n    bl conversion10                   // call decimal conversion\n    ldr x0,qAdrsMessResultByte\n    ldr x1,qAdrsZoneConv              // insert conversion in message\n    bl strInsertAtCharInc\n    bl affichageMess\n \n    ldr x0,qAdrszString1\n    mov x1,#0\n    mov x3,#0\n2:                                    // loop compute length characters\n    ldrb w2,[x0,x1]\n    cmp w2,#0\n    beq 6f\n    and x2,x2,#0b11100000             // 3 bytes ?\n    cmp x2,#0b11100000\n    bne 3f\n    add x3,x3,#1\n    add x1,x1,#3\n    b 2b\n3:\n    and x2,x2,#0b11000000              // 2 bytes ?\n    cmp x2,#0b11000000\n    bne 4f\n    add x3,x3,#1\n    add x1,x1,#2\n    b 2b\n4:                                    // else 1 byte\n    add x3,x3,#1\n    add x1,x1,#1\n    b 2b\n \n6:\n    mov x0,x3\n    ldr x1,qAdrsZoneConv\n    bl conversion10                   // call decimal conversion\n    ldr x0,qAdrsMessResultChar\n    ldr x1,qAdrsZoneConv              // insert conversion in message\n    bl strInsertAtCharInc\n    bl affichageMess\n100:                                  // standard end of the program \n    mov x0,0                          // return code\n    mov x8,EXIT                       // request to exit program\n    svc 0                             // perform the system call\n \nqAdrszCarriageReturn:     .quad szCarriageReturn\nqAdrsMessResultByte:      .quad sMessResultByte\nqAdrsMessResultChar:      .quad sMessResultChar\nqAdrszString1:            .quad szString1\nqAdrsZoneConv:            .quad sZoneConv\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/matching.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_matching\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program matching.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessFound:             .asciz \"String found. \\n\" \nszMessNotFound:          .asciz \"String not found. \\n\" \nszString:                .asciz \"abcdefghijklmnopqrstuvwxyz\"\nszString2:               .asciz \"abc\"\nszStringStart:           .asciz \"abcd\"\nszStringEnd:             .asciz \"xyz\"\nszStringStart2:          .asciz \"abcd\"\nszStringEnd2:            .asciz \"xabc\"\nszCarriageReturn:        .asciz \"\\n\"\n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain: \n \n    ldr x0,qAdrszString                  // address input string\n    ldr x1,qAdrszStringStart             // address search string\n \n    bl searchStringDeb                   // Determining if the first string starts with second string\n    cmp x0,0\n    ble 1f\n    ldr x0,qAdrszMessFound               // display message\n    bl affichageMess\n    b 2f\n1:\n    ldr x0,qAdrszMessNotFound\n    bl affichageMess\n2:\n    ldr x0,qAdrszString                 // address input string\n    ldr x1,qAdrszStringEnd              // address search string\n    bl searchStringFin                  // Determining if the first string ends with the second string\n    cmp x0,0\n    ble 3f\n    ldr x0,qAdrszMessFound              // display message\n    bl affichageMess\n    b 4f\n3:\n    ldr x0,qAdrszMessNotFound\n    bl affichageMess\n4:\n    ldr x0,qAdrszString2               // address input string\n    ldr x1,qAdrszStringStart2          // address search string\n \n    bl searchStringDeb                 // \n    cmp x0,0\n    ble 5f\n    ldr x0,qAdrszMessFound             // display message\n    bl affichageMess\n    b 6f\n5:\n    ldr x0,qAdrszMessNotFound\n    bl affichageMess\n6:\n    ldr x0,qAdrszString2               // address input string\n    ldr x1,qAdrszStringEnd2            // address search string\n    bl searchStringFin\n    cmp x0,0\n    ble 7f\n    ldr x0,qAdrszMessFound            // display message\n    bl affichageMess\n    b 8f\n7:\n    ldr x0,qAdrszMessNotFound\n    bl affichageMess\n8:\n    ldr x0,qAdrszString               // address input string\n    ldr x1,qAdrszStringEnd            // address search string\n    bl searchSubString                // Determining if the first string contains the second string at any location\n    cmp x0,0\n    ble 9f\n    ldr x0,qAdrszMessFound            // display message\n    bl affichageMess\n    b 10f\n9:\n    ldr x0,qAdrszMessNotFound         // display substring result\n    bl affichageMess\n10:\n \n100:                                  // standard end of the program\n    mov x0,0                          // return code\n    mov x8,EXIT                       // request to exit program\n    svc 0                             // perform system call\nqAdrszMessFound:          .quad szMessFound\nqAdrszMessNotFound:       .quad szMessNotFound\nqAdrszString:             .quad szString\nqAdrszString2:            .quad szString2\nqAdrszStringStart:        .quad szStringStart\nqAdrszStringEnd:          .quad szStringEnd\nqAdrszStringStart2:       .quad szStringStart2\nqAdrszStringEnd2:         .quad szStringEnd2\nqAdrszCarriageReturn:     .quad szCarriageReturn\n/******************************************************************/\n/*     search substring at begin of input string                  */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of substring */\n/* x0 returns 1 if find or 0 if not or -1 if error */\nsearchStringDeb:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    mov x3,0                       // counter byte  string \n    ldrb w4,[x1,x3]                // load first byte of substring\n    cbz x4,99f                     // empty string ?\n1:\n    ldrb w2,[x0,x3]                // load byte string input\n    cbz x2,98f                     // zero final ?\n    cmp x4,x2                      // bytes equals ?\n    bne 98f                        // no not find\n    add x3,x3,1                    // increment counter\n    ldrb w4,[x1,x3]                // and load next byte of substring\n    cbnz x4,1b                     // zero final ?\n    mov x0,1                       // yes is ok \n    b 100f\n98:\n    mov x0,0                       // not find\n    b 100f\n99:\n    mov x0,-1                      // error\n100:\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/******************************************************************/\n/*     search substring at end of input string                    */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of substring */\n/* x0 returns 1 if find or 0 if not or -1 if error */\nsearchStringFin:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    stp x4,x5,[sp,-16]!            // save  registers\n    mov x3,0                       // counter byte  string \n                                   // search the last character of substring\n1: \n    ldrb w4,[x1,x3]                // load byte of substring\n    cmp x4,#0                      // zero final ?\n    add x2,x3,1\n    csel x3,x2,x3,ne               // no increment counter\n    //addne x3,#1                  // no increment counter\n    bne 1b                         // and loop\n    cbz x3,99f                     // empty string ?\n \n    sub x3,x3,1                    // index of last byte\n    ldrb w4,[x1,x3]                // load last byte of substring\n                                   // search the last character of string\n    mov x2,0                       // index last character\n2: \n    ldrb w5,[x0,x2]                // load first byte of substring\n    cmp x5,0                       // zero final ?\n    add x5,x2,1                    // no -> increment counter\n    csel x2,x5,x2,ne\n    //addne x2,#1                  // no -> increment counter\n    bne 2b                         // and loop\n    cbz x2,98f                     // empty input string ?\n    sub x2,x2,1                    // index last character\n3:\n    ldrb w5,[x0,x2]                // load byte string input\n    cmp x4,x5                      // bytes equals ?\n    bne 98f                        // no -> not found\n    subs x3,x3,1                   // decrement counter\n    blt 97f                        //  ok found\n    subs x2,x2,1                   // decrement counter input string\n    blt 98f                        // if zero -> not found\n    ldrb w4,[x1,x3]                // load previous byte of substring\n    b 3b                           // and loop\n97:\n    mov x0,1                       // yes is ok \n    b 100f\n98:\n    mov x0,0                       // not found\n    b 100f\n99:\n    mov x0,-1                      // error\n100:\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n \n/******************************************************************/\n/*   search a substring in the string                            */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of substring */\n/* x0 returns index of substring in string or -1 if not found */\nsearchSubString:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x2,x3,[sp,-16]!            // save  registers\n    stp x4,x5,[sp,-16]!            // save  registers\n    mov x2,0                       // counter byte input string\n    mov x3,0                       // counter byte string \n    mov x6,-1                      // index found\n    ldrb w4,[x1,x3]\n1:\n    ldrb w5,[x0,x2]                // load byte string \n    cbz x5,99f                     // zero final ?\n    cmp x5,x4                      // compare character \n    beq 2f\n    mov x6,-1                      // no equals - > raz index \n    mov x3,0                       // and raz counter byte\n    add x2,x2,1                    // and increment counter byte\n    b 1b                           // and loop\n2:                                 // characters equals\n    cmp x6,-1                      // first characters equals ?\n    csel x6,x2,x6,eq               // yes -> index begin in x6\n    //moveq x6,x2                  // yes -> index begin in x6\n    add x3,x3,1                    // increment counter substring\n    ldrb w4,[x1,x3]                // and load next byte\n    cmp x4,0                       // zero final ?\n    beq 3f                         // yes -> end search\n    add x2,x2,1                    // else increment counter string\n    b 1b                           // and loop\n3:\n    mov x0,x6\n    b 100f\n \n98:\n    mov x0,0                      // not found\n    b 100f\n99:\n    mov x0,-1                     // error\n100:\n    ldp x4,x5,[sp],16              // restaur  2 registers\n    ldp x2,x3,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/prepend.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/String_prepend\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program prepend.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessString:            .asciz \"British Museum.\\n\"\nszComplement:            .skip 80\nszStringStart:           .asciz \"The rosetta stone is at \"\nszCarriageReturn:        .asciz \"\\n\"\n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain: \n \n    ldr x0,qAdrszMessString               // display message\n    bl affichageMess\n \n    ldr x0,qAdrszMessString\n    ldr x1,qAdrszStringStart\n    bl prepend                             // append sting2 to string1\n    ldr x0,qAdrszMessString\n    bl affichageMess\n \n    ldr x0,qAdrszCarriageReturn\n    bl affichageMess\n \n \n100:                                      // standard end of the program\n    mov x0,0                              // return code\n    mov x8,EXIT                           // request to exit program\n    svc 0                                 // perform system call\nqAdrszMessString:         .quad szMessString\nqAdrszStringStart:        .quad szStringStart\nqAdrszCarriageReturn:     .quad szCarriageReturn\n/**************************************************/\n/*     append two strings                         */ \n/**************************************************/\n/* x0 contains the address of the string1 */\n/* x1 contains the address of the string2 */\nprepend:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x3,#0                                // length counter \n1:                                           // compute length of string 1\n    ldrb w4,[x0,x3]\n    cmp w4,#0\n    cinc  x3,x3,ne                           // increment to one if not equal\n    bne 1b                                   // loop if not equal\n    mov x5,#0                                // length counter insertion string\n2:                                           // compute length of insertion string\n    ldrb w4,[x1,x5]\n    cmp x4,#0\n    cinc  x5,x5,ne                           // increment to one if not equal\n    bne 2b\n    cmp x5,#0\n    beq 99f                                  // string empty -> error\n    add x3,x3,x5                             // add 2 length\n    add x3,x3,#1                             // +1 for final zero\n    mov x6,x0                                // save address string 1\n    mov x0,#0                                // allocation place heap\n    mov x8,BRK                               // call system 'brk'\n    svc #0\n    mov x5,x0                                // save address heap for output string\n    add x0,x0,x3                             // reservation place x3 length\n    mov x8,BRK                               // call system 'brk'\n    svc #0\n    cmp x0,#-1                               // allocation error\n    beq 99f\n    mov x4,#0                      // counter byte string 2\n3:\n    ldrb w3,[x1,x4]                // load byte string 2\n    cbz x3,4f                      // zero final ?\n    strb w3,[x5,x4]                // store byte string 2 in heap\n    add x4,x4,1                    // increment counter 1\n    b 3b                           // no -> loop\n4:\n    mov x2,#0                      // counter byte string 1\n5:\n    ldrb w3,[x6,x2]                // load byte string 1\n    strb w3,[x5,x4]                // store byte string in heap\n    cbz x3,6f                    // zero final ?\n    add x2,x2,1                    // no -> increment counter 1\n    add x4,x4,1                    // no -> increment counter 2\n    b 5b                           // no -> loop\n6:                                 // recopie heap in string 1\n    mov x2,#0                      // counter byte string \n7:\n    ldrb w3,[x5,x2]                // load byte string in heap\n    strb w3,[x6,x2]                // store byte string 1\n    cbz x3,100f                    // zero final ?\n    add x2,x2,1                    // no -> increment counter 1\n    b 7b                           // no -> loop\n100:\n \n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/substring.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Substring\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program substring.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessString:            .asciz \"Result : \" \nszString1:               .asciz \"abcdefghijklmnopqrstuvwxyz\"\nszStringStart:           .asciz \"abcdefg\"\nszCarriageReturn:        .asciz \"\\n\"\n/*******************************************/ \n/* UnInitialized data                      */\n/*******************************************/\n.bss \nszSubString:             .skip 500             // buffer result\n \n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain: \n \n    ldr x0,qAdrszString1                        // address input string\n    ldr x1,qAdrszSubString                      // address output string\n    mov x2,22                                   // location\n    mov x3,4                                    // length\n    bl subStringNbChar                          // starting from n characters in and of m length\n    ldr x0,qAdrszMessString                     // display message\n    bl affichageMess\n    ldr x0,qAdrszSubString                      // display substring result\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn                 // display line return\n    bl affichageMess\n    //\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszSubString\n    mov x2,15                                   // location\n    bl subStringEnd                             //starting from n characters in, up to the end of the string\n    ldr x0,qAdrszMessString                     // display message\n    bl affichageMess\n    ldr x0,qAdrszSubString\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn                 // display line return\n    bl affichageMess\n    //\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszSubString\n    bl subStringMinus                           // whole string minus last character\n    ldr x0,qAdrszMessString                     // display message\n    bl affichageMess\n    ldr x0,qAdrszSubString\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn                 // display line return\n    bl affichageMess\n    //\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszSubString\n    mov x2,'c'                                  // start character\n    mov x3,5                                    // length\n    bl subStringStChar                          //starting from a known character within the string and of m length\n    cmp x0,-1                                   // error ?\n    beq 2f\n    ldr x0,qAdrszMessString                     // display message\n    bl affichageMess\n    ldr x0,qAdrszSubString\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn                 // display line return\n    bl affichageMess\n    //\n2:\n    ldr x0,qAdrszString1\n    ldr x1,qAdrszSubString\n    ldr x2,qAdrszStringStart                    // sub string to start\n    mov x3,10                                   // length\n    bl subStringStString                        // starting from a known substring within the string and of m length\n    cmp x0,-1                                   // error ?\n    beq 3f\n    ldr x0,qAdrszMessString                     // display message\n    bl affichageMess\n    ldr x0,qAdrszSubString\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn                 // display line return\n    bl affichageMess\n3:\n100:                                            // standard end of the program\n    mov x0,0                                    // return code\n    mov x8,EXIT                                 // request to exit program\n    svc 0                                       // perform system call\nqAdrszMessString:         .quad szMessString\nqAdrszString1:            .quad szString1\nqAdrszSubString:          .quad szSubString\nqAdrszStringStart:        .quad szStringStart\nqAdrszCarriageReturn:     .quad szCarriageReturn\n/******************************************************************/\n/*     sub strings  index start  number of characters             */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of the output string */\n/* x2 contains the start index                  */\n/* x3 contains numbers of characters to extract */\n/* x0 returns number of characters or -1 if error */\nsubStringNbChar:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x14,#0                     // counter byte output string \n1:\n    ldrb w15,[x0,x2]               // load byte string input\n    cbz x15,2f                     // zero final ?\n    strb w15,[x1,x14]              // store byte output string\n    add x2,x2,1                    // increment counter\n    add x14,x14,1\n    cmp x14,x3                     // end ?\n    blt 1b                         // no -> loop\n2:\n    strb wzr,[x1,x14]              // store final zero byte string 2\n    mov x0,x14\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*     sub strings  index start at end of string             */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of the output string */\n/* x2 contains the start index                  */\n/* x0 returns number of characters or -1 if error */\nsubStringEnd:\n    stp x2,lr,[sp,-16]!            // save  registers\n    mov x14,0                      // counter byte output string \n1:\n    ldrb w15,[x0,x2]               // load byte string 1\n    cbz x15,2f                     // zero final ?\n    strb w15,[x1,x14]\n    add x2,x2,1\n    add x14,x14,1\n    b 1b                           // loop\n2:\n    strb wzr,[x1,x14]              // store final zero byte string 2\n    mov x0,x14\n100:\n \n    ldp x2,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*      whole string minus last character                        */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of the output string */\n/* x0 returns number of characters or -1 if error */\nsubStringMinus:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x12,0                      // counter byte input string\n    mov x14,0                      // counter byte output string \n1:\n    ldrb w15,[x0,x12]              // load byte string \n    cbz x15,2f                     // zero final ?\n    strb w15,[x1,x14]\n    add x12,x12,1\n    add x14,x14,1\n    b 1b                           //  loop\n2:\n    sub x14,x14,1\n    strb wzr,[x1,x14]              // store final zero byte string 2\n    mov x0,x14\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*   starting from a known character within the string and of m length  */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of the output string */\n/* x2 contains the character    */\n/* x3 contains the length\n/* x0 returns number of characters or -1 if error */\nsubStringStChar:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x16,0                      // counter byte input string\n    mov x14,0                      // counter byte output string \n1:\n    ldrb w15,[x0,x16]              // load byte string \n    cbz x15,4f                     // zero final ?\n    cmp x15,x2                     // character find ?\n    beq 2f                         // yes\n    add x16,x16,1                  // no -> increment indice\n    b 1b                           //  loop\n2:\n    strb w15,[x1,x14]\n    add x16,x16,1\n    add x14,x14,1\n    cmp x14,x3\n    bge 3f\n    ldrb w15,[x0,x16]              // load byte string \n    cbnz x15,2b                    // loop if no zero final\n3:\n    strb wzr,[x1,x14]              // store final zero byte string 2\n    mov x0,x14\n    b 100f\n4:\n    strb w15,[x1,x14]\n    mov x0,#-1\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*   starting from a known substring within the string and of m length  */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of the output string */\n/* x2 contains the address of string to start    */\n/* x3 contains the length\n/* x0 returns number of characters or -1 if error */\nsubStringStString:\n    stp x1,lr,[sp,-16]!            // save  registers\n    stp x20,x21,[sp,-16]!          // save  registers\n    mov x20,x0                     // save address\n    mov x21,x1                     // save address output string\n    mov x1,x2\n    bl searchSubString\n    cmp x0,-1                      // not found ?\n    beq 100f\n    mov x16,x0                     // counter byte input string\n    mov x14,0\n1:\n    ldrb w15,[x20,x16]             // load byte string \n    strb w15,[x21,x14]\n    cmp x15,#0                     // zero final ?\n    csel x0,x14,x0,eq\n    beq 100f\n    add x14,x14,1\n    cmp x14,x3\n    add x15,x16,1\n    csel x16,x15,x16,lt\n    blt 1b                         //  loop\n    strb wzr,[x21,x14]\n    mov x0,x14                     // return indice\n100:\n    ldp x20,x21,[sp],16              // restaur  2 registers\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/******************************************************************/\n/*   search a substring in the string                            */ \n/******************************************************************/\n/* x0 contains the address of the input string */\n/* x1 contains the address of substring */\n/* x0 returns index of substring in string or -1 if not found */\nsearchSubString:\n    stp x1,lr,[sp,-16]!            // save  registers\n    mov x12,0                      // counter byte input string\n    mov x13,0                      // counter byte string \n    mov x16,-1                     // index found\n    ldrb w14,[x1,x13]\n1:\n    ldrb w15,[x0,x12]              // load byte string \n    cbz x15,4f                     // zero final ?\n    cmp x15,x14                    // compare character \n    beq 2f\n    mov x16,-1                     // no equals - > raz index \n    mov x13,0                      // and raz counter byte\n    add x12,x12,1                  // and increment counter byte\n    b 1b                           // and loop\n2:                                 // characters equals\n    cmp x16,-1                     // first characters equals ?\n    csel x16,x12,x16,eq\n   // moveq x6,x2                  // yes -> index begin in x6\n    add x13,x13,1                  // increment counter substring\n    ldrb w14,[x1,x13]              // and load next byte\n    cbz x14,3f                     // zero final ? yes -> end search\n    add x12,x12,1                  // else increment counter string\n    b 1b                           // and loop\n3:\n    mov x0,x16                     // return indice\n    b 100f\n4:\n   mov x0,#-1                      // yes returns error\n100:\n    ldp x1,lr,[sp],16              // restaur  2 registers\n    ret                            // return to address lr x30\n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  },
  {
    "path": "string/tokenize_string.s",
    "content": "/* ===============================\n\n   This program uses codes from Rosetta Code.\n   See: https://rosettacode.org/wiki/Tokenize_a_string\n   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.\n\n   =============================== */\n\n/* ARM assembly AARCH64 Raspberry PI 3B */\n/*  program tokenize_string.s   */\n \n/*******************************************/\n/* Constantes file                         */\n/*******************************************/\n/* for this file see task include a file in language AArch64 assembly*/\n.include \"../includeConstantesARM64.inc\"\n \n.equ NBPOSTESECLAT,          20\n \n/*******************************************/\n/* Initialized data                        */\n/*******************************************/\n.data\nszMessFinal:         .asciz \"Words are : \\n\"\n \nszString:            .asciz \"Hello,How,Are,You,Today\"\nszMessError:         .asciz \"Error tokenize !!\\n\"\nszCarriageReturn:    .asciz \"\\n\"\n/*******************************************/\n/* UnInitialized data                      */\n/*******************************************/\n.bss \n/*******************************************/\n/*  code section                           */\n/*******************************************/\n.text\n.global main \nmain: \n    ldr x0,qAdrszString                           // string address \n    mov x1,','                                    // separator\n    bl stTokenize\n    cmp x0,-1                                     // error ?\n    beq 99f\n    mov x2,x0                                     // table address\n    ldr x0,qAdrszMessFinal                        // display message\n    bl affichageMess\n    ldr x4,[x2]                                   // number of areas\n    add x2,x2,8                                   // first area\n    mov x3,0                                      // loop counter\n    mov x0,x2\n1:                                                // display loop \n    ldr x0,[x2,x3, lsl 3]                         // address area\n    bl affichageMess\n    ldr x0,qAdrszCarriageReturn                   // display carriage return\n    bl affichageMess\n    add x3,x3,1                                  // counter + 1\n    cmp x3,x4                                     // end ?\n    blt 1b                                        // no -> loop\n \n    b 100f\n99:                                               // display error message\n    ldr x0,qAdrszMessError\n    bl affichageMess\n \n100:                                              // standard end of the program\n    mov x0,0                                       // return code\n    mov x8,EXIT                                   // request to exit program\n    svc 0                                         // perform the system call\nqAdrszString:             .quad szString\n//qAdrszFinalString:        .quad szFinalString\nqAdrszMessFinal:          .quad szMessFinal\nqAdrszMessError:          .quad szMessError\nqAdrszCarriageReturn:     .quad szCarriageReturn\n \n/*******************************************************************/\t   \n/* Separate string by separator into an array                     */\n/* areas are store on the heap Linux                               */\n/*******************************************************************/\t  \n/* x0 contains string address */\n/* x1 contains separator character (, or . or : )    */\n/* x0 returns table address with first item = number areas */\n/* and other items contains pointer of each string     */\nstTokenize:\n    stp x1,lr,[sp,-16]!           // save  registers\n    mov x16,x0\n    mov x9,x1                     // save separator\n    mov x14,0          \n1:                                // compute length string for place reservation on the heap\n    ldrb w12,[x0,x14]\n    cbz x12, 2f\n    add x14,x14,1\n    b 1b\n2:\n    ldr x12,qTailleTable\n    add x15,x12,x14\n    and x15,x15,0xFFFFFFFFFFFFFFF0\n    add x15,x15,16                 // align word on the heap\n                                  // place reservation on the heap \n    mov x0,0                      // heap address\n    mov x8,BRK                    // call system linux 'brk'\n    svc 0                         // call system\n    cmp x0,-1                     // error call system\n    beq 100f\n    mov x14,x0                    // save address  heap begin = begin array\n    add x0,x0,x15                 // reserve x15 byte on the heap\n    mov x8,BRK                    // call system linux 'brk'\n    svc 0\n    cmp x0,-1\n    beq 100f\n                                  // string copy on the heap\n    add x13,x14,x12               // behind the array \n    mov x0,x16\n    mov x1,x13\n3:                                // loop copy string\n    ldrb w12,[x0],1               // read one byte and increment pointer one byte\n    strb w12,[x1],1               // store one byte and increment pointer one byte\n    cbnz x12,3b                   // end of string ? no -> loop \n \n    mov x0,#0\n    str x0,[x14]\n    str x13,[x14,8]\n    mov x12,#1                     // areas counter\n4:                                // loop load string character \n    ldrb w0,[x13]\n    cbz x0,5f                     // end string \n    cmp x0,x9                     // separator ?\n    cinc x13,x13,ne               // no -> next location \n    bne 4b                        // and loop\n    strb wzr,[x13]                // store zero final of string\n    add x13,x13,1                 // next character\n    add x12,x12,1                 // areas counter + 1\n    str x13,[x14,x12, lsl #3]     // store address area in the table at index x2\n    b 4b                          // and loop\n \n5:\n    str x12,[x14]                 // store number areas\n    mov x0,x14                    // returns array address\n100:\n    ldp x1,lr,[sp],16             // restaur  2 registers\n    ret                           // return to address lr x30\nqTailleTable:      .quad 8 * NBPOSTESECLAT\n \n/********************************************************/\n/*        File Include fonctions                        */\n/********************************************************/\n/* for this file see task include a file in language AArch64 assembly */\n.include \"../includeARM64.inc\"\n"
  }
]