├── README.md ├── CONTRIBUTING.md ├── misc ├── hello_world.s ├── josephus_problem.s └── perfect_numbers.s ├── LICENSE ├── string ├── concatenation.s ├── length.s ├── append.s ├── prepend.s ├── tokenize_string.s ├── comparison.s └── matching.s ├── .github └── workflows │ └── directory_workflow.yml ├── CODE_OF_CONDUCT.md ├── DIRECTORY.md └── sorters ├── jort_sort.s ├── gnome_sort.s ├── insertion_sort.s ├── bubble_sort.s ├── selection_sort.s ├── radix_sort.s ├── comb_sort.s ├── bogo_sort.s ├── shell_sort.s ├── cocktail_sort.s ├── circle_sort.s ├── quick_sort.s ├── bead_sort.s ├── merge_sort.s ├── counting_sort.s ├── pancake_sort.s ├── heap_sort.s └── permutation_sort.s /README.md: -------------------------------------------------------------------------------- 1 | # The Algorithms - AArch64_Assembly 2 | This repository contains algorithms and data structures implemented in AArch64 Assembly for eductional purposes. 3 | 4 | ## Contribution 5 | You 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. 6 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, if your changes are subjective, controversial or people are likely to have 4 | polarized opinions on this matter, please first discuss the change you wish to make via issue with the owners of 5 | this repository. 6 | 7 | We welcome adding new algorithms and data structures that were mentioned in books or other reputable sources. 8 | We also welcome fixing bugs in code, clarifying documentation and adding new test cases to check existing code. 9 | 10 | Please note that we have a code of conduct, please follow it in all your interactions with the project. 11 | -------------------------------------------------------------------------------- /misc/hello_world.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Hello_world/Text 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | .equ STDOUT, 1 10 | .equ SVC_WRITE, 64 11 | .equ SVC_EXIT, 93 12 | 13 | .text 14 | .global _start 15 | 16 | _start: 17 | stp x29, x30, [sp, -16]! 18 | mov x0, #STDOUT 19 | ldr x1, =msg 20 | mov x2, 13 21 | mov x8, #SVC_WRITE 22 | mov x29, sp 23 | svc #0 // write(stdout, msg, 13); 24 | ldp x29, x30, [sp], 16 25 | mov x0, #0 26 | mov x8, #SVC_EXIT 27 | svc #0 // exit(0); 28 | 29 | msg: .ascii "Hello World!\n" 30 | .align 4 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 The Algorithms 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /string/concatenation.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/String_concatenation 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program concatenation.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | /*******************************************/ 18 | /* Initialized data */ 19 | /*******************************************/ 20 | .data 21 | szMessFinal: .asciz "The final string is \n" 22 | 23 | szString: .asciz "Hello " 24 | szString1: .asciz " the world. \n" 25 | /*******************************************/ 26 | /* UnInitialized data */ 27 | /*******************************************/ 28 | .bss 29 | szFinalString: .skip 255 30 | /*******************************************/ 31 | /* code section */ 32 | /*******************************************/ 33 | .text 34 | .global main 35 | main: 36 | // load string 37 | ldr x1,qAdrszString 38 | ldr x2,qAdrszFinalString 39 | mov x4,0 40 | 1: 41 | ldrb w0,[x1,x4] // load byte of string 42 | strb w0,[x2,x4] 43 | cmp x0,0 // compar with zero ? 44 | add x3,x4,1 45 | csel x4,x3,x4,ne // if x0 <> 0 x4 = x4 +1 sinon x4 46 | bne 1b 47 | ldr x1,qAdrszString1 48 | mov x3,0 49 | 2: 50 | ldrb w0,[x1,x3] // load byte of string 1 51 | strb w0,[x2,x4] 52 | cmp x0,0 // compar with zero ? 53 | add x5,x4,1 54 | csel x4,x5,x4,ne 55 | add x5,x3,1 56 | csel x3,x5,x3,ne 57 | bne 2b 58 | mov x0,x2 // display final string 59 | bl affichageMess 60 | 100: // standard end of the program */ 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | qAdrszString: .quad szString 65 | qAdrszString1: .quad szString1 66 | qAdrszFinalString: .quad szFinalString 67 | qAdrszMessFinal: .quad szMessFinal 68 | /********************************************************/ 69 | /* File Include fonctions */ 70 | /********************************************************/ 71 | /* for this file see task include a file in language AArch64 assembly */ 72 | .include "../includeARM64.inc" 73 | -------------------------------------------------------------------------------- /.github/workflows/directory_workflow.yml: -------------------------------------------------------------------------------- 1 | name: directory_md 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | MainSequence: 6 | name: DIRECTORY.md 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v1 # v2 is broken for git diff 10 | - uses: actions/setup-python@v2 11 | - name: Setup Git Specs 12 | run: | 13 | git config --global user.name github-actions 14 | git config --global user.email '${GITHUB_ACTOR}@users.noreply.github.com' 15 | git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY 16 | - name: Update DIRECTORY.md 17 | shell: python 18 | run: | 19 | import os 20 | from typing import Iterator 21 | URL_BASE = "https://github.com/TheAlgorithms/AArch64_Assembly/blob/main" 22 | g_output = [] 23 | def good_filepaths(top_dir: str = ".") -> Iterator[str]: 24 | fs_exts = tuple(".asm .s".split()) 25 | for dirpath, dirnames, filenames in os.walk(top_dir): 26 | dirnames[:] = [d for d in dirnames if d[0] not in "._"] 27 | for filename in filenames: 28 | if os.path.splitext(filename)[1].lower() in fs_exts: 29 | yield os.path.join(dirpath, filename).lstrip("./") 30 | def md_prefix(i): 31 | return f"{i * ' '}*" if i else "\n##" 32 | def print_path(old_path: str, new_path: str) -> str: 33 | global g_output 34 | old_parts = old_path.split(os.sep) 35 | for i, new_part in enumerate(new_path.split(os.sep)): 36 | if i + 1 > len(old_parts) or old_parts[i] != new_part: 37 | if new_part: 38 | g_output.append(f"{md_prefix(i)} {new_part.replace('_', ' ').title()}") 39 | return new_path 40 | def build_directory_md(top_dir: str = ".") -> str: 41 | global g_output 42 | old_path = "" 43 | for filepath in sorted(good_filepaths(), key=str.lower): 44 | filepath, filename = os.path.split(filepath) 45 | if filepath != old_path: 46 | old_path = print_path(old_path, filepath) 47 | indent = (filepath.count(os.sep) + 1) if filepath else 0 48 | url = "/".join((URL_BASE, filepath, filename)).replace(" ", "%20") 49 | filename = os.path.splitext(filename.replace("_", " ").title())[0] 50 | g_output.append(f"{md_prefix(indent)} [{filename}]({url})") 51 | return "# List of all files\n" + "\n".join(g_output) 52 | with open("DIRECTORY.md", "w") as out_file: 53 | out_file.write(build_directory_md(".") + "\n") 54 | - name: Commit DIRECTORY.md 55 | run: | 56 | git commit -m "updating DIRECTORY.md" DIRECTORY.md || true 57 | git diff DIRECTORY.md 58 | git push --force origin HEAD:$GITHUB_REF || true 59 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at siryaka@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /DIRECTORY.md: -------------------------------------------------------------------------------- 1 | # List of all files 2 | 3 | ## Misc 4 | * [2048](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/2048.s) 5 | * [Hello World](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/hello_world.s) 6 | * [Josephus Problem](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/josephus_problem.s) 7 | * [Perfect Numbers](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/perfect_numbers.s) 8 | * [Sha1](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/sha1.s) 9 | * [Sha256](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/sha256.s) 10 | * [Y Combinator](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/misc/y_combinator.s) 11 | 12 | ## Sorters 13 | * [Bead Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/bead_sort.s) 14 | * [Bogo Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/bogo_sort.s) 15 | * [Bubble Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/bubble_sort.s) 16 | * [Circle Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/circle_sort.s) 17 | * [Cocktail Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/cocktail_sort.s) 18 | * [Comb Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/comb_sort.s) 19 | * [Counting Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/counting_sort.s) 20 | * [Gnome Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/gnome_sort.s) 21 | * [Heap Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/heap_sort.s) 22 | * [Insertion Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/insertion_sort.s) 23 | * [Jort Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/jort_sort.s) 24 | * [Merge Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/merge_sort.s) 25 | * [Pancake Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/pancake_sort.s) 26 | * [Patience Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/patience_sort.s) 27 | * [Permutation Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/permutation_sort.s) 28 | * [Quick Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/quick_sort.s) 29 | * [Radix Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/radix_sort.s) 30 | * [Selection Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/selection_sort.s) 31 | * [Shell Sort](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/sorters/shell_sort.s) 32 | 33 | ## String 34 | * [Append](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/append.s) 35 | * [Comparison](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/comparison.s) 36 | * [Concatenation](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/concatenation.s) 37 | * [Interpolation](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/interpolation.s) 38 | * [Length](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/length.s) 39 | * [Matching](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/matching.s) 40 | * [Prepend](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/prepend.s) 41 | * [Substring](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/substring.s) 42 | * [Tokenize String](https://github.com/TheAlgorithms/AArch64_Assembly/blob/main/string/tokenize_string.s) 43 | -------------------------------------------------------------------------------- /string/length.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/String_length 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program length.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | sMessResultByte: .asciz "===Byte Length=== : @ \n" 23 | sMessResultChar: .asciz "===Character Length=== : @ \n" 24 | szString1: .asciz "møøse€" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | /*********************************/ 28 | /* UnInitialized data */ 29 | /*********************************/ 30 | .bss 31 | sZoneConv: .skip 24 32 | /*********************************/ 33 | /* code section */ 34 | /*********************************/ 35 | .text 36 | .global main 37 | main: // entry of program 38 | ldr x0,qAdrszString1 39 | bl affichageMess // display string 40 | ldr x0,qAdrszCarriageReturn 41 | bl affichageMess 42 | 43 | ldr x0,qAdrszString1 44 | mov x1,#0 45 | 1: // loop compute length bytes 46 | ldrb w2,[x0,x1] 47 | cmp w2,#0 48 | cinc x1,x1,ne 49 | bne 1b 50 | 51 | mov x0,x1 // result display 52 | ldr x1,qAdrsZoneConv 53 | bl conversion10 // call decimal conversion 54 | ldr x0,qAdrsMessResultByte 55 | ldr x1,qAdrsZoneConv // insert conversion in message 56 | bl strInsertAtCharInc 57 | bl affichageMess 58 | 59 | ldr x0,qAdrszString1 60 | mov x1,#0 61 | mov x3,#0 62 | 2: // loop compute length characters 63 | ldrb w2,[x0,x1] 64 | cmp w2,#0 65 | beq 6f 66 | and x2,x2,#0b11100000 // 3 bytes ? 67 | cmp x2,#0b11100000 68 | bne 3f 69 | add x3,x3,#1 70 | add x1,x1,#3 71 | b 2b 72 | 3: 73 | and x2,x2,#0b11000000 // 2 bytes ? 74 | cmp x2,#0b11000000 75 | bne 4f 76 | add x3,x3,#1 77 | add x1,x1,#2 78 | b 2b 79 | 4: // else 1 byte 80 | add x3,x3,#1 81 | add x1,x1,#1 82 | b 2b 83 | 84 | 6: 85 | mov x0,x3 86 | ldr x1,qAdrsZoneConv 87 | bl conversion10 // call decimal conversion 88 | ldr x0,qAdrsMessResultChar 89 | ldr x1,qAdrsZoneConv // insert conversion in message 90 | bl strInsertAtCharInc 91 | bl affichageMess 92 | 100: // standard end of the program 93 | mov x0,0 // return code 94 | mov x8,EXIT // request to exit program 95 | svc 0 // perform the system call 96 | 97 | qAdrszCarriageReturn: .quad szCarriageReturn 98 | qAdrsMessResultByte: .quad sMessResultByte 99 | qAdrsMessResultChar: .quad sMessResultChar 100 | qAdrszString1: .quad szString1 101 | qAdrsZoneConv: .quad sZoneConv 102 | /********************************************************/ 103 | /* File Include fonctions */ 104 | /********************************************************/ 105 | /* for this file see task include a file in language AArch64 assembly */ 106 | .include "../includeARM64.inc" 107 | -------------------------------------------------------------------------------- /string/append.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/String_append 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program append.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | .equ BUFFERSIZE, 100 19 | /*******************************************/ 20 | /* Initialized data */ 21 | /*******************************************/ 22 | .data 23 | szMessString: .asciz "String :\n" 24 | szString1: .asciz "Alphabet : " 25 | sComplement: .fill BUFFERSIZE,1,0 26 | szString2: .asciz "abcdefghijklmnopqrstuvwxyz" 27 | 28 | szCarriageReturn: .asciz "\n" 29 | /*******************************************/ 30 | /* UnInitialized data */ 31 | /*******************************************/ 32 | .bss 33 | /*******************************************/ 34 | /* code section */ 35 | /*******************************************/ 36 | .text 37 | .global main 38 | main: 39 | 40 | ldr x0,qAdrszMessString // display message 41 | bl affichageMess 42 | ldr x0,qAdrszString1 // display begin string 43 | bl affichageMess 44 | ldr x0,qAdrszCarriageReturn // display return line 45 | bl affichageMess 46 | ldr x0,qAdrszString1 47 | ldr x1,qAdrszString2 48 | bl append // append sting2 to string1 49 | ldr x0,qAdrszMessString 50 | bl affichageMess 51 | ldr x0,qAdrszString1 // display string 52 | bl affichageMess 53 | ldr x0,qAdrszCarriageReturn 54 | bl affichageMess 55 | 56 | 100: // standard end of the program 57 | mov x0,0 // return code 58 | mov x8,EXIT // request to exit program 59 | svc 0 // perform system call 60 | qAdrszMessString: .quad szMessString 61 | qAdrszString1: .quad szString1 62 | qAdrszString2: .quad szString2 63 | qAdrszCarriageReturn: .quad szCarriageReturn 64 | /**************************************************/ 65 | /* append two strings */ 66 | /**************************************************/ 67 | /* x0 contains the address of the string1 */ 68 | /* x1 contains the address of the string2 */ 69 | append: 70 | stp x1,lr,[sp,-16]! // save registers 71 | mov x2,#0 // counter byte string 1 72 | 1: 73 | ldrb w3,[x0,x2] // load byte string 1 74 | cmp x3,#0 // zero final ? 75 | add x4,x2,1 76 | csel x2,x4,x2,ne // if x3 not equal 0, x2 = X2 +1 else x2 77 | bne 1b // no -> loop 78 | mov x4,#0 // counter byte string 2 79 | 2: 80 | ldrb w3,[x1,x4] // load byte string 2 81 | strb w3,[x0,x2] // store byte string 1 82 | cbz x3,100f // zero final ? 83 | add x2,x2,1 // no -> increment counter 1 84 | add x4,x4,1 // no -> increment counter 2 85 | b 2b // no -> loop 86 | 100: 87 | 88 | ldp x1,lr,[sp],16 // restaur 2 registers 89 | ret // return to address lr x30 90 | /********************************************************/ 91 | /* File Include fonctions */ 92 | /********************************************************/ 93 | /* for this file see task include a file in language AArch64 assembly */ 94 | .include "../includeARM64.inc" 95 | -------------------------------------------------------------------------------- /sorters/jort_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/JortSort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program jort_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*******************************************/ 19 | /* Initialized data */ 20 | /*******************************************/ 21 | .data 22 | szMessOk: .asciz "Ok, the list is sorted. \n" 23 | szMessNotOk: .asciz "Ouah!! this list is unsorted.\n" 24 | szCarriageReturn: .asciz "\n" 25 | tbNumber: .quad 3 26 | .quad 4 27 | .quad 20 28 | .quad 5 29 | .equ LGTBNUMBER, (. - tbNumber)/8 // number element of area 30 | /*******************************************/ 31 | /* UnInitialized data */ 32 | /*******************************************/ 33 | .bss 34 | sZoneConversion: .skip 100 35 | .align 4 36 | tbNumberSorted: .skip 8 * LGTBNUMBER 37 | /*******************************************/ 38 | /* code section */ 39 | /*******************************************/ 40 | .text 41 | .global main 42 | main: // entry of program 43 | ldr x0,qAdrtbNumber 44 | ldr x1,qAdrtbNumberSorted 45 | mov x2,LGTBNUMBER 46 | bl insertionSort // sort area 47 | ldr x0,qAdrtbNumber 48 | ldr x1,qAdrtbNumberSorted 49 | mov x2,LGTBNUMBER 50 | bl comparArea // control area 51 | cbz x0,1f 52 | ldr x0,qAdrszMessNotOk // not sorted 53 | bl affichageMess 54 | b 100f 55 | 1: // ok it is good 56 | ldr x0,qAdrszMessOk 57 | bl affichageMess 58 | 100: // standard end of the program 59 | mov x0, #0 // return code 60 | mov x8, #EXIT // request to exit program 61 | svc 0 // perform the system call 62 | 63 | qAdrtbNumber: .quad tbNumber 64 | qAdrtbNumberSorted: .quad tbNumberSorted 65 | qAdrszMessNotOk: .quad szMessNotOk 66 | qAdrszMessOk: .quad szMessOk 67 | qAdrszCarriageReturn: .quad szCarriageReturn 68 | /******************************************************************/ 69 | /* insertion sort */ 70 | /******************************************************************/ 71 | /* x0 contains the address of area to sort */ 72 | /* x1 contains the address of area sorted */ 73 | /* x2 contains the number of element */ 74 | insertionSort: 75 | stp x1,lr,[sp,-16]! // save registers 76 | stp x2,x3,[sp,-16]! // save registers 77 | mov x3,0 78 | 1: // copy area unsorted to other area 79 | ldr x4,[x0,x3,lsl 3] 80 | str x4,[x1,x3,lsl 3] 81 | add x3,x3,1 82 | cmp x3,x2 83 | blt 1b 84 | 85 | mov x3,1 // and sort area 86 | 2: 87 | ldr x4,[x1,x3,lsl 3] 88 | subs x5,x3,1 89 | 3: 90 | cbz x5,4f 91 | ldr x6,[x1,x5,lsl 3] 92 | cmp x6,x4 93 | ble 4f 94 | add x7,x5,1 95 | str x6,[x1,x7,lsl 3] 96 | subs x5,x5,1 97 | b 3b 98 | 4: 99 | add x5,x5,1 100 | str x4,[x1,x5,lsl 3] 101 | add x3,x3,1 102 | cmp x3,x2 103 | blt 2b 104 | 100: 105 | ldp x2,x3,[sp],16 // restaur 2 registers 106 | ldp x1,lr,[sp],16 // restaur 2 registers 107 | ret 108 | /******************************************************************/ 109 | /* Comparaison elements of two areas */ 110 | /******************************************************************/ 111 | /* x0 contains the address of area to sort */ 112 | /* x1 contains the address of area sorted */ 113 | /* x2 contains the number of element */ 114 | comparArea: 115 | stp x1,lr,[sp,-16]! // save registers 116 | stp x2,x3,[sp,-16]! // save registers 117 | mov x3,0 118 | 1: 119 | ldr x4,[x0,x3,lsl 3] // load element area 1 120 | ldr x5,[x1,x3,lsl 3] // load element area 2 121 | cmp x4,x5 // equal ? 122 | bne 99f // no -> error 123 | add x3,x3,1 // yes increment indice 124 | cmp x3,x2 // maxi ? 125 | blt 1b // no -> loop 126 | mov x0,0 // yes -> it is ok 127 | b 100f 128 | 99: 129 | mov x0,1 130 | 100: 131 | ldp x2,x3,[sp],16 // restaur 2 registers 132 | ldp x1,lr,[sp],16 // restaur 2 registers 133 | ret 134 | 135 | 136 | /********************************************************/ 137 | /* File Include fonctions */ 138 | /********************************************************/ 139 | /* for this file see task include a file in language AArch64 assembly */ 140 | .include "../includeARM64.inc" 141 | -------------------------------------------------------------------------------- /string/prepend.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/String_prepend 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program prepend.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*******************************************/ 19 | /* Initialized data */ 20 | /*******************************************/ 21 | .data 22 | szMessString: .asciz "British Museum.\n" 23 | szComplement: .skip 80 24 | szStringStart: .asciz "The rosetta stone is at " 25 | szCarriageReturn: .asciz "\n" 26 | /*******************************************/ 27 | /* UnInitialized data */ 28 | /*******************************************/ 29 | .bss 30 | /*******************************************/ 31 | /* code section */ 32 | /*******************************************/ 33 | .text 34 | .global main 35 | main: 36 | 37 | ldr x0,qAdrszMessString // display message 38 | bl affichageMess 39 | 40 | ldr x0,qAdrszMessString 41 | ldr x1,qAdrszStringStart 42 | bl prepend // append sting2 to string1 43 | ldr x0,qAdrszMessString 44 | bl affichageMess 45 | 46 | ldr x0,qAdrszCarriageReturn 47 | bl affichageMess 48 | 49 | 50 | 100: // standard end of the program 51 | mov x0,0 // return code 52 | mov x8,EXIT // request to exit program 53 | svc 0 // perform system call 54 | qAdrszMessString: .quad szMessString 55 | qAdrszStringStart: .quad szStringStart 56 | qAdrszCarriageReturn: .quad szCarriageReturn 57 | /**************************************************/ 58 | /* append two strings */ 59 | /**************************************************/ 60 | /* x0 contains the address of the string1 */ 61 | /* x1 contains the address of the string2 */ 62 | prepend: 63 | stp x1,lr,[sp,-16]! // save registers 64 | mov x3,#0 // length counter 65 | 1: // compute length of string 1 66 | ldrb w4,[x0,x3] 67 | cmp w4,#0 68 | cinc x3,x3,ne // increment to one if not equal 69 | bne 1b // loop if not equal 70 | mov x5,#0 // length counter insertion string 71 | 2: // compute length of insertion string 72 | ldrb w4,[x1,x5] 73 | cmp x4,#0 74 | cinc x5,x5,ne // increment to one if not equal 75 | bne 2b 76 | cmp x5,#0 77 | beq 99f // string empty -> error 78 | add x3,x3,x5 // add 2 length 79 | add x3,x3,#1 // +1 for final zero 80 | mov x6,x0 // save address string 1 81 | mov x0,#0 // allocation place heap 82 | mov x8,BRK // call system 'brk' 83 | svc #0 84 | mov x5,x0 // save address heap for output string 85 | add x0,x0,x3 // reservation place x3 length 86 | mov x8,BRK // call system 'brk' 87 | svc #0 88 | cmp x0,#-1 // allocation error 89 | beq 99f 90 | mov x4,#0 // counter byte string 2 91 | 3: 92 | ldrb w3,[x1,x4] // load byte string 2 93 | cbz x3,4f // zero final ? 94 | strb w3,[x5,x4] // store byte string 2 in heap 95 | add x4,x4,1 // increment counter 1 96 | b 3b // no -> loop 97 | 4: 98 | mov x2,#0 // counter byte string 1 99 | 5: 100 | ldrb w3,[x6,x2] // load byte string 1 101 | strb w3,[x5,x4] // store byte string in heap 102 | cbz x3,6f // zero final ? 103 | add x2,x2,1 // no -> increment counter 1 104 | add x4,x4,1 // no -> increment counter 2 105 | b 5b // no -> loop 106 | 6: // recopie heap in string 1 107 | mov x2,#0 // counter byte string 108 | 7: 109 | ldrb w3,[x5,x2] // load byte string in heap 110 | strb w3,[x6,x2] // store byte string 1 111 | cbz x3,100f // zero final ? 112 | add x2,x2,1 // no -> increment counter 1 113 | b 7b // no -> loop 114 | 100: 115 | 116 | ldp x1,lr,[sp],16 // restaur 2 registers 117 | ret // return to address lr x30 118 | /********************************************************/ 119 | /* File Include fonctions */ 120 | /********************************************************/ 121 | /* for this file see task include a file in language AArch64 assembly */ 122 | .include "../includeARM64.inc" 123 | -------------------------------------------------------------------------------- /string/tokenize_string.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Tokenize_a_string 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program tokenize_string.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | .equ NBPOSTESECLAT, 20 19 | 20 | /*******************************************/ 21 | /* Initialized data */ 22 | /*******************************************/ 23 | .data 24 | szMessFinal: .asciz "Words are : \n" 25 | 26 | szString: .asciz "Hello,How,Are,You,Today" 27 | szMessError: .asciz "Error tokenize !!\n" 28 | szCarriageReturn: .asciz "\n" 29 | /*******************************************/ 30 | /* UnInitialized data */ 31 | /*******************************************/ 32 | .bss 33 | /*******************************************/ 34 | /* code section */ 35 | /*******************************************/ 36 | .text 37 | .global main 38 | main: 39 | ldr x0,qAdrszString // string address 40 | mov x1,',' // separator 41 | bl stTokenize 42 | cmp x0,-1 // error ? 43 | beq 99f 44 | mov x2,x0 // table address 45 | ldr x0,qAdrszMessFinal // display message 46 | bl affichageMess 47 | ldr x4,[x2] // number of areas 48 | add x2,x2,8 // first area 49 | mov x3,0 // loop counter 50 | mov x0,x2 51 | 1: // display loop 52 | ldr x0,[x2,x3, lsl 3] // address area 53 | bl affichageMess 54 | ldr x0,qAdrszCarriageReturn // display carriage return 55 | bl affichageMess 56 | add x3,x3,1 // counter + 1 57 | cmp x3,x4 // end ? 58 | blt 1b // no -> loop 59 | 60 | b 100f 61 | 99: // display error message 62 | ldr x0,qAdrszMessError 63 | bl affichageMess 64 | 65 | 100: // standard end of the program 66 | mov x0,0 // return code 67 | mov x8,EXIT // request to exit program 68 | svc 0 // perform the system call 69 | qAdrszString: .quad szString 70 | //qAdrszFinalString: .quad szFinalString 71 | qAdrszMessFinal: .quad szMessFinal 72 | qAdrszMessError: .quad szMessError 73 | qAdrszCarriageReturn: .quad szCarriageReturn 74 | 75 | /*******************************************************************/ 76 | /* Separate string by separator into an array */ 77 | /* areas are store on the heap Linux */ 78 | /*******************************************************************/ 79 | /* x0 contains string address */ 80 | /* x1 contains separator character (, or . or : ) */ 81 | /* x0 returns table address with first item = number areas */ 82 | /* and other items contains pointer of each string */ 83 | stTokenize: 84 | stp x1,lr,[sp,-16]! // save registers 85 | mov x16,x0 86 | mov x9,x1 // save separator 87 | mov x14,0 88 | 1: // compute length string for place reservation on the heap 89 | ldrb w12,[x0,x14] 90 | cbz x12, 2f 91 | add x14,x14,1 92 | b 1b 93 | 2: 94 | ldr x12,qTailleTable 95 | add x15,x12,x14 96 | and x15,x15,0xFFFFFFFFFFFFFFF0 97 | add x15,x15,16 // align word on the heap 98 | // place reservation on the heap 99 | mov x0,0 // heap address 100 | mov x8,BRK // call system linux 'brk' 101 | svc 0 // call system 102 | cmp x0,-1 // error call system 103 | beq 100f 104 | mov x14,x0 // save address heap begin = begin array 105 | add x0,x0,x15 // reserve x15 byte on the heap 106 | mov x8,BRK // call system linux 'brk' 107 | svc 0 108 | cmp x0,-1 109 | beq 100f 110 | // string copy on the heap 111 | add x13,x14,x12 // behind the array 112 | mov x0,x16 113 | mov x1,x13 114 | 3: // loop copy string 115 | ldrb w12,[x0],1 // read one byte and increment pointer one byte 116 | strb w12,[x1],1 // store one byte and increment pointer one byte 117 | cbnz x12,3b // end of string ? no -> loop 118 | 119 | mov x0,#0 120 | str x0,[x14] 121 | str x13,[x14,8] 122 | mov x12,#1 // areas counter 123 | 4: // loop load string character 124 | ldrb w0,[x13] 125 | cbz x0,5f // end string 126 | cmp x0,x9 // separator ? 127 | cinc x13,x13,ne // no -> next location 128 | bne 4b // and loop 129 | strb wzr,[x13] // store zero final of string 130 | add x13,x13,1 // next character 131 | add x12,x12,1 // areas counter + 1 132 | str x13,[x14,x12, lsl #3] // store address area in the table at index x2 133 | b 4b // and loop 134 | 135 | 5: 136 | str x12,[x14] // store number areas 137 | mov x0,x14 // returns array address 138 | 100: 139 | ldp x1,lr,[sp],16 // restaur 2 registers 140 | ret // return to address lr x30 141 | qTailleTable: .quad 8 * NBPOSTESECLAT 142 | 143 | /********************************************************/ 144 | /* File Include fonctions */ 145 | /********************************************************/ 146 | /* for this file see task include a file in language AArch64 assembly */ 147 | .include "../includeARM64.inc" 148 | -------------------------------------------------------------------------------- /string/comparison.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/String_comparison 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program comparison.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | /*******************************************/ 18 | /* Initialized data */ 19 | /*******************************************/ 20 | .data 21 | szMessStringEqu: .asciz "The strings are equals.\n" 22 | szMessStringNotEqu: .asciz "The strings are not equals.\n" 23 | szCarriageReturn: .asciz "\n" 24 | 25 | szString1: .asciz "ABCDE" 26 | szString2: .asciz "ABCDE" 27 | szString3: .asciz "ABCFG" 28 | szString4: .asciz "ABC" 29 | szString5: .asciz "abcde" 30 | /*******************************************/ 31 | /* UnInitialized data / 32 | /*******************************************/ 33 | .bss 34 | /*******************************************/ 35 | /* code section */ 36 | /*******************************************/ 37 | .text 38 | .global main 39 | main: // entry of program 40 | 41 | ldr x0,qAdrszString1 42 | ldr x1,qAdrszString2 43 | bl Comparaison 44 | 45 | ldr x0,qAdrszString1 46 | ldr x1,qAdrszString3 47 | bl Comparaison 48 | 49 | ldr x0,qAdrszString1 50 | ldr x1,qAdrszString4 51 | bl Comparaison 52 | // case sensitive comparisons ABCDE et abcde 53 | ldr x0,qAdrszString1 54 | ldr x1,qAdrszString5 55 | bl Comparaison 56 | // case insensitive comparisons ABCDE et abcde 57 | ldr x0,qAdrszString1 58 | ldr x1,qAdrszString5 59 | bl comparStringsInsensitive 60 | cbnz x0,1f 61 | ldr x0,qAdrszMessStringEqu 62 | bl affichageMess 63 | b 2f 64 | 1: 65 | ldr x0,qAdrszMessStringNotEqu 66 | bl affichageMess 67 | 68 | 2: 69 | 70 | 100: // standard end of the program 71 | mov x0,0 // return code 72 | mov x8,EXIT // request to exit program 73 | svc 0 // perform the system call 74 | qAdrszString1: .quad szString1 75 | qAdrszString2: .quad szString2 76 | qAdrszString3: .quad szString3 77 | qAdrszString4: .quad szString4 78 | qAdrszString5: .quad szString5 79 | qAdrszMessStringEqu: .quad szMessStringEqu 80 | qAdrszMessStringNotEqu: .quad szMessStringNotEqu 81 | qAdrszCarriageReturn: .quad szCarriageReturn 82 | /*********************************************/ 83 | /* comparaison */ 84 | /*********************************************/ 85 | /* x0 contains address String 1 */ 86 | /* x1 contains address String 2 */ 87 | Comparaison: 88 | stp x1,lr,[sp,-16]! // save registers 89 | bl comparStrings 90 | cbnz x0,1f 91 | ldr x0,qAdrszMessStringEqu 92 | bl affichageMess 93 | b 2f 94 | 1: 95 | ldr x0,qAdrszMessStringNotEqu 96 | bl affichageMess 97 | 98 | 2: 99 | ldp x1,lr,[sp],16 // restaur 2 registers 100 | ret // return to address lr x30 101 | 102 | /************************************/ 103 | /* Strings case sensitive comparisons */ 104 | /************************************/ 105 | /* x0 et x1 contains the address of strings */ 106 | /* return 0 in x0 if equals */ 107 | /* return -1 if string x0 < string x1 */ 108 | /* return 1 if string x0 > string x1 */ 109 | comparStrings: 110 | stp x1,lr,[sp,-16]! // save registers 111 | stp x2,x3,[sp,-16]! // save registers 112 | stp x4,x5,[sp,-16]! // save registers 113 | mov x2,#0 // counter 114 | 1: 115 | ldrb w3,[x0,x2] // byte string 1 116 | ldrb w4,[x1,x2] // byte string 2 117 | cmp x3,x4 118 | blt 2f 119 | bgt 3f 120 | cbz x3,4f // 0 end string 121 | add x2,x2,1 // else add 1 in counter 122 | b 1b // and loop */ 123 | 2: 124 | mov x0,-1 // lower 125 | b 100f 126 | 3: 127 | mov x0,1 // higher 128 | b 100f 129 | 4: 130 | mov x0,0 // equal 131 | 100: 132 | ldp x4,x5,[sp],16 // restaur 2 registers 133 | ldp x2,x3,[sp],16 // restaur 2 registers 134 | ldp x1,lr,[sp],16 // restaur 2 registers 135 | ret // return to address lr x30 136 | /************************************/ 137 | /* Strings case insensitive comparisons */ 138 | /************************************/ 139 | /* x0 et x1 contains the address of strings */ 140 | /* return 0 in x0 if equals */ 141 | /* return -1 if string x0 < string x1 */ 142 | /* return 1 if string x0 > string x1 */ 143 | comparStringsInsensitive: 144 | stp x1,lr,[sp,-16]! // save registers 145 | stp x2,x3,[sp,-16]! // save registers 146 | stp x4,x5,[sp,-16]! // save registers 147 | mov x2,#0 // counter 148 | 149 | 1: 150 | ldrb w3,[x0,x2] // byte string 1 151 | ldrb w4,[x1,x2] // byte string 2 152 | // majuscules --> minuscules byte 1 153 | cmp x3,65 154 | blt 2f 155 | cmp x3,90 156 | bgt 2f 157 | add x3,x3,32 158 | 2: // majuscules --> minuscules byte 2 159 | cmp x4,65 160 | blt 3f 161 | cmp x4,90 162 | bgt 3f 163 | add x4,x4,32 164 | 3: 165 | cmp x3,x4 166 | blt 4f 167 | bgt 5f 168 | cbz x3,6f // 0 end string 169 | add x2,x2,1 // else add 1 in counter 170 | b 1b // and loop 171 | 4: 172 | mov x0,-1 // lower 173 | b 100f 174 | 5: 175 | mov x0,1 // higher 176 | b 100f 177 | 6: 178 | mov x0,0 // equal 179 | 100: 180 | ldp x4,x5,[sp],16 // restaur 2 registers 181 | ldp x2,x3,[sp],16 // restaur 2 registers 182 | ldp x1,lr,[sp],16 // restaur 2 registers 183 | ret // return to address lr x30 184 | /********************************************************/ 185 | /* File Include fonctions */ 186 | /********************************************************/ 187 | /* for this file see task include a file in language AArch64 assembly */ 188 | .include "../includeARM64.inc" 189 | -------------------------------------------------------------------------------- /sorters/gnome_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Gnome_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program gnome_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | #TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 // first element 44 | mov x2,NBELEMENTS // number of élements 45 | bl gnomeSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* gnome sort */ 102 | /******************************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains the first element */ 105 | /* x2 contains the number of element */ 106 | gnomeSort: 107 | stp x1,lr,[sp,-16]! // save registers 108 | stp x2,x3,[sp,-16]! // save registers 109 | stp x4,x5,[sp,-16]! // save registers 110 | stp x6,x7,[sp,-16]! // save registers 111 | stp x8,x9,[sp,-16]! // save registers 112 | sub x2,x2,1 // compute end index n - 1 113 | add x3,x1,1 // index i 114 | add x7,x1,2 // index j 115 | 1: // start loop 1 116 | cmp x3,x2 117 | bgt 100f 118 | sub x4,x3,1 // 119 | ldr x5,[x0,x3,lsl 3] // load value A[j] 120 | ldr x6,[x0,x4,lsl 3] // load value A[j+1] 121 | cmp x5,x6 // compare value 122 | bge 2f 123 | str x6,[x0,x3,lsl 3] // if smaller inversion 124 | str x5,[x0,x4,lsl 3] 125 | sub x3,x3,1 // i = i - 1 126 | cmp x3,x1 127 | bne 1b // loop 1 128 | 2: 129 | mov x3,x7 // i = j 130 | add x7,x7,1 // j = j + 1 131 | b 1b // loop 1 132 | 133 | 100: 134 | ldp x8,x9,[sp],16 // restaur 2 registers 135 | ldp x6,x7,[sp],16 // restaur 2 registers 136 | ldp x4,x5,[sp],16 // restaur 2 registers 137 | ldp x2,x3,[sp],16 // restaur 2 registers 138 | ldp x1,lr,[sp],16 // restaur 2 registers 139 | ret // return to address lr x30 140 | 141 | /******************************************************************/ 142 | /* Display table elements */ 143 | /******************************************************************/ 144 | /* x0 contains the address of table */ 145 | displayTable: 146 | stp x1,lr,[sp,-16]! // save registers 147 | stp x2,x3,[sp,-16]! // save registers 148 | mov x2,x0 // table address 149 | mov x3,0 150 | 1: // loop display table 151 | ldr x0,[x2,x3,lsl 3] 152 | ldr x1,qAdrsZoneConv 153 | bl conversion10S // décimal conversion 154 | ldr x0,qAdrsMessResult 155 | ldr x1,qAdrsZoneConv 156 | bl strInsertAtCharInc // insert result at @ character 157 | bl affichageMess // display message 158 | add x3,x3,1 159 | cmp x3,NBELEMENTS - 1 160 | ble 1b 161 | ldr x0,qAdrszCarriageReturn 162 | bl affichageMess 163 | mov x0,x2 164 | 100: 165 | ldp x2,x3,[sp],16 // restaur 2 registers 166 | ldp x1,lr,[sp],16 // restaur 2 registers 167 | ret // return to address lr x30 168 | /********************************************************/ 169 | /* File Include fonctions */ 170 | /********************************************************/ 171 | /* for this file see task include a file in language AArch64 assembly */ 172 | .include "../includeARM64.inc" 173 | -------------------------------------------------------------------------------- /sorters/insertion_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Insertion_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program insertion_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 // first element 44 | mov x2,NBELEMENTS // number of élements 45 | bl insertionSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* insertion sort */ 102 | /******************************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains the first element */ 105 | /* x2 contains the number of element */ 106 | insertionSort: 107 | stp x1,lr,[sp,-16]! // save registers 108 | stp x2,x3,[sp,-16]! // save registers 109 | stp x4,x5,[sp,-16]! // save registers 110 | stp x6,x7,[sp,-16]! // save registers 111 | add x3,x1,1 // index i 112 | 1: // start loop 1 113 | ldr x4,[x0,x3,lsl 3] // load value A[i] 114 | sub x5,x3,1 // index j 115 | 2: // start loop 2 116 | ldr x6,[x0,x5,lsl 3] // load value A[j] 117 | cmp x6,x4 // compare value 118 | ble 3f 119 | add x5,x5,1 // increment index j 120 | str x6,[x0,x5,lsl 3] // store value A[j+1} 121 | sub x5,x5,2 // j = j - 1 122 | cmp x5,x1 // compare first element 123 | bge 2b // loop 2 124 | 3: 125 | add x5,x5,1 // increment index j 126 | str x4,[x0,x5,lsl 3] // store value A[i} 127 | add x3,x3,1 // increment index i 128 | cmp x3,x2 // end ? 129 | blt 1b // loop 1 130 | 131 | 100: 132 | ldp x6,x7,[sp],16 // restaur 2 registers 133 | ldp x4,x5,[sp],16 // restaur 2 registers 134 | ldp x2,x3,[sp],16 // restaur 2 registers 135 | ldp x1,lr,[sp],16 // restaur 2 registers 136 | ret // return to address lr x30 137 | 138 | /******************************************************************/ 139 | /* Display table elements */ 140 | /******************************************************************/ 141 | /* x0 contains the address of table */ 142 | displayTable: 143 | stp x1,lr,[sp,-16]! // save registers 144 | stp x2,x3,[sp,-16]! // save registers 145 | mov x2,x0 // table address 146 | mov x3,0 147 | 1: // loop display table 148 | ldr x0,[x2,x3,lsl 3] 149 | ldr x1,qAdrsZoneConv 150 | bl conversion10S // décimal conversion 151 | ldr x0,qAdrsMessResult 152 | ldr x1,qAdrsZoneConv 153 | bl strInsertAtCharInc // insert result at @ character 154 | bl affichageMess // display message 155 | add x3,x3,1 156 | cmp x3,NBELEMENTS - 1 157 | ble 1b 158 | ldr x0,qAdrszCarriageReturn 159 | bl affichageMess 160 | mov x0,x2 161 | 100: 162 | ldp x2,x3,[sp],16 // restaur 2 registers 163 | ldp x1,lr,[sp],16 // restaur 2 registers 164 | ret // return to address lr x30 165 | /********************************************************/ 166 | /* File Include fonctions */ 167 | /********************************************************/ 168 | /* for this file see task include a file in language AArch64 assembly */ 169 | .include "../includeARM64.inc" 170 | -------------------------------------------------------------------------------- /sorters/bubble_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program bubble_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | #TableNumber: .quad 10,9,8,7,6,5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 44 | mov x2,NBELEMENTS // number of élements 45 | bl bubbleSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* bubble sort */ 102 | /******************************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains the first element */ 105 | /* x2 contains the number of element */ 106 | bubbleSort: 107 | stp x1,lr,[sp,-16]! // save registers 108 | stp x2,x3,[sp,-16]! // save registers 109 | stp x4,x5,[sp,-16]! // save registers 110 | stp x6,x7,[sp,-16]! // save registers 111 | stp x8,x9,[sp,-16]! // save registers 112 | sub x2,x2,1 // compute i = n - 1 113 | add x8,x1,1 114 | 1: // start loop 1 115 | mov x3,x1 // start index 116 | mov x9,0 117 | sub x7,x2,1 118 | 2: // start loop 2 119 | add x4,x3,1 120 | ldr x5,[x0,x3,lsl 3] // load value A[j] 121 | ldr x6,[x0,x4,lsl 3] // load value A[j+1] 122 | cmp x6,x5 // compare value 123 | bge 3f 124 | str x6,[x0,x3,lsl 3] // if smaller inversion 125 | str x5,[x0,x4,lsl 3] 126 | mov x9,1 // top table not sorted 127 | 3: 128 | add x3,x3,1 // increment index j 129 | cmp x3,x7 // end ? 130 | ble 2b // no -> loop 2 131 | cmp x9,0 // table sorted ? 132 | beq 100f // yes -> end 133 | 134 | sub x2,x2,1 // decrement i 135 | cmp x2,x8 // end ? 136 | bge 1b // no -> loop 1 137 | 138 | 100: 139 | ldp x8,x9,[sp],16 // restaur 2 registers 140 | ldp x6,x7,[sp],16 // restaur 2 registers 141 | ldp x4,x5,[sp],16 // restaur 2 registers 142 | ldp x2,x3,[sp],16 // restaur 2 registers 143 | ldp x1,lr,[sp],16 // restaur 2 registers 144 | ret // return to address lr x30 145 | 146 | /******************************************************************/ 147 | /* Display table elements */ 148 | /******************************************************************/ 149 | /* x0 contains the address of table */ 150 | displayTable: 151 | stp x1,lr,[sp,-16]! // save registers 152 | stp x2,x3,[sp,-16]! // save registers 153 | mov x2,x0 // table address 154 | mov x3,0 155 | 1: // loop display table 156 | ldr x0,[x2,x3,lsl 3] 157 | ldr x1,qAdrsZoneConv 158 | bl conversion10 // décimal conversion 159 | ldr x0,qAdrsMessResult 160 | ldr x1,qAdrsZoneConv 161 | bl strInsertAtCharInc // insert result at @ character 162 | bl affichageMess // display message 163 | add x3,x3,1 164 | cmp x3,NBELEMENTS - 1 165 | ble 1b 166 | ldr x0,qAdrszCarriageReturn 167 | bl affichageMess 168 | 100: 169 | ldp x2,x3,[sp],16 // restaur 2 registers 170 | ldp x1,lr,[sp],16 // restaur 2 registers 171 | ret // return to address lr x30 172 | /********************************************************/ 173 | /* File Include fonctions */ 174 | /********************************************************/ 175 | /* for this file see task include a file in language AArch64 assembly */ 176 | .include "../includeARM64.inc" 177 | -------------------------------------------------------------------------------- /sorters/selection_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Selection_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program selection_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | TableNumber: .quad 10,9,8,7,6,5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 44 | mov x2,NBELEMENTS // number of élements 45 | bl selectionSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* selection sort */ 102 | /******************************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains the first element */ 105 | /* x2 contains the number of element */ 106 | selectionSort: 107 | stp x1,lr,[sp,-16]! // save registers 108 | stp x2,x3,[sp,-16]! // save registers 109 | stp x4,x5,[sp,-16]! // save registers 110 | stp x6,x7,[sp,-16]! // save registers 111 | mov x3,x1 // start index i 112 | sub x7,x2,1 // compute n - 1 113 | 1: // start loop 114 | mov x4,x3 115 | add x5,x3,1 // init index 2 116 | 2: 117 | ldr x1,[x0,x4,lsl 3] // load value A[mini] 118 | ldr x6,[x0,x5,lsl 3] // load value A[j] 119 | cmp x6,x1 // compare value 120 | csel x4,x5,x4,lt // j -> mini 121 | add x5,x5,1 // increment index j 122 | cmp x5,x2 // end ? 123 | blt 2b // no -> loop 124 | cmp x4,x3 // mini <> j ? 125 | beq 3f // no 126 | ldr x1,[x0,x4,lsl 3] // yes swap A[i] A[mini] 127 | ldr x6,[x0,x3,lsl 3] 128 | str x1,[x0,x3,lsl 3] 129 | str x6,[x0,x4,lsl 3] 130 | 3: 131 | add x3,x3,1 // increment i 132 | cmp x3,x7 // end ? 133 | blt 1b // no -> loop 134 | 135 | 100: 136 | ldp x6,x7,[sp],16 // restaur 2 registers 137 | ldp x4,x5,[sp],16 // restaur 2 registers 138 | ldp x2,x3,[sp],16 // restaur 2 registers 139 | ldp x1,lr,[sp],16 // restaur 2 registers 140 | ret // return to address lr x30 141 | 142 | /******************************************************************/ 143 | /* Display table elements */ 144 | /******************************************************************/ 145 | /* x0 contains the address of table */ 146 | displayTable: 147 | stp x1,lr,[sp,-16]! // save registers 148 | stp x2,x3,[sp,-16]! // save registers 149 | mov x2,x0 // table address 150 | mov x3,0 151 | 1: // loop display table 152 | ldr x0,[x2,x3,lsl 3] 153 | ldr x1,qAdrsZoneConv 154 | bl conversion10 // décimal conversion 155 | ldr x0,qAdrsMessResult 156 | ldr x1,qAdrsZoneConv 157 | bl strInsertAtCharInc // insert result at @ character 158 | bl affichageMess // display message 159 | add x3,x3,1 160 | cmp x3,NBELEMENTS - 1 161 | ble 1b 162 | ldr x0,qAdrszCarriageReturn 163 | bl affichageMess 164 | 100: 165 | ldp x2,x3,[sp],16 // restaur 2 registers 166 | ldp x1,lr,[sp],16 // restaur 2 registers 167 | ret // return to address lr x30 168 | /********************************************************/ 169 | /* File Include fonctions */ 170 | /********************************************************/ 171 | /* for this file see task include a file in language AArch64 assembly */ 172 | .include "../includeARM64.inc" 173 | -------------------------------------------------------------------------------- /sorters/radix_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Radix_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | * ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program radix_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | TableNumber: .quad 12485,301,16,25,5006,9,-154389710,26,4400,71,115 29 | #TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 // first element 44 | mov x2,NBELEMENTS // number of élements 45 | bl radixSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | 101 | /******************************************************************/ 102 | /* radix sort */ 103 | /******************************************************************/ 104 | /* r0 contains the address of table */ 105 | /* r1 contains the first element */ 106 | /* r2 contains the number of element */ 107 | /* no registers save */ 108 | radixSort: 109 | str lr,[sp,-16]! // save 1 register 110 | mov x7,0b1111 // mask one digit hexa 111 | mov x10,0 // digit counter 112 | 1: 113 | add x3,x1,1 // start index i 114 | 2: // start loop 115 | ldr x4,[x0,x3,lsl 3] // load value A[i] 116 | and x8,x4,x7 // and mask 117 | sub x5,x3,1 // index j 118 | 3: 119 | ldr x6,[x0,x5,lsl 3] // load value A[j] 120 | and x9,x6,x7 // and mask 121 | cmp x9,x8 // compare one digit hexa 122 | ble 4f 123 | add x5,x5,1 // increment index j 124 | str x6,[x0,x5,lsl 3] // store value A[j+1] 125 | sub x5,x5,2 // j = j - 1 126 | cmp x5,x1 127 | bge 3b // loop if j >= first item 128 | 4: 129 | add x5,x5,1 // increment index j 130 | str x4,[x0,x5,lsl 3] // store value A[i] in A[j+1] 131 | add x3,x3,1 // increment index i 132 | cmp x3,x2 // end ? 133 | blt 2b // no -> loop 134 | 135 | //bl displayTable 136 | lsl x7,x7,4 // shift mask 4 bits left 137 | add x10,x10,1 // increment counter 138 | cmp x10,16 // 16 digits ? 139 | blt 1b // no loop 140 | 100: 141 | 142 | ldr lr,[sp],16 // restaur 1 registers 143 | ret // return to address lr x30 144 | 145 | /******************************************************************/ 146 | /* Display table elements */ 147 | /******************************************************************/ 148 | /* x0 contains the address of table */ 149 | displayTable: 150 | stp x1,lr,[sp,-16]! // save registers 151 | stp x2,x3,[sp,-16]! // save registers 152 | mov x2,x0 // table address 153 | mov x3,0 154 | 1: // loop display table 155 | ldr x0,[x2,x3,lsl 3] 156 | ldr x1,qAdrsZoneConv 157 | bl conversion10S // décimal conversion 158 | ldr x0,qAdrsMessResult 159 | ldr x1,qAdrsZoneConv 160 | bl strInsertAtCharInc // insert result at // character 161 | bl affichageMess // display message 162 | add x3,x3,1 163 | cmp x3,NBELEMENTS - 1 164 | ble 1b 165 | ldr x0,qAdrszCarriageReturn 166 | bl affichageMess 167 | mov x0,x2 168 | 100: 169 | ldp x2,x3,[sp],16 // restaur 2 registers 170 | ldp x1,lr,[sp],16 // restaur 2 registers 171 | ret // return to address lr x30 172 | /********************************************************/ 173 | /* File Include fonctions */ 174 | /********************************************************/ 175 | /* for this file see task include a file in language AArch64 assembly */ 176 | .include "../includeARM64.inc" 177 | -------------------------------------------------------------------------------- /misc/josephus_problem.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Josephus_problem 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program josephus_problem.s */ 11 | /* run with josephus_problem maxi intervalle */ 12 | /* example : josephus_problem 41 3 13 | 14 | /*******************************************/ 15 | /* Constantes file */ 16 | /*******************************************/ 17 | /* for this file see task include a file in language AArch64 assembly*/ 18 | .include "../includeConstantesARM64.inc" 19 | 20 | .equ FIRSTNODE, 0 //identification first node 21 | 22 | /*******************************************/ 23 | /* Structures */ 24 | /********************************************/ 25 | /* structure linkedlist*/ 26 | .struct 0 27 | llist_next: // next element 28 | .struct llist_next + 8 29 | llist_value: // element value 30 | .struct llist_value + 8 31 | llist_fin: 32 | /*********************************/ 33 | /* Initialized data */ 34 | /*********************************/ 35 | .data 36 | szMessDebutPgm: .asciz "Start program.\n" 37 | szMessFinPgm: .asciz "Program End ok.\n" 38 | szRetourLigne: .asciz "\n" 39 | szMessValElement: .asciz "Value : @ \n" 40 | szMessListeVide: .asciz "List empty.\n" 41 | szMessImpElement: .asciz "Node display: @ Value : @ Next @ \n" 42 | szMessErrComm: .asciz "Incomplete Command line : josephus64 \n" 43 | /*********************************/ 44 | /* UnInitialized data */ 45 | /*********************************/ 46 | .bss 47 | sZoneConv: .skip 100 48 | .align 4 49 | qDebutListe1: .skip llist_fin 50 | /*********************************/ 51 | /* code section */ 52 | /*********************************/ 53 | .text 54 | .global main 55 | main: // entry of program 56 | mov fp,sp // copy stack address register x29 fp 57 | ldr x0,qAdrszMessDebutPgm 58 | bl affichageMess 59 | ldr x0,[fp] // parameter number command line 60 | cmp x0,#2 // correct ? 61 | ble erreurCommande // error 62 | 63 | add x0,fp,#16 // address parameter 2 64 | ldr x0,[x0] 65 | bl conversionAtoD 66 | add x22,x0,FIRSTNODE // save maxi 67 | add x0,fp,#24 // address parameter 3 68 | ldr x0,[x0] 69 | bl conversionAtoD 70 | mov x21,x0 // save gap 71 | 72 | mov x0,FIRSTNODE // create first node 73 | mov x1,0 74 | bl createNode 75 | mov x25,x0 // first node address 76 | mov x26,x0 77 | mov x24,FIRSTNODE + 1 78 | mov x23,1 79 | 1: // loop create others nodes 80 | mov x0,x24 // key value 81 | mov x1,0 82 | bl createNode 83 | str x0,[x26,llist_next] // store current node address in prev node 84 | mov x26,x0 85 | add x24,x24,1 86 | add x23,x23,1 87 | cmp x23,x22 // maxi ? 88 | blt 1b 89 | str x25,[x26,llist_next] // store first node address in last pointer 90 | mov x24,x26 91 | 2: 92 | mov x20,1 // counter for gap 93 | 3: 94 | ldr x24,[x24,llist_next] 95 | add x20,x20,1 96 | cmp x20,x21 // intervalle ? 97 | blt 3b 98 | ldr x25,[x24,llist_next] // removing the node from the list 99 | ldr x22,[x25,llist_value] 100 | ldr x27,[x25,llist_next] // load pointer next 101 | str x27,[x24,llist_next] // ans store in prev node 102 | //mov x0,x25 103 | //bl displayNode 104 | cmp x27,x24 105 | csel x24,x24,x27,ne // next node address 106 | bne 2b // and loop 107 | 108 | mov x0,x24 109 | bl displayNode // display last node 110 | 111 | b 100f 112 | erreurCommande: 113 | ldr x0,qAdrszMessErrComm 114 | bl affichageMess 115 | mov x0,#1 // error code 116 | b 100f 117 | 100: // program end standard 118 | ldr x0,qAdrszMessFinPgm 119 | bl affichageMess 120 | mov x0,0 // return code Ok 121 | mov x8,EXIT // system call "Exit" 122 | svc #0 123 | 124 | qAdrszMessDebutPgm: .quad szMessDebutPgm 125 | qAdrszMessFinPgm: .quad szMessFinPgm 126 | qAdrszRetourLigne: .quad szRetourLigne 127 | qAdrqDebutListe1: .quad qDebutListe1 128 | qAdrszMessErrComm: .quad szMessErrComm 129 | 130 | /******************************************************************/ 131 | /* create node */ 132 | /******************************************************************/ 133 | /* x0 contains key */ 134 | /* x1 contains zero or address next node */ 135 | /* x0 returns address heap node */ 136 | createNode: 137 | stp x20,lr,[sp,-16]! // save registres 138 | stp x21,x22,[sp,-16]! // save registres 139 | mov x20,x0 // save key 140 | mov x21,x1 // save key 141 | mov x0,#0 // allocation place heap 142 | mov x8,BRK // call system 'brk' 143 | svc #0 144 | mov x22,x0 // save address heap for node 145 | add x0,x0,llist_fin // reservation place node length 146 | mov x8,BRK // call system 'brk' 147 | svc #0 148 | cmp x0,#-1 // allocation error 149 | beq 100f 150 | 151 | str x20,[x22,llist_value] 152 | str x21,[x22,llist_next] 153 | mov x0,x22 154 | 100: 155 | ldp x21,x22,[sp],16 // restaur des 2 registres 156 | ldp x20,lr,[sp],16 // restaur des 2 registres 157 | ret // retour adresse lr x30 158 | 159 | /******************************************************************/ 160 | /* display infos node */ 161 | /******************************************************************/ 162 | /* x0 contains node address */ 163 | displayNode: 164 | stp x1,lr,[sp,-16]! // save registres 165 | stp x2,x3,[sp,-16]! // save registres 166 | mov x2,x0 167 | ldr x1,qAdrsZoneConv 168 | bl conversion16 169 | ldr x0,qAdrszMessImpElement 170 | ldr x1,qAdrsZoneConv 171 | bl strInsertAtCharInc 172 | mov x3,x0 173 | ldr x0,[x2,llist_value] 174 | ldr x1,qAdrsZoneConv 175 | bl conversion10S 176 | mov x0,x3 177 | ldr x1,qAdrsZoneConv 178 | bl strInsertAtCharInc 179 | mov x3,x0 180 | ldr x0,[x2,llist_next] 181 | ldr x1,qAdrsZoneConv 182 | bl conversion16 183 | mov x0,x3 184 | ldr x1,qAdrsZoneConv 185 | bl strInsertAtCharInc 186 | bl affichageMess 187 | 188 | 100: 189 | ldp x2,x3,[sp],16 // restaur des 2 registres 190 | ldp x1,lr,[sp],16 // restaur des 2 registres 191 | ret // retour adresse lr x30 192 | qAdrsZoneConv: .quad sZoneConv 193 | qAdrszMessImpElement: .quad szMessImpElement 194 | /********************************************************/ 195 | /* File Include fonctions */ 196 | /********************************************************/ 197 | /* for this file see task include a file in language AArch64 assembly */ 198 | .include "../includeARM64.inc" 199 | -------------------------------------------------------------------------------- /sorters/comb_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Comb_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program comb_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 44 | mov x2,NBELEMENTS // number of élements 45 | bl combSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* comb sort */ 102 | /******************************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains the first element */ 105 | /* x2 contains the number of element */ 106 | /* this routine use à factor to 1.28 see wikipedia for best factor */ 107 | combSort: 108 | stp x1,lr,[sp,-16]! // save registers 109 | stp x2,x3,[sp,-16]! // save registers 110 | stp x4,x5,[sp,-16]! // save registers 111 | stp x6,x7,[sp,-16]! // save registers 112 | stp x8,x9,[sp,-16]! // save registers 113 | sub x9,x2,x1 // compute gap 114 | sub x2,x2,1 // compute end index n - 1 115 | mov x7,100 116 | 1: // start loop 1 117 | mul x9,x7,x9 // gap multiply by 100 118 | lsr x9,x9,7 // divide by 128 119 | cmp x9,0 120 | mov x3,1 121 | csel x9,x9,x3,ne 122 | mov x3,x1 // start index 123 | mov x8,0 // swaps 124 | 2: // start loop 2 125 | add x4,x3,x9 // add gap to indice 126 | cmp x4,x2 127 | bgt 4f 128 | ldr x5,[x0,x3,lsl 3] // load value A[j] 129 | ldr x6,[x0,x4,lsl 3] // load value A[j+1] 130 | cmp x6,x5 // compare value 131 | bge 3f 132 | str x6,[x0,x3,lsl 3] // if smaller inversion 133 | str x5,[x0,x4,lsl 3] 134 | mov x8,1 // swaps 135 | 3: 136 | add x3,x3,1 // increment index j 137 | b 2b 138 | 139 | 4: 140 | //bl displayTable 141 | cmp x9,1 // gap = 1 ? 142 | bne 1b // no loop 143 | cmp x8,1 // swaps ? 144 | beq 1b // yes -> loop 1 145 | 146 | 100: 147 | ldp x8,x9,[sp],16 // restaur 2 registers 148 | ldp x6,x7,[sp],16 // restaur 2 registers 149 | ldp x4,x5,[sp],16 // restaur 2 registers 150 | ldp x2,x3,[sp],16 // restaur 2 registers 151 | ldp x1,lr,[sp],16 // restaur 2 registers 152 | ret // return to address lr x30 153 | 154 | /******************************************************************/ 155 | /* Display table elements */ 156 | /******************************************************************/ 157 | /* x0 contains the address of table */ 158 | displayTable: 159 | stp x1,lr,[sp,-16]! // save registers 160 | stp x2,x3,[sp,-16]! // save registers 161 | mov x2,x0 // table address 162 | mov x3,0 163 | 1: // loop display table 164 | ldr x0,[x2,x3,lsl 3] 165 | ldr x1,qAdrsZoneConv 166 | bl conversion10S // décimal conversion 167 | ldr x0,qAdrsMessResult 168 | ldr x1,qAdrsZoneConv 169 | bl strInsertAtCharInc // insert result at @ character 170 | bl affichageMess // display message 171 | add x3,x3,1 172 | cmp x3,NBELEMENTS - 1 173 | ble 1b 174 | ldr x0,qAdrszCarriageReturn 175 | bl affichageMess 176 | mov x0,x2 177 | 100: 178 | ldp x2,x3,[sp],16 // restaur 2 registers 179 | ldp x1,lr,[sp],16 // restaur 2 registers 180 | ret // return to address lr x30 181 | /********************************************************/ 182 | /* File Include fonctions */ 183 | /********************************************************/ 184 | /* for this file see task include a file in language AArch64 assembly */ 185 | .include "../includeARM64.inc" 186 | -------------------------------------------------------------------------------- /sorters/bogo_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Bogosort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program bogo_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | /*********************************/ 18 | /* Initialized data */ 19 | /*********************************/ 20 | .data 21 | sMessResult: .asciz "Value : @ \n" 22 | szCarriageReturn: .asciz "\n" 23 | 24 | .align 4 25 | qGraine: .quad 123456 26 | TableNumber: .quad 1,2,3,4,5,6,7,8,9,10 27 | .equ NBELEMENTS, (. - TableNumber) / 8 28 | 29 | /*********************************/ 30 | /* UnInitialized data */ 31 | /*********************************/ 32 | .bss 33 | sZoneConv: .skip 24 34 | /*********************************/ 35 | /* code section */ 36 | /*********************************/ 37 | .text 38 | .global main 39 | main: // entry of program 40 | 41 | 1: 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,#NBELEMENTS // number of élements 44 | bl knuthShuffle 45 | // table display elements 46 | ldr x0,qAdrTableNumber // address number table 47 | mov x1,#NBELEMENTS // number of élements 48 | bl displayTable 49 | 50 | ldr x0,qAdrTableNumber // address number table 51 | mov x1,#NBELEMENTS // number of élements 52 | bl isSorted // control sort 53 | cmp x0,#1 // sorted ? 54 | bne 1b // no -> loop 55 | 56 | 57 | 100: // standard end of the program 58 | mov x0, #0 // return code 59 | mov x8, #EXIT // request to exit program 60 | svc #0 // perform the system call 61 | 62 | qAdrszCarriageReturn: .quad szCarriageReturn 63 | qAdrsMessResult: .quad sMessResult 64 | qAdrTableNumber: .quad TableNumber 65 | 66 | /******************************************************************/ 67 | /* control sorted table */ 68 | /******************************************************************/ 69 | /* x0 contains the address of table */ 70 | /* x1 contains the number of elements > 0 */ 71 | /* x0 return 0 if not sorted 1 if sorted */ 72 | isSorted: 73 | stp x2,lr,[sp,-16]! // save registers 74 | stp x3,x4,[sp,-16]! // save registers 75 | mov x2,#0 76 | ldr x4,[x0,x2,lsl #3] // load A[0] 77 | 1: 78 | add x2,x2,#1 79 | cmp x2,x1 // end ? 80 | bge 99f 81 | ldr x3,[x0,x2, lsl #3] // load A[i] 82 | cmp x3,x4 // compare A[i],A[i-1] 83 | blt 98f // smaller -> error -> return 84 | mov x4,x3 // no -> A[i-1] = A[i] 85 | b 1b // and loop 86 | 98: 87 | mov x0,#0 // error 88 | b 100f 89 | 99: 90 | mov x0,#1 // ok -> return 91 | 100: 92 | ldp x2,x3,[sp],16 // restaur 2 registers 93 | ldp x1,lr,[sp],16 // restaur 2 registers 94 | ret // return to address lr x30 95 | /******************************************************************/ 96 | /* Display table elements */ 97 | /******************************************************************/ 98 | /* x0 contains the address of table */ 99 | /* x1 contains elements number */ 100 | displayTable: 101 | stp x1,lr,[sp,-16]! // save registers 102 | stp x2,x3,[sp,-16]! // save registers 103 | mov x2,x0 // table address 104 | mov x4,x1 // elements number 105 | mov x3,#0 106 | 1: // loop display table 107 | ldr x0,[x2,x3,lsl #3] 108 | ldr x1,qAdrsZoneConv 109 | bl conversion10 // décimal conversion 110 | ldr x0,qAdrsMessResult 111 | ldr x1,qAdrsZoneConv // insert conversion 112 | bl strInsertAtCharInc 113 | bl affichageMess // display message 114 | add x3,x3,#1 115 | cmp x3,x4 // end ? 116 | blt 1b // no -> loop 117 | ldr x0,qAdrszCarriageReturn 118 | bl affichageMess 119 | 100: 120 | ldp x2,x3,[sp],16 // restaur 2 registers 121 | ldp x1,lr,[sp],16 // restaur 2 registers 122 | ret // return to address lr x30 123 | qAdrsZoneConv: .quad sZoneConv 124 | /******************************************************************/ 125 | /* shuffle game */ 126 | /******************************************************************/ 127 | /* x0 contains boxs address */ 128 | /* x1 contains elements number */ 129 | knuthShuffle: 130 | stp x1,lr,[sp,-16]! // save registers 131 | stp x2,x3,[sp,-16]! // save registers 132 | stp x4,x5,[sp,-16]! // save registers 133 | mov x5,x0 // save table address 134 | mov x2,#0 // start index 135 | 1: 136 | mov x0,x2 // generate aleas 137 | bl genereraleas 138 | ldr x3,[x5,x2,lsl #3] // swap number on the table 139 | ldr x4,[x5,x0,lsl #3] 140 | str x4,[x5,x2,lsl #3] 141 | str x3,[x5,x0,lsl #3] 142 | add x2,x2,1 // next number 143 | cmp x2,x1 // end ? 144 | blt 1b // no -> loop 145 | 146 | 100: 147 | ldp x4,x5,[sp],16 // restaur 2 registers 148 | ldp x2,x3,[sp],16 // restaur 2 registers 149 | ldp x1,lr,[sp],16 // restaur 2 registers 150 | ret // return to address lr x30 151 | /***************************************************/ 152 | /* Generation random number */ 153 | /***************************************************/ 154 | /* x0 contains limit */ 155 | genereraleas: 156 | stp x1,lr,[sp,-16]! // save registers 157 | stp x2,x3,[sp,-16]! // save registers 158 | ldr x1,qAdrqGraine 159 | ldr x2,[x1] 160 | ldr x3,qNbDep1 161 | mul x2,x3,x2 162 | ldr x3,qNbDep2 163 | add x2,x2,x3 164 | str x2,[x1] // maj de la graine pour l appel suivant 165 | cmp x0,#0 166 | beq 100f 167 | udiv x3,x2,x0 168 | msub x0,x3,x0,x2 // résult = remainder 169 | 170 | 100: // end function 171 | ldp x2,x3,[sp],16 // restaur 2 registers 172 | ldp x1,lr,[sp],16 // restaur 2 registers 173 | ret // return to address lr x30 174 | qAdrqGraine: .quad qGraine 175 | qNbDep1: .quad 0x0019660d 176 | qNbDep2: .quad 0x3c6ef35f 177 | /********************************************************/ 178 | /* File Include fonctions */ 179 | /********************************************************/ 180 | /* for this file see task include a file in language AArch64 assembly */ 181 | .include "../includeARM64.inc" 182 | -------------------------------------------------------------------------------- /sorters/shell_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Shell_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program shell_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | //TableNumber: .quad 10,9,8,7,6,5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | 43 | 1: 44 | ldr x0,qAdrTableNumber // address number table 45 | mov x1,0 // not use in routine 46 | mov x2,NBELEMENTS // number of élements 47 | bl shellSort 48 | ldr x0,qAdrTableNumber // address number table 49 | bl displayTable 50 | 51 | ldr x0,qAdrTableNumber // address number table 52 | mov x1,#NBELEMENTS // number of élements 53 | bl isSorted // control sort 54 | cmp x0,#1 // sorted ? 55 | beq 2f 56 | ldr x0,qAdrszMessSortNok // no !! error sort 57 | bl affichageMess 58 | b 100f 59 | 2: // yes 60 | ldr x0,qAdrszMessSortOk 61 | bl affichageMess 62 | 100: // standard end of the program 63 | mov x0,0 // return code 64 | mov x8,EXIT // request to exit program 65 | svc 0 // perform the system call 66 | 67 | qAdrsZoneConv: .quad sZoneConv 68 | qAdrszCarriageReturn: .quad szCarriageReturn 69 | qAdrsMessResult: .quad sMessResult 70 | qAdrTableNumber: .quad TableNumber 71 | qAdrszMessSortOk: .quad szMessSortOk 72 | qAdrszMessSortNok: .quad szMessSortNok 73 | /******************************************************************/ 74 | /* control sorted table */ 75 | /******************************************************************/ 76 | /* x0 contains the address of table */ 77 | /* x1 contains the number of elements > 0 */ 78 | /* x0 return 0 if not sorted 1 if sorted */ 79 | isSorted: 80 | stp x1,lr,[sp,-16]! // save registers 81 | stp x2,x3,[sp,-16]! // save registers 82 | stp x4,x5,[sp,-16]! // save registers 83 | mov x2,0 84 | ldr x4,[x0,x2,lsl 3] 85 | 1: 86 | add x2,x2,1 87 | cmp x2,x1 88 | bge 99f 89 | ldr x3,[x0,x2, lsl 3] 90 | cmp x3,x4 91 | blt 98f 92 | mov x4,x3 93 | b 1b 94 | 98: 95 | mov x0,0 // error not sorted 96 | b 100f 97 | 99: 98 | mov x0,1 // sorted 99 | 100: 100 | ldp x4,x5,[sp],16 // restaur 2 registers 101 | ldp x2,x3,[sp],16 // restaur 2 registers 102 | ldp x1,lr,[sp],16 // restaur 2 registers 103 | ret // return to address lr x30 104 | /***************************************************/ 105 | /* shell Sort */ 106 | /***************************************************/ 107 | 108 | /* x0 contains the address of table */ 109 | /* x1 contains the first element but not use !! */ 110 | /* this routine use first element at index zero !!! */ 111 | /* x2 contains the number of element */ 112 | shellSort: 113 | stp x1,lr,[sp,-16]! // save registers 114 | stp x2,x3,[sp,-16]! // save registers 115 | stp x4,x5,[sp,-16]! // save registers 116 | stp x6,x7,[sp,-16]! // save registers 117 | sub x2,x2,1 // index last item 118 | mov x1,x2 // init gap = last item 119 | 1: // start loop 1 120 | lsr x1,x1,1 // gap = gap / 2 121 | cbz x1,100f // if gap = 0 -> end 122 | mov x3,x1 // init loop indice 1 123 | 2: // start loop 2 124 | ldr x4,[x0,x3,lsl 3] // load first value 125 | mov x5,x3 // init loop indice 2 126 | 3: // start loop 3 127 | cmp x5,x1 // indice < gap 128 | blt 4f // yes -> end loop 2 129 | sub x6,x5,x1 // index = indice - gap 130 | ldr x7,[x0,x6,lsl 3] // load second value 131 | cmp x4,x7 // compare values 132 | bge 4f 133 | str x7,[x0,x5,lsl 3] // store if < 134 | sub x5,x5,x1 // indice = indice - gap 135 | b 3b // and loop 136 | 4: // end loop 3 137 | str x4,[x0,x5,lsl 3] // store value 1 at indice 2 138 | add x3,x3,1 // increment indice 1 139 | cmp x3,x2 // end ? 140 | ble 2b // no -> loop 2 141 | b 1b // yes loop for new gap 142 | 143 | 100: // end function 144 | ldp x6,x7,[sp],16 // restaur 2 registers 145 | ldp x4,x5,[sp],16 // restaur 2 registers 146 | ldp x2,x3,[sp],16 // restaur 2 registers 147 | ldp x1,lr,[sp],16 // restaur 2 registers 148 | ret // return to address lr x30 149 | 150 | /******************************************************************/ 151 | /* Display table elements */ 152 | /******************************************************************/ 153 | /* x0 contains the address of table */ 154 | displayTable: 155 | stp x1,lr,[sp,-16]! // save registers 156 | stp x2,x3,[sp,-16]! // save registers 157 | mov x2,x0 // table address 158 | mov x3,0 159 | 1: // loop display table 160 | ldr x0,[x2,x3,lsl #3] 161 | ldr x1,qAdrsZoneConv // display value 162 | bl conversion10 // call function 163 | ldr x0,qAdrsMessResult 164 | ldr x1,qAdrsZoneConv 165 | bl strInsertAtCharInc // insert result at @ character 166 | bl affichageMess // display message 167 | add x3,x3,1 168 | cmp x3,#NBELEMENTS - 1 169 | ble 1b 170 | ldr x0,qAdrszCarriageReturn 171 | bl affichageMess 172 | 100: 173 | ldp x2,x3,[sp],16 // restaur 2 registers 174 | ldp x1,lr,[sp],16 // restaur 2 registers 175 | ret // return to address lr x30 176 | /********************************************************/ 177 | /* File Include fonctions */ 178 | /********************************************************/ 179 | /* for this file see task include a file in language AArch64 assembly */ 180 | .include "../includeARM64.inc" 181 | -------------------------------------------------------------------------------- /sorters/cocktail_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Cocktail_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program cocktail_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 29 | TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 44 | mov x2,NBELEMENTS // number of élements 45 | bl cocktailSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* cocktail sort */ 102 | /******************************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains the first element */ 105 | /* x2 contains the number of element */ 106 | cocktailSort: 107 | stp x1,lr,[sp,-16]! // save registers 108 | stp x2,x3,[sp,-16]! // save registers 109 | stp x4,x5,[sp,-16]! // save registers 110 | stp x6,x7,[sp,-16]! // save registers 111 | stp x8,x9,[sp,-16]! // save registers 112 | sub x2,x2,1 // compute i = n - 1 113 | 1: // start loop 1 114 | mov x3,x1 // start index 115 | mov x9,0 116 | sub x7,x2,1 117 | 2: // start loop 2 118 | add x4,x3,1 119 | ldr x5,[x0,x3,lsl 3] // load value A[j] 120 | ldr x6,[x0,x4,lsl 3] // load value A[j+1] 121 | cmp x6,x5 // compare value 122 | bge 3f 123 | str x6,[x0,x3,lsl 3] // if smaller inversion 124 | str x5,[x0,x4,lsl 3] 125 | mov x9,1 // top table not sorted 126 | 3: 127 | add x3,x3,1 // increment index j 128 | cmp x3,x7 // end ? 129 | ble 2b // no -> loop 2 130 | cmp x9,0 // table sorted ? 131 | beq 100f // yes -> end 132 | mov x9,0 133 | mov x3,x7 134 | 4: 135 | add x4,x3,1 136 | ldr x5,[x0,x3,lsl 3] // load value A[j] 137 | ldr x6,[x0,x4,lsl 3] // load value A[j+1] 138 | cmp x6,x5 // compare value 139 | bge 5f 140 | str x6,[x0,x3,lsl 3] // if smaller inversion 141 | str x5,[x0,x4,lsl 3] 142 | mov x9,1 // top table not sorted 143 | 5: 144 | sub x3,x3,1 // decrement index j 145 | cmp x3,x1 // end ? 146 | bge 4b // no -> loop 2 147 | 148 | cmp x9,0 // table sorted ? 149 | bne 1b // no -> loop 1 150 | 151 | 100: 152 | ldp x8,x9,[sp],16 // restaur 2 registers 153 | ldp x6,x7,[sp],16 // restaur 2 registers 154 | ldp x4,x5,[sp],16 // restaur 2 registers 155 | ldp x2,x3,[sp],16 // restaur 2 registers 156 | ldp x1,lr,[sp],16 // restaur 2 registers 157 | ret // return to address lr x30 158 | 159 | /******************************************************************/ 160 | /* Display table elements */ 161 | /******************************************************************/ 162 | /* x0 contains the address of table */ 163 | displayTable: 164 | stp x1,lr,[sp,-16]! // save registers 165 | stp x2,x3,[sp,-16]! // save registers 166 | mov x2,x0 // table address 167 | mov x3,0 168 | 1: // loop display table 169 | ldr x0,[x2,x3,lsl 3] 170 | ldr x1,qAdrsZoneConv 171 | bl conversion10S // décimal conversion 172 | ldr x0,qAdrsMessResult 173 | ldr x1,qAdrsZoneConv 174 | bl strInsertAtCharInc // insert result at @ character 175 | bl affichageMess // display message 176 | add x3,x3,1 177 | cmp x3,NBELEMENTS - 1 178 | ble 1b 179 | ldr x0,qAdrszCarriageReturn 180 | bl affichageMess 181 | 100: 182 | ldp x2,x3,[sp],16 // restaur 2 registers 183 | ldp x1,lr,[sp],16 // restaur 2 registers 184 | ret // return to address lr x30 185 | /********************************************************/ 186 | /* File Include fonctions */ 187 | /********************************************************/ 188 | /* for this file see task include a file in language AArch64 assembly */ 189 | .include "../includeARM64.inc" 190 | -------------------------------------------------------------------------------- /sorters/circle_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_Algorithms/Circle_Sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program circle_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | szMessSortBefore: .asciz "Display table before sort.\n" 25 | sMessResult: .asciz "Value : @ \n" 26 | szCarriageReturn: .asciz "\n" 27 | 28 | .align 4 29 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 30 | #TableNumber: .quad 1,2,3,4,5,6,7,8,9,10 31 | #TableNumber: .quad 9,5,12,8,2,12,6 32 | TableNumber: .quad 10,9,8,7,6,5,4,3,2,1 33 | .equ NBELEMENTS, (. - TableNumber) / 8 34 | /*********************************/ 35 | /* UnInitialized data */ 36 | /*********************************/ 37 | .bss 38 | sZoneConv: .skip 24 39 | /*********************************/ 40 | /* code section */ 41 | /*********************************/ 42 | .text 43 | .global main 44 | main: // entry of program 45 | ldr x0,qAdrszMessSortBefore 46 | bl affichageMess 47 | ldr x0,qAdrTableNumber // address number table 48 | bl displayTable 49 | 1: 50 | ldr x0,qAdrTableNumber // address number table 51 | mov x1,#0 52 | mov x2,#NBELEMENTS -1 // number of élements 53 | mov x3,#0 54 | bl circleSort 55 | cmp x0,#0 56 | bne 1b 57 | ldr x0,qAdrTableNumber // address number table 58 | mov x1,#NBELEMENTS // number of élements 59 | bl displayTable 60 | 61 | ldr x0,qAdrTableNumber // address number table 62 | mov x1,#NBELEMENTS // number of élements 63 | bl isSorted // control sort 64 | cmp x0,#1 // sorted ? 65 | beq 2f 66 | ldr x0,qAdrszMessSortNok // no !! error sort 67 | bl affichageMess 68 | b 100f 69 | 2: // yes 70 | ldr x0,qAdrszMessSortOk 71 | bl affichageMess 72 | 100: // standard end of the program 73 | mov x0, #0 // return code 74 | mov x8, #EXIT // request to exit program 75 | svc #0 // perform the system call 76 | 77 | qAdrszCarriageReturn: .quad szCarriageReturn 78 | qAdrsMessResult: .quad sMessResult 79 | qAdrTableNumber: .quad TableNumber 80 | qAdrszMessSortOk: .quad szMessSortOk 81 | qAdrszMessSortNok: .quad szMessSortNok 82 | qAdrszMessSortBefore: .quad szMessSortBefore 83 | /******************************************************************/ 84 | /* control sorted table */ 85 | /******************************************************************/ 86 | /* x0 contains the address of table */ 87 | /* x1 contains the number of elements > 0 */ 88 | /* x0 return 0 if not sorted 1 if sorted */ 89 | isSorted: 90 | stp x2,lr,[sp,-16]! // save registers 91 | stp x3,x4,[sp,-16]! // save registers 92 | mov x2,#0 93 | ldr x4,[x0,x2,lsl #3] 94 | 1: 95 | add x2,x2,#1 96 | cmp x2,x1 97 | bge 99f 98 | ldr x3,[x0,x2, lsl #3] 99 | cmp x3,x4 100 | blt 98f // smaller -> error 101 | mov x4,x3 // A[i-1] = A[i] 102 | b 1b // else loop 103 | 98: 104 | mov x0,#0 // error 105 | b 100f 106 | 99: 107 | mov x0,#1 // ok -> return 108 | 100: 109 | ldp x2,x3,[sp],16 // restaur 2 registers 110 | ldp x1,lr,[sp],16 // restaur 2 registers 111 | ret // return to address lr x30 112 | /******************************************************************/ 113 | /* circle sort */ 114 | /******************************************************************/ 115 | /* x0 contains the address of table */ 116 | /* x1 contains the first index */ 117 | /* x2 contains the last index */ 118 | /* x3 contains number of swaps */ 119 | circleSort: 120 | stp x1,lr,[sp,-16]! // save registers 121 | stp x2,x3,[sp,-16]! // save registers 122 | stp x4,x5,[sp,-16]! // save registers 123 | stp x6,x7,[sp,-16]! // save registers 124 | stp x8,x9,[sp,-16]! // save registers 125 | stp x10,x11,[sp,-16]! // save registers 126 | cmp x1,x2 127 | beq 99f 128 | mov x7,x0 // save address 129 | mov x8,x1 // low 130 | mov x9,x2 // high 131 | sub x4,x2,x1 132 | lsr x4,x4,#1 133 | mov x10,x4 // mid 134 | 1: // start loop 135 | cmp x1,x2 136 | bge 3f 137 | ldr x5,[x0,x1,lsl #3] 138 | ldr x6,[x0,x2,lsl #3] 139 | cmp x5,x6 140 | ble 2f 141 | str x6,[x0,x1,lsl #3] // swap values 142 | str x5,[x0,x2,lsl #3] 143 | add x3,x3,#1 144 | 2: 145 | add x1,x1,#1 // increment lo 146 | sub x2,x2,#1 // decrement hi 147 | b 1b // and loop 148 | 3: 149 | cmp x1,x2 // compare lo hi 150 | bne 4f // not egal 151 | ldr x5,[x0,x1,lsl #3] 152 | add x2,x2,#1 153 | ldr x6,[x0,x2,lsl #3] 154 | cmp x5,x6 155 | ble 4f 156 | str x6,[x0,x1,lsl #3] // swap 157 | str x5,[x0,x2,lsl #3] 158 | add x3,x3,#1 159 | 4: 160 | mov x1,x8 // low 161 | mov x2,x10 // mid 162 | add x2,x2,x1 163 | bl circleSort 164 | mov x3,x0 // swaps 165 | mov x0,x7 // table address 166 | mov x1,x8 // low 167 | mov x2,x10 // mid 168 | add x1,x2,x1 169 | add x1,x1,#1 170 | mov x2,x9 // high 171 | bl circleSort 172 | mov x3,x0 // swaps 173 | 99: 174 | mov x0,x3 // return number swaps 175 | 100: 176 | ldp x10,x11,[sp],16 // restaur 2 registers 177 | ldp x8,x9,[sp],16 // restaur 2 registers 178 | ldp x6,x7,[sp],16 // restaur 2 registers 179 | ldp x4,x5,[sp],16 // restaur 2 registers 180 | ldp x2,x3,[sp],16 // restaur 2 registers 181 | ldp x1,lr,[sp],16 // restaur 2 registers 182 | ret // return to address lr x30 183 | /******************************************************************/ 184 | /* Display table elements */ 185 | /******************************************************************/ 186 | /* x0 contains the address of table */ 187 | displayTable: 188 | stp x1,lr,[sp,-16]! // save registers 189 | stp x2,x3,[sp,-16]! // save registers 190 | mov x2,x0 // table address 191 | mov x3,#0 192 | 1: // loop display table 193 | ldr x0,[x2,x3,lsl #3] 194 | ldr x1,qAdrsZoneConv 195 | bl conversion10 // décimal conversion 196 | ldr x0,qAdrsMessResult 197 | ldr x1,qAdrsZoneConv // insert conversion 198 | bl strInsertAtCharInc 199 | bl affichageMess // display message 200 | add x3,x3,#1 201 | cmp x3,#NBELEMENTS - 1 202 | ble 1b 203 | ldr x0,qAdrszCarriageReturn 204 | bl affichageMess 205 | 100: 206 | ldp x2,x3,[sp],16 // restaur 2 registers 207 | ldp x1,lr,[sp],16 // restaur 2 registers 208 | ret // return to address lr x30 209 | qAdrsZoneConv: .quad sZoneConv 210 | /********************************************************/ 211 | /* File Include fonctions */ 212 | /********************************************************/ 213 | /* for this file see task include a file in language AArch64 assembly */ 214 | .include "../includeARM64.inc" 215 | -------------------------------------------------------------------------------- /sorters/quick_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Quicksort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program quick_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | TableNumber: .quad 1,3,6,2,5,9,10,8,4,7,11 29 | #TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 // first element 44 | mov x2,NBELEMENTS // number of élements 45 | bl quickSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /***************************************************/ 101 | /* Appel récursif Tri Rapide quicksort */ 102 | /***************************************************/ 103 | /* x0 contains the address of table */ 104 | /* x1 contains index of first item */ 105 | /* x2 contains the number of elements > 0 */ 106 | quickSort: 107 | stp x2,lr,[sp,-16]! // save registers 108 | stp x3,x4,[sp,-16]! // save registers 109 | str x5, [sp,-16]! // save registers 110 | sub x2,x2,1 // last item index 111 | cmp x1,x2 // first > last ? 112 | bge 100f // yes -> end 113 | mov x4,x0 // save x0 114 | mov x5,x2 // save x2 115 | bl partition1 // cutting into 2 parts 116 | mov x2,x0 // index partition 117 | mov x0,x4 // table address 118 | bl quickSort // sort lower part 119 | add x1,x2,1 // index begin = index partition + 1 120 | add x2,x5,1 // number of elements 121 | bl quickSort // sort higter part 122 | 123 | 100: // end function 124 | ldr x5, [sp],16 // restaur 1 register 125 | ldp x3,x4,[sp],16 // restaur 2 registers 126 | ldp x2,lr,[sp],16 // restaur 2 registers 127 | ret // return to address lr x30 128 | 129 | /******************************************************************/ 130 | /* Partition table elements */ 131 | /******************************************************************/ 132 | /* x0 contains the address of table */ 133 | /* x1 contains index of first item */ 134 | /* x2 contains index of last item */ 135 | partition1: 136 | stp x1,lr,[sp,-16]! // save registers 137 | stp x2,x3,[sp,-16]! // save registers 138 | stp x4,x5,[sp,-16]! // save registers 139 | stp x6,x7,[sp,-16]! // save registers 140 | ldr x3,[x0,x2,lsl 3] // load value last index 141 | mov x4,x1 // init with first index 142 | mov x5,x1 // init with first index 143 | 1: // begin loop 144 | ldr x6,[x0,x5,lsl 3] // load value 145 | cmp x6,x3 // compare value 146 | bge 2f 147 | ldr x7,[x0,x4,lsl 3] // if < swap value table 148 | str x6,[x0,x4,lsl 3] 149 | str x7,[x0,x5,lsl 3] 150 | add x4,x4,1 // and increment index 1 151 | 2: 152 | add x5,x5,1 // increment index 2 153 | cmp x5,x2 // end ? 154 | blt 1b // no loop 155 | ldr x7,[x0,x4,lsl 3] // swap value 156 | str x3,[x0,x4,lsl 3] 157 | str x7,[x0,x2,lsl 3] 158 | mov x0,x4 // return index partition 159 | 100: 160 | ldp x6,x7,[sp],16 // restaur 2 registers 161 | ldp x4,x5,[sp],16 // restaur 2 registers 162 | ldp x2,x3,[sp],16 // restaur 2 registers 163 | ldp x1,lr,[sp],16 // restaur 2 registers 164 | ret // return to address lr x30 165 | 166 | /******************************************************************/ 167 | /* Display table elements */ 168 | /******************************************************************/ 169 | /* x0 contains the address of table */ 170 | displayTable: 171 | stp x1,lr,[sp,-16]! // save registers 172 | stp x2,x3,[sp,-16]! // save registers 173 | mov x2,x0 // table address 174 | mov x3,0 175 | 1: // loop display table 176 | ldr x0,[x2,x3,lsl 3] 177 | ldr x1,qAdrsZoneConv 178 | bl conversion10S // décimal conversion 179 | ldr x0,qAdrsMessResult 180 | ldr x1,qAdrsZoneConv 181 | bl strInsertAtCharInc // insert result at // character 182 | bl affichageMess // display message 183 | add x3,x3,1 184 | cmp x3,NBELEMENTS - 1 185 | ble 1b 186 | ldr x0,qAdrszCarriageReturn 187 | bl affichageMess 188 | mov x0,x2 189 | 100: 190 | ldp x2,x3,[sp],16 // restaur 2 registers 191 | ldp x1,lr,[sp],16 // restaur 2 registers 192 | ret // return to address lr x30 193 | /********************************************************/ 194 | /* File Include fonctions */ 195 | /********************************************************/ 196 | /* for this file see task include a file in language AArch64 assembly */ 197 | .include "../includeARM64.inc" 198 | -------------------------------------------------------------------------------- /sorters/bead_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Bead_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program bead_sort.s */ 11 | /* En français tri par gravité ou tri par bille (ne pas confondre 12 | avec tri par bulle (bubble sort)) */ 13 | 14 | /*******************************************/ 15 | /* Constantes file */ 16 | /*******************************************/ 17 | /* for this file see task include a file in language AArch64 assembly*/ 18 | .include "../includeConstantesARM64.inc" 19 | 20 | /*********************************/ 21 | /* Initialized data */ 22 | /*********************************/ 23 | .data 24 | szMessSortOk: .asciz "Table sorted.\n" 25 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 26 | sMessResult: .asciz "Value : @ \n" 27 | szCarriageReturn: .asciz "\n" 28 | 29 | .align 4 30 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 31 | TableNumber: .quad 10,9,8,7,6,5,4,3,2,1 32 | .equ NBELEMENTS, (. - TableNumber) / 8 33 | //.equ NBELEMENTS, 4 // for others tests 34 | /*********************************/ 35 | /* UnInitialized data */ 36 | /*********************************/ 37 | .bss 38 | sZoneConv: .skip 24 39 | /*********************************/ 40 | /* code section */ 41 | /*********************************/ 42 | .text 43 | .global main 44 | main: // entry of program 45 | 46 | 1: 47 | ldr x0,qAdrTableNumber // address number table 48 | mov x1,#NBELEMENTS // number of élements 49 | bl beadSort 50 | ldr x0,qAdrTableNumber // address number table 51 | mov x1,#NBELEMENTS // number of élements 52 | bl displayTable 53 | 54 | ldr x0,qAdrTableNumber // address number table 55 | mov x1,#NBELEMENTS // number of élements 56 | bl isSorted // control sort 57 | cmp x0,#1 // sorted ? 58 | beq 2f 59 | ldr x0,qAdrszMessSortNok // no !! error sort 60 | bl affichageMess 61 | b 100f 62 | 2: // yes 63 | ldr x0,qAdrszMessSortOk 64 | bl affichageMess 65 | 100: // standard end of the program 66 | mov x0, #0 // return code 67 | mov x8, #EXIT // request to exit program 68 | svc #0 // perform the system call 69 | 70 | qAdrszCarriageReturn: .quad szCarriageReturn 71 | qAdrsMessResult: .quad sMessResult 72 | qAdrTableNumber: .quad TableNumber 73 | qAdrszMessSortOk: .quad szMessSortOk 74 | qAdrszMessSortNok: .quad szMessSortNok 75 | /******************************************************************/ 76 | /* control sorted table */ 77 | /******************************************************************/ 78 | /* x0 contains the address of table */ 79 | /* x1 contains the number of elements > 0 */ 80 | /* x0 return 0 if not sorted 1 if sorted */ 81 | isSorted: 82 | stp x2,lr,[sp,-16]! // save registers 83 | stp x3,x4,[sp,-16]! // save registers 84 | mov x2,#0 85 | ldr x4,[x0,x2,lsl #3] // load A[0] 86 | 1: 87 | add x2,x2,#1 88 | cmp x2,x1 // end ? 89 | bge 99f 90 | ldr x3,[x0,x2, lsl #3] // load A[i] 91 | cmp x3,x4 // compare A[i],A[i-1] 92 | blt 98f // smaller -> error -> return 93 | mov x4,x3 // no -> A[i-1] = A[i] 94 | b 1b // and loop 95 | 98: 96 | mov x0,#0 // error 97 | b 100f 98 | 99: 99 | mov x0,#1 // ok -> return 100 | 100: 101 | ldp x2,x3,[sp],16 // restaur 2 registers 102 | ldp x1,lr,[sp],16 // restaur 2 registers 103 | ret // return to address lr x30 104 | /******************************************************************/ 105 | /* bead sort */ 106 | /******************************************************************/ 107 | /* x0 contains the address of table */ 108 | /* x1 contains the number of element */ 109 | /* Caution registers x2-x12 are not saved */ 110 | beadSort: 111 | stp x1,lr,[sp,-16]! // save registers 112 | mov x12,x1 // save elements number 113 | //search max 114 | ldr x10,[x0] // load value A[0] in max 115 | mov x4,#1 116 | 1: // loop search max 117 | cmp x4,x12 // end ? 118 | bge 21f // yes 119 | ldr x2,[x0,x4,lsl #3] // load value A[i] 120 | cmp x2,x10 // compare with max 121 | csel x10,x2,x10,gt // if greather 122 | add x4,x4,#1 123 | b 1b // loop 124 | 21: 125 | mul x5,x10,x12 // max * elements number 126 | lsl x5,x5,#3 // 8 bytes for each number 127 | sub sp,sp,x5 // allocate on the stack 128 | mov fp,sp // frame pointer = stack address 129 | // marks beads 130 | mov x3,x0 // save table address 131 | mov x0,#0 // start index x 132 | 2: 133 | mov x1,#0 // index y 134 | ldr x8,[x3,x0,lsl #3] // load A[x] 135 | mul x6,x0,x10 // compute bead x 136 | 3: 137 | add x9,x6,x1 // compute bead y 138 | mov x4,#1 // value to store 139 | str x4,[fp,x9,lsl #3] // store to stack area 140 | add x1,x1,#1 141 | cmp x1,x8 142 | blt 3b 143 | 31: // init to zéro the bead end 144 | cmp x1,x10 // max ? 145 | bge 32f 146 | add x9,x6,x1 // compute bead y 147 | mov x4,#0 148 | str x4,[fp,x9,lsl #3] 149 | add x1,x1,#1 150 | b 31b 151 | 32: 152 | add x0,x0,#1 // increment x 153 | cmp x0,x12 // end ? 154 | blt 2b 155 | // count beads 156 | mov x1,#0 // y 157 | 4: 158 | mov x0,#0 // start index x 159 | mov x8,#0 // sum 160 | 5: 161 | mul x6,x0,x10 // compute bead x 162 | add x9,x6,x1 // compute bead y 163 | ldr x4,[fp,x9,lsl #3] 164 | add x8,x8,x4 165 | mov x4,#0 166 | str x4,[fp,x9,lsl #3] // raz bead 167 | add x0,x0,#1 168 | cmp x0,x12 169 | blt 5b 170 | sub x0,x12,x8 // compute end - sum 171 | 6: 172 | mul x6,x0,x10 // compute bead x 173 | add x9,x6,x1 // compute bead y 174 | mov x4,#1 175 | str x4,[fp,x9,lsl #3] // store new bead at end 176 | add x0,x0,#1 177 | cmp x0,x12 178 | blt 6b 179 | 180 | add x1,x1,#1 181 | cmp x1,x10 182 | blt 4b 183 | 184 | // final compute 185 | mov x0,#0 // start index x 186 | 7: 187 | mov x1,#0 // start index y 188 | mul x6,x0,x10 // compute bead x 189 | 8: 190 | add x9,x6,x1 // compute bead y 191 | ldr x4,[fp,x9,lsl #3] // load bead [x,y] 192 | add x1,x1,#1 // add to x1 before str (index start at zéro) 193 | cmp x4,#1 194 | bne 9f 195 | str x1,[x3,x0, lsl #3] // store A[x] 196 | 9: 197 | cmp x1,x10 // compare max 198 | blt 8b 199 | add x0,x0,#1 200 | cmp x0,x12 // end ? 201 | blt 7b 202 | 203 | mov x0,#0 204 | add sp,sp,x5 // stack alignement 205 | 100: 206 | ldp x1,lr,[sp],16 // restaur 2 registers 207 | ret // return to address lr x30 208 | /******************************************************************/ 209 | /* Display table elements */ 210 | /******************************************************************/ 211 | /* x0 contains the address of table */ 212 | /* x1 contains elements number */ 213 | displayTable: 214 | stp x1,lr,[sp,-16]! // save registers 215 | stp x2,x3,[sp,-16]! // save registers 216 | mov x2,x0 // table address 217 | mov x4,x1 // elements number 218 | mov x3,#0 219 | 1: // loop display table 220 | ldr x0,[x2,x3,lsl #3] 221 | ldr x1,qAdrsZoneConv 222 | bl conversion10 // décimal conversion 223 | ldr x0,qAdrsMessResult 224 | ldr x1,qAdrsZoneConv // insert conversion 225 | bl strInsertAtCharInc 226 | bl affichageMess // display message 227 | add x3,x3,#1 228 | cmp x3,x4 // end ? 229 | blt 1b // no -> loop 230 | ldr x0,qAdrszCarriageReturn 231 | bl affichageMess 232 | 100: 233 | ldp x2,x3,[sp],16 // restaur 2 registers 234 | ldp x1,lr,[sp],16 // restaur 2 registers 235 | ret // return to address lr x30 236 | qAdrsZoneConv: .quad sZoneConv 237 | 238 | /********************************************************/ 239 | /* File Include fonctions */ 240 | /********************************************************/ 241 | /* for this file see task include a file in language AArch64 assembly */ 242 | .include "../includeARM64.inc" 243 | -------------------------------------------------------------------------------- /sorters/merge_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program merge_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | TableNumber: .quad 1,3,11,6,2,5,9,10,8,4,7 29 | #TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 30 | .equ NBELEMENTS, (. - TableNumber) / 8 31 | /*********************************/ 32 | /* UnInitialized data */ 33 | /*********************************/ 34 | .bss 35 | sZoneConv: .skip 24 36 | /*********************************/ 37 | /* code section */ 38 | /*********************************/ 39 | .text 40 | .global main 41 | main: // entry of program 42 | ldr x0,qAdrTableNumber // address number table 43 | mov x1,0 // first element 44 | mov x2,NBELEMENTS // number of élements 45 | bl mergeSort 46 | ldr x0,qAdrTableNumber // address number table 47 | bl displayTable 48 | 49 | ldr x0,qAdrTableNumber // address number table 50 | mov x1,NBELEMENTS // number of élements 51 | bl isSorted // control sort 52 | cmp x0,1 // sorted ? 53 | beq 1f 54 | ldr x0,qAdrszMessSortNok // no !! error sort 55 | bl affichageMess 56 | b 100f 57 | 1: // yes 58 | ldr x0,qAdrszMessSortOk 59 | bl affichageMess 60 | 100: // standard end of the program 61 | mov x0,0 // return code 62 | mov x8,EXIT // request to exit program 63 | svc 0 // perform the system call 64 | 65 | qAdrsZoneConv: .quad sZoneConv 66 | qAdrszCarriageReturn: .quad szCarriageReturn 67 | qAdrsMessResult: .quad sMessResult 68 | qAdrTableNumber: .quad TableNumber 69 | qAdrszMessSortOk: .quad szMessSortOk 70 | qAdrszMessSortNok: .quad szMessSortNok 71 | /******************************************************************/ 72 | /* control sorted table */ 73 | /******************************************************************/ 74 | /* x0 contains the address of table */ 75 | /* x1 contains the number of elements > 0 */ 76 | /* x0 return 0 if not sorted 1 if sorted */ 77 | isSorted: 78 | stp x2,lr,[sp,-16]! // save registers 79 | stp x3,x4,[sp,-16]! // save registers 80 | mov x2,0 81 | ldr x4,[x0,x2,lsl 3] 82 | 1: 83 | add x2,x2,1 84 | cmp x2,x1 85 | bge 99f 86 | ldr x3,[x0,x2, lsl 3] 87 | cmp x3,x4 88 | blt 98f 89 | mov x4,x3 90 | b 1b 91 | 98: 92 | mov x0,0 // not sorted 93 | b 100f 94 | 99: 95 | mov x0,1 // sorted 96 | 100: 97 | ldp x3,x4,[sp],16 // restaur 2 registers 98 | ldp x2,lr,[sp],16 // restaur 2 registers 99 | ret // return to address lr x30 100 | /******************************************************************/ 101 | /* merge */ 102 | /******************************************************************/ 103 | /* r0 contains the address of table */ 104 | /* r1 contains first start index 105 | /* r2 contains second start index */ 106 | /* r3 contains the last index */ 107 | merge: 108 | stp x1,lr,[sp,-16]! // save registers 109 | stp x2,x3,[sp,-16]! // save registers 110 | stp x4,x5,[sp,-16]! // save registers 111 | stp x6,x7,[sp,-16]! // save registers 112 | str x8,[sp,-16]! 113 | mov x5,x2 // init index x2->x5 114 | 1: // begin loop first section 115 | ldr x6,[x0,x1,lsl 3] // load value first section index r1 116 | ldr x7,[x0,x5,lsl 3] // load value second section index r5 117 | cmp x6,x7 118 | ble 4f // <= -> location first section OK 119 | str x7,[x0,x1,lsl 3] // store value second section in first section 120 | add x8,x5,1 121 | cmp x8,x3 // end second section ? 122 | ble 2f 123 | str x6,[x0,x5,lsl 3] 124 | b 4f // loop 125 | 2: // loop insert element part 1 into part 2 126 | sub x4,x8,1 127 | ldr x7,[x0,x8,lsl 3] // load value 2 128 | cmp x6,x7 // value < 129 | bge 3f 130 | str x6,[x0,x4,lsl 3] // store value 131 | b 4f // loop 132 | 3: 133 | str x7,[x0,x4,lsl 3] // store value 2 134 | add x8,x8,1 135 | cmp x8,x3 // end second section ? 136 | ble 2b // no loop 137 | sub x8,x8,1 138 | str x6,[x0,x8,lsl 3] // store value 1 139 | 4: 140 | add x1,x1,1 141 | cmp x1,x2 // end first section ? 142 | blt 1b 143 | 144 | 100: 145 | ldr x8,[sp],16 // restaur 1 register 146 | ldp x6,x7,[sp],16 // restaur 2 registers 147 | ldp x4,x5,[sp],16 // restaur 2 registers 148 | ldp x2,x3,[sp],16 // restaur 2 registers 149 | ldp x1,lr,[sp],16 // restaur 2 registers 150 | ret // return to address lr x30 151 | /******************************************************************/ 152 | /* merge sort */ 153 | /******************************************************************/ 154 | /* x0 contains the address of table */ 155 | /* x1 contains the index of first element */ 156 | /* x2 contains the number of element */ 157 | mergeSort: 158 | stp x3,lr,[sp,-16]! // save registers 159 | stp x4,x5,[sp,-16]! // save registers 160 | stp x6,x7,[sp,-16]! // save registers 161 | cmp x2,2 // end ? 162 | blt 100f 163 | lsr x4,x2,1 // number of element of each subset 164 | add x5,x4,1 165 | tst x2,#1 // odd ? 166 | csel x4,x5,x4,ne 167 | mov x5,x1 // save first element 168 | mov x6,x2 // save number of element 169 | mov x7,x4 // save number of element of each subset 170 | mov x2,x4 171 | bl mergeSort 172 | mov x1,x7 // restaur number of element of each subset 173 | mov x2,x6 // restaur number of element 174 | sub x2,x2,x1 175 | mov x3,x5 // restaur first element 176 | add x1,x1,x3 // + 1 177 | bl mergeSort // sort first subset 178 | mov x1,x5 // restaur first element 179 | mov x2,x7 // restaur number of element of each subset 180 | add x2,x2,x1 181 | mov x3,x6 // restaur number of element 182 | add x3,x3,x1 183 | sub x3,x3,1 // last index 184 | bl merge 185 | 100: 186 | ldp x6,x7,[sp],16 // restaur 2 registers 187 | ldp x4,x5,[sp],16 // restaur 2 registers 188 | ldp x3,lr,[sp],16 // restaur 2 registers 189 | ret // return to address lr x30 190 | 191 | /******************************************************************/ 192 | /* Display table elements */ 193 | /******************************************************************/ 194 | /* x0 contains the address of table */ 195 | displayTable: 196 | stp x1,lr,[sp,-16]! // save registers 197 | stp x2,x3,[sp,-16]! // save registers 198 | mov x2,x0 // table address 199 | mov x3,0 200 | 1: // loop display table 201 | ldr x0,[x2,x3,lsl 3] 202 | ldr x1,qAdrsZoneConv 203 | bl conversion10S // décimal conversion 204 | ldr x0,qAdrsMessResult 205 | ldr x1,qAdrsZoneConv 206 | bl strInsertAtCharInc // insert result at // character 207 | bl affichageMess // display message 208 | add x3,x3,1 209 | cmp x3,NBELEMENTS - 1 210 | ble 1b 211 | ldr x0,qAdrszCarriageReturn 212 | bl affichageMess 213 | mov x0,x2 214 | 100: 215 | ldp x2,x3,[sp],16 // restaur 2 registers 216 | ldp x1,lr,[sp],16 // restaur 2 registers 217 | ret // return to address lr x30 218 | /********************************************************/ 219 | /* File Include fonctions */ 220 | /********************************************************/ 221 | /* for this file see task include a file in language AArch64 assembly */ 222 | .include "../includeARM64.inc" 223 | -------------------------------------------------------------------------------- /sorters/counting_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Counting_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program counting_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | szCarriageReturn: .asciz "\n" 26 | 27 | .align 4 28 | #Caution : number strictly positive and not too big 29 | TableNumber: .quad 1,3,6,2,5,9,10,8,4,5 30 | //TableNumber: .quad 10,9,8,7,6,5,4,3,2,1 31 | .equ NBELEMENTS, (. - TableNumber) / 8 32 | /*********************************/ 33 | /* UnInitialized data */ 34 | /*********************************/ 35 | .bss 36 | sZoneConv: .skip 24 37 | /*********************************/ 38 | /* code section */ 39 | /*********************************/ 40 | .text 41 | .global main 42 | main: // entry of program 43 | ldr x0,qAdrTableNumber // address number table 44 | mov x1,NBELEMENTS // number of élements 45 | bl searchMinMax 46 | mov x3,NBELEMENTS 47 | bl countSort 48 | ldr x0,qAdrTableNumber // address number table 49 | bl displayTable 50 | 51 | ldr x0,qAdrTableNumber // address number table 52 | mov x1,NBELEMENTS // number of élements 53 | bl isSorted // control sort 54 | cmp x0,1 // sorted ? 55 | beq 1f 56 | ldr x0,qAdrszMessSortNok // no !! error sort 57 | bl affichageMess 58 | b 100f 59 | 1: // yes 60 | ldr x0,qAdrszMessSortOk 61 | bl affichageMess 62 | 100: // standard end of the program 63 | mov x0,0 // return code 64 | mov x8,EXIT // request to exit program 65 | svc 0 // perform the system call 66 | 67 | qAdrsZoneConv: .quad sZoneConv 68 | qAdrszCarriageReturn: .quad szCarriageReturn 69 | qAdrsMessResult: .quad sMessResult 70 | qAdrTableNumber: .quad TableNumber 71 | qAdrszMessSortOk: .quad szMessSortOk 72 | qAdrszMessSortNok: .quad szMessSortNok 73 | /******************************************************************/ 74 | /* control sorted table */ 75 | /******************************************************************/ 76 | /* x0 contains the address of table */ 77 | /* x1 contains the number of elements > 0 */ 78 | /* x0 return table address r1 return min r2 return max */ 79 | searchMinMax: 80 | stp x3,lr,[sp,-16]! // save registers 81 | stp x3,x4,[sp,-16]! // save registers 82 | mov x3,x1 // save size 83 | mov x1,1<<62 // min 84 | mov x2,0 // max 85 | mov x4,0 // index 86 | 1: 87 | ldr x5,[x0,x4,lsl 3] 88 | cmp x5,x1 89 | csel x1,x5,x1,lt 90 | cmp x5,x2 91 | csel x2,x5,x2,gt 92 | add x4,x4,1 93 | cmp x4,x3 94 | blt 1b 95 | 100: 96 | ldp x4,x5,[sp],16 // restaur 2 registers 97 | ldp x3,lr,[sp],16 // restaur 2 registers 98 | ret // return to address lr x30 99 | /******************************************************************/ 100 | /* control sorted table */ 101 | /******************************************************************/ 102 | /* x0 contains the address of table */ 103 | /* x1 contains the number of elements > 0 */ 104 | /* x0 return 0 if not sorted 1 if sorted */ 105 | isSorted: 106 | stp x2,lr,[sp,-16]! // save registers 107 | stp x3,x4,[sp,-16]! // save registers 108 | mov x2,0 109 | ldr x4,[x0,x2,lsl 3] 110 | 1: 111 | add x2,x2,1 112 | cmp x2,x1 113 | bge 99f 114 | ldr x3,[x0,x2, lsl 3] 115 | cmp x3,x4 116 | blt 98f 117 | mov x4,x3 118 | b 1b 119 | 98: 120 | mov x0,0 // not sorted 121 | b 100f 122 | 99: 123 | mov x0,1 // sorted 124 | 100: 125 | ldp x3,x4,[sp],16 // restaur 2 registers 126 | ldp x2,lr,[sp],16 // restaur 2 registers 127 | ret // return to address lr x30 128 | /******************************************************************/ 129 | /* count sort */ 130 | /******************************************************************/ 131 | /* x0 contains the address of table */ 132 | /* x1 contains the minimum */ 133 | /* x2 contains the maximum */ 134 | /* x3 contains area size */ 135 | /* caution : the count area is in the stack. if max is very large, risk of error */ 136 | countSort: 137 | stp x1,lr,[sp,-16]! // save registers 138 | stp x2,x3,[sp,-16]! // save registers 139 | stp x4,x5,[sp,-16]! // save registers 140 | stp x6,x7,[sp,-16]! // save registers 141 | stp x8,x9,[sp,-16]! // save registers 142 | sub x3,x3,1 // compute endidx = n - 1 143 | sub x5,x2,x1 // compute max - min 144 | add x5,x5,1 // + 1 145 | lsl x9,x5,3 // 8 bytes by number 146 | sub sp,sp,x9 // reserve count area in stack 147 | mov fp,sp // frame pointer = stack 148 | mov x6,0 149 | mov x4,0 150 | 1: // loop init stack area 151 | str x6,[fp,x4, lsl 3] 152 | add x4,x4,#1 153 | cmp x4,x5 154 | blt 1b 155 | mov x4,#0 // indice 156 | 2: // start loop 2 157 | ldr x5,[x0,x4,lsl 3] // load value A[j] 158 | sub x5,x5,x1 // - min 159 | ldr x6,[fp,x5,lsl 3] // load count of value 160 | add x6,x6,1 // increment counter 161 | str x6,[fp,x5,lsl 3] // and store 162 | add x4,x4,1 // increment indice 163 | cmp x4,x3 // end ? 164 | ble 2b // no -> loop 2 165 | 166 | mov x7,0 // z 167 | mov x4,x1 // index = min 168 | 3: // start loop 3 169 | sub x6,x4,x1 // compute index - min 170 | ldr x5,[fp,x6,lsl 3] // load count 171 | 4: // start loop 4 172 | cmp x5,0 // count <> zéro 173 | beq 5f 174 | str x4,[x0,x7,lsl 3] // store value A[j] 175 | add x7,x7,1 // increment z 176 | sub x5,x5,1 // decrement count 177 | b 4b 178 | 179 | 5: 180 | add x4,x4,1 // increment index 181 | cmp x4,x2 // max ? 182 | ble 3b // no -> loop 3 183 | 184 | add sp,sp,x9 // stack alignement 185 | 186 | 100: 187 | ldp x8,x9,[sp],16 // restaur 2 registers 188 | ldp x6,x7,[sp],16 // restaur 2 registers 189 | ldp x4,x5,[sp],16 // restaur 2 registers 190 | ldp x2,x3,[sp],16 // restaur 2 registers 191 | ldp x1,lr,[sp],16 // restaur 2 registers 192 | ret // return to address lr x30 193 | 194 | /******************************************************************/ 195 | /* Display table elements */ 196 | /******************************************************************/ 197 | /* x0 contains the address of table */ 198 | displayTable: 199 | stp x1,lr,[sp,-16]! // save registers 200 | stp x2,x3,[sp,-16]! // save registers 201 | mov x2,x0 // table address 202 | mov x3,0 203 | 1: // loop display table 204 | ldr x0,[x2,x3,lsl 3] 205 | ldr x1,qAdrsZoneConv 206 | bl conversion10S // décimal conversion 207 | ldr x0,qAdrsMessResult 208 | ldr x1,qAdrsZoneConv 209 | bl strInsertAtCharInc // insert result at @ character 210 | bl affichageMess // display message 211 | add x3,x3,1 212 | cmp x3,NBELEMENTS - 1 213 | ble 1b 214 | ldr x0,qAdrszCarriageReturn 215 | bl affichageMess 216 | mov x0,x2 // table address 217 | 100: 218 | ldp x2,x3,[sp],16 // restaur 2 registers 219 | ldp x1,lr,[sp],16 // restaur 2 registers 220 | ret // return to address lr x30 221 | /********************************************************/ 222 | /* File Include fonctions */ 223 | /********************************************************/ 224 | /* for this file see task include a file in language AArch64 assembly */ 225 | .include "../includeARM64.inc" 226 | -------------------------------------------------------------------------------- /sorters/pancake_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Pancake_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program pancake_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*********************************/ 19 | /* Initialized data */ 20 | /*********************************/ 21 | .data 22 | szMessSortOk: .asciz "Table sorted.\n" 23 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 24 | sMessResult: .asciz "Value : @ \n" 25 | sMessCounter: .asciz "sorted in @ flips \n" 26 | szCarriageReturn: .asciz "\n" 27 | 28 | .align 4 29 | TableNumber: .quad 1,3,11,6,2,-5,9,10,8,4,7 30 | #TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 31 | .equ NBELEMENTS, (. - TableNumber) / 8 32 | /*********************************/ 33 | /* UnInitialized data */ 34 | /*********************************/ 35 | .bss 36 | sZoneConv: .skip 24 37 | /*********************************/ 38 | /* code section */ 39 | /*********************************/ 40 | .text 41 | .global main 42 | main: // entry of program 43 | ldr x0,qAdrTableNumber // address number table 44 | mov x1,0 // first element 45 | mov x2,NBELEMENTS // number of élements 46 | bl pancakeSort 47 | ldr x0,qAdrTableNumber // address number table 48 | bl displayTable 49 | mov x0,x10 // display counter 50 | ldr x1,qAdrsZoneConv 51 | bl conversion10S // décimal conversion 52 | ldr x0,qAdrsMessCounter 53 | ldr x1,qAdrsZoneConv 54 | bl strInsertAtCharInc // insert result at @ character 55 | bl affichageMess // display message 56 | ldr x0,qAdrTableNumber // address number table 57 | mov x1,NBELEMENTS // number of élements 58 | bl isSorted // control sort 59 | cmp x0,1 // sorted ? 60 | beq 1f 61 | ldr x0,qAdrszMessSortNok // no !! error sort 62 | bl affichageMess 63 | b 100f 64 | 1: // yes 65 | ldr x0,qAdrszMessSortOk 66 | bl affichageMess 67 | 100: // standard end of the program 68 | mov x0,0 // return code 69 | mov x8,EXIT // request to exit program 70 | svc 0 // perform the system call 71 | 72 | qAdrsZoneConv: .quad sZoneConv 73 | qAdrszCarriageReturn: .quad szCarriageReturn 74 | qAdrsMessResult: .quad sMessResult 75 | qAdrTableNumber: .quad TableNumber 76 | qAdrszMessSortOk: .quad szMessSortOk 77 | qAdrszMessSortNok: .quad szMessSortNok 78 | qAdrsMessCounter: .quad sMessCounter 79 | /******************************************************************/ 80 | /* control sorted table */ 81 | /******************************************************************/ 82 | /* x0 contains the address of table */ 83 | /* x1 contains the number of elements > 0 */ 84 | /* x0 return 0 if not sorted 1 if sorted */ 85 | isSorted: 86 | stp x2,lr,[sp,-16]! // save registers 87 | stp x3,x4,[sp,-16]! // save registers 88 | mov x2,0 89 | ldr x4,[x0,x2,lsl 3] 90 | 1: 91 | add x2,x2,1 92 | cmp x2,x1 93 | bge 99f 94 | ldr x3,[x0,x2, lsl 3] 95 | cmp x3,x4 96 | blt 98f 97 | mov x4,x3 98 | b 1b 99 | 98: 100 | mov x0,0 // not sorted 101 | b 100f 102 | 99: 103 | mov x0,1 // sorted 104 | 100: 105 | ldp x3,x4,[sp],16 // restaur 2 registers 106 | ldp x2,lr,[sp],16 // restaur 2 registers 107 | ret // return to address lr x30 108 | 109 | /******************************************************************/ 110 | /* flip */ 111 | /******************************************************************/ 112 | /* x0 contains the address of table */ 113 | /* x1 contains first start index 114 | /* x2 contains the number of elements */ 115 | /* x3 contains the position of flip */ 116 | flip: 117 | //push {r1-r6,lr} // save registers 118 | stp x1,lr,[sp,-16]! // save registers 119 | stp x2,x3,[sp,-16]! // save registers 120 | stp x4,x5,[sp,-16]! // save registers 121 | str x6, [sp,-16]! // save registers 122 | add x10,x10,#1 // flips counter 123 | cmp x3,x2 124 | sub x4,x2,1 125 | csel x3,x4,x3,ge // last index if position >= size 126 | 1: 127 | cmp x1,x3 128 | bge 100f 129 | ldr x5,[x0,x1,lsl 3] // load value first index 130 | ldr x6,[x0,x3,lsl 3] // load value position index 131 | str x6,[x0,x1,lsl 3] // inversion 132 | str x5,[x0,x3,lsl 3] // 133 | sub x3,x3,1 134 | add x1,x1,1 135 | b 1b 136 | 100: 137 | ldr x6, [sp],16 // restaur 1 register 138 | ldp x4,x5,[sp],16 // restaur 2 registers 139 | ldp x2,x3,[sp],16 // restaur 2 registers 140 | ldp x1,lr,[sp],16 // restaur 2 registers 141 | ret // return to address lr x30 142 | /******************************************************************/ 143 | /* pancake sort */ 144 | /******************************************************************/ 145 | /* x0 contains the address of table */ 146 | /* x1 contains first start index 147 | /* x2 contains the number of elements */ 148 | pancakeSort: 149 | stp x1,lr,[sp,-16]! // save registers 150 | stp x2,x3,[sp,-16]! // save registers 151 | stp x4,x5,[sp,-16]! // save registers 152 | stp x6,x7,[sp,-16]! // save registers 153 | stp x8,x9,[sp,-16]! // save registers 154 | sub x7,x2,1 // last index 155 | 1: 156 | mov x5,x1 // index 157 | mov x4,0 // max 158 | mov x3,0 // position 159 | mov x8,1 // top sorted 160 | ldr x9,[x0,x5,lsl 3] // load value A[i-1] 161 | 2: 162 | ldr x6,[x0,x5,lsl 3] // load value 163 | cmp x6,x4 // compare max 164 | csel x4,x6,x4,ge // max = A[i} 165 | csel x3,x5,x3,ge // position = index 166 | cmp x6,x9 // cmp A[i] A[i-1] sorted ? 167 | csel x8,xzr,x8,lt // no 168 | mov x9,x6 // A[i-1] = A[i] 169 | add x5,x5,1 // increment index 170 | cmp x5,x7 // end ? 171 | ble 2b 172 | cmp x8,1 // sorted ? 173 | beq 100f // yes -> end 174 | cmp x3,x7 // position ok ? 175 | beq 4f // yes 176 | cmp x3,0 // first position ? 177 | beq 3f 178 | bl flip // flip if not greather in first position 179 | 3: 180 | mov x3,x7 // and flip the whole stack 181 | bl flip 182 | 4: 183 | //bl displayTable // to display an intermediate state 184 | subs x7,x7,1 // decrement number of pancake 185 | bge 1b // and loop 186 | 100: 187 | ldp x8,x9,[sp],16 // restaur 2 registers 188 | ldp x6,x7,[sp],16 // restaur 2 registers 189 | ldp x4,x5,[sp],16 // restaur 2 registers 190 | ldp x2,x3,[sp],16 // restaur 2 registers 191 | ldp x1,lr,[sp],16 // restaur 2 registers 192 | ret // return to address lr x30 193 | 194 | /******************************************************************/ 195 | /* Display table elements */ 196 | /******************************************************************/ 197 | /* x0 contains the address of table */ 198 | displayTable: 199 | stp x1,lr,[sp,-16]! // save registers 200 | stp x2,x3,[sp,-16]! // save registers 201 | mov x2,x0 // table address 202 | mov x3,0 203 | 1: // loop display table 204 | ldr x0,[x2,x3,lsl 3] 205 | ldr x1,qAdrsZoneConv 206 | bl conversion10S // décimal conversion 207 | ldr x0,qAdrsMessResult 208 | ldr x1,qAdrsZoneConv 209 | bl strInsertAtCharInc // insert result at @ character 210 | bl affichageMess // display message 211 | add x3,x3,1 212 | cmp x3,NBELEMENTS - 1 213 | ble 1b 214 | ldr x0,qAdrszCarriageReturn 215 | bl affichageMess 216 | mov x0,x2 217 | 100: 218 | ldp x2,x3,[sp],16 // restaur 2 registers 219 | ldp x1,lr,[sp],16 // restaur 2 registers 220 | ret // return to address lr x30 221 | /********************************************************/ 222 | /* File Include fonctions */ 223 | /********************************************************/ 224 | /* for this file see task include a file in language AArch64 assembly */ 225 | .include "../includeARM64.inc" 226 | -------------------------------------------------------------------------------- /misc/perfect_numbers.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Perfect_numbers 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program perfect_numbers.s */ 11 | /* use Euclide Formula : if M=(2puis p)-1 is prime M * (M+1)/2 is perfect see Wikipedia */ 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | .equ MAXI, 63 19 | 20 | /*********************************/ 21 | /* Initialized data */ 22 | /*********************************/ 23 | .data 24 | sMessResult: .asciz "Perfect : @ \n" 25 | szMessOverflow: .asciz "Overflow in function isPrime.\n" 26 | szCarriageReturn: .asciz "\n" 27 | 28 | /*********************************/ 29 | /* UnInitialized data */ 30 | /*********************************/ 31 | .bss 32 | sZoneConv: .skip 24 33 | /*********************************/ 34 | /* code section */ 35 | /*********************************/ 36 | .text 37 | .global main 38 | main: // entry of program 39 | mov x4,2 // start 2 40 | mov x3,1 // counter 2 power 41 | 1: // begin loop 42 | lsl x4,x4,1 // 2 power 43 | sub x0,x4,1 // - 1 44 | bl isPrime // is prime ? 45 | cbz x0,2f // no 46 | sub x0,x4,1 // yes 47 | mul x1,x0,x4 // multiply m by m-1 48 | lsr x0,x1,1 // divide by 2 49 | bl displayPerfect // and display 50 | 2: 51 | add x3,x3,1 // next power of 2 52 | cmp x3,MAXI 53 | blt 1b 54 | 55 | 100: // standard end of the program 56 | mov x0,0 // return code 57 | mov x8,EXIT // request to exit program 58 | svc 0 // perform the system call 59 | qAdrszCarriageReturn: .quad szCarriageReturn 60 | qAdrsMessResult: .quad sMessResult 61 | 62 | /******************************************************************/ 63 | /* Display perfect number */ 64 | /******************************************************************/ 65 | /* x0 contains the number */ 66 | displayPerfect: 67 | stp x1,lr,[sp,-16]! // save registers 68 | ldr x1,qAdrsZoneConv 69 | bl conversion10 // call décimal conversion 70 | ldr x0,qAdrsMessResult 71 | ldr x1,qAdrsZoneConv // insert conversion in message 72 | bl strInsertAtCharInc 73 | bl affichageMess // display message 74 | 100: 75 | ldp x1,lr,[sp],16 // restaur 2 registers 76 | ret // return to address lr x30 77 | qAdrsZoneConv: .quad sZoneConv 78 | 79 | /***************************************************/ 80 | /* is a number prime ? */ 81 | /***************************************************/ 82 | /* x0 contains the number */ 83 | /* x0 return 1 if prime else 0 */ 84 | //2147483647 OK 85 | //4294967297 NOK 86 | //131071 OK 87 | //1000003 OK 88 | //10001363 OK 89 | isPrime: 90 | stp x1,lr,[sp,-16]! // save registres 91 | stp x2,x3,[sp,-16]! // save registres 92 | mov x2,x0 93 | sub x1,x0,#1 94 | cmp x2,0 95 | beq 99f // return zero 96 | cmp x2,2 // for 1 and 2 return 1 97 | ble 2f 98 | mov x0,#2 99 | bl moduloPuR64 100 | bcs 100f // error overflow 101 | cmp x0,#1 102 | bne 99f // no prime 103 | cmp x2,3 104 | beq 2f 105 | mov x0,#3 106 | bl moduloPuR64 107 | blt 100f // error overflow 108 | cmp x0,#1 109 | bne 99f 110 | 111 | cmp x2,5 112 | beq 2f 113 | mov x0,#5 114 | bl moduloPuR64 115 | bcs 100f // error overflow 116 | cmp x0,#1 117 | bne 99f // Pas premier 118 | 119 | cmp x2,7 120 | beq 2f 121 | mov x0,#7 122 | bl moduloPuR64 123 | bcs 100f // error overflow 124 | cmp x0,#1 125 | bne 99f // Pas premier 126 | 127 | cmp x2,11 128 | beq 2f 129 | mov x0,#11 130 | bl moduloPuR64 131 | bcs 100f // error overflow 132 | cmp x0,#1 133 | bne 99f // Pas premier 134 | 135 | cmp x2,13 136 | beq 2f 137 | mov x0,#13 138 | bl moduloPuR64 139 | bcs 100f // error overflow 140 | cmp x0,#1 141 | bne 99f // Pas premier 142 | 2: 143 | cmn x0,0 // carry à zero no error 144 | mov x0,1 // prime 145 | b 100f 146 | 99: 147 | cmn x0,0 // carry à zero no error 148 | mov x0,#0 // prime 149 | 100: 150 | ldp x2,x3,[sp],16 // restaur des 2 registres 151 | ldp x1,lr,[sp],16 // restaur des 2 registres 152 | ret 153 | 154 | 155 | /**************************************************************/ 156 | /********************************************************/ 157 | /* Compute modulo de b power e modulo m */ 158 | /* Exemple 4 puissance 13 modulo 497 = 445 */ 159 | /********************************************************/ 160 | /* x0 number */ 161 | /* x1 exposant */ 162 | /* x2 modulo */ 163 | moduloPuR64: 164 | stp x1,lr,[sp,-16]! // save registres 165 | stp x3,x4,[sp,-16]! // save registres 166 | stp x5,x6,[sp,-16]! // save registres 167 | stp x7,x8,[sp,-16]! // save registres 168 | stp x9,x10,[sp,-16]! // save registres 169 | cbz x0,100f 170 | cbz x1,100f 171 | mov x8,x0 172 | mov x7,x1 173 | mov x6,1 // result 174 | udiv x4,x8,x2 175 | msub x9,x4,x2,x8 // remainder 176 | 1: 177 | tst x7,1 // if bit = 1 178 | beq 2f 179 | mul x4,x9,x6 180 | umulh x5,x9,x6 181 | mov x6,x4 182 | mov x0,x6 183 | mov x1,x5 184 | bl divisionReg128U // division 128 bits 185 | cbnz x1,99f // overflow 186 | mov x6,x3 // remainder 187 | 2: 188 | mul x8,x9,x9 189 | umulh x5,x9,x9 190 | mov x0,x8 191 | mov x1,x5 192 | bl divisionReg128U 193 | cbnz x1,99f // overflow 194 | mov x9,x3 195 | lsr x7,x7,1 196 | cbnz x7,1b 197 | mov x0,x6 // result 198 | cmn x0,0 // carry à zero no error 199 | b 100f 200 | 99: 201 | ldr x0,qAdrszMessOverflow 202 | bl affichageMess // display error message 203 | cmp x0,0 // carry set error 204 | mov x0,-1 // code erreur 205 | 206 | 100: 207 | ldp x9,x10,[sp],16 // restaur des 2 registres 208 | ldp x7,x8,[sp],16 // restaur des 2 registres 209 | ldp x5,x6,[sp],16 // restaur des 2 registres 210 | ldp x3,x4,[sp],16 // restaur des 2 registres 211 | ldp x1,lr,[sp],16 // restaur des 2 registres 212 | ret // retour adresse lr x30 213 | qAdrszMessOverflow: .quad szMessOverflow 214 | /***************************************************/ 215 | /* division d un nombre de 128 bits par un nombre de 64 bits */ 216 | /***************************************************/ 217 | /* x0 contient partie basse dividende */ 218 | /* x1 contient partie haute dividente */ 219 | /* x2 contient le diviseur */ 220 | /* x0 retourne partie basse quotient */ 221 | /* x1 retourne partie haute quotient */ 222 | /* x3 retourne le reste */ 223 | divisionReg128U: 224 | stp x6,lr,[sp,-16]! // save registres 225 | stp x4,x5,[sp,-16]! // save registres 226 | mov x5,#0 // raz du reste R 227 | mov x3,#128 // compteur de boucle 228 | mov x4,#0 // dernier bit 229 | 1: 230 | lsl x5,x5,#1 // on decale le reste de 1 231 | tst x1,1<<63 // test du bit le plus à gauche 232 | lsl x1,x1,#1 // on decale la partie haute du quotient de 1 233 | beq 2f 234 | orr x5,x5,#1 // et on le pousse dans le reste R 235 | 2: 236 | tst x0,1<<63 237 | lsl x0,x0,#1 // puis on decale la partie basse 238 | beq 3f 239 | orr x1,x1,#1 // et on pousse le bit de gauche dans la partie haute 240 | 3: 241 | orr x0,x0,x4 // position du dernier bit du quotient 242 | mov x4,#0 // raz du bit 243 | cmp x5,x2 244 | blt 4f 245 | sub x5,x5,x2 // on enleve le diviseur du reste 246 | mov x4,#1 // dernier bit à 1 247 | 4: 248 | // et boucle 249 | subs x3,x3,#1 250 | bgt 1b 251 | lsl x1,x1,#1 // on decale le quotient de 1 252 | tst x0,1<<63 253 | lsl x0,x0,#1 // puis on decale la partie basse 254 | beq 5f 255 | orr x1,x1,#1 256 | 5: 257 | orr x0,x0,x4 // position du dernier bit du quotient 258 | mov x3,x5 259 | 100: 260 | ldp x4,x5,[sp],16 // restaur des 2 registres 261 | ldp x6,lr,[sp],16 // restaur des 2 registres 262 | ret // retour adresse lr x30 263 | 264 | /********************************************************/ 265 | /* File Include fonctions */ 266 | /********************************************************/ 267 | /* for this file see task include a file in language AArch64 assembly */ 268 | .include "../includeARM64.inc" 269 | -------------------------------------------------------------------------------- /sorters/heap_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Heapsort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program heap_sort.s */ 11 | /* look Pseudocode begin this task */ 12 | 13 | /*******************************************/ 14 | /* Constantes file */ 15 | /*******************************************/ 16 | /* for this file see task include a file in language AArch64 assembly */ 17 | .include "../includeConstantesARM64.inc" 18 | 19 | /*********************************/ 20 | /* Initialized data */ 21 | /*********************************/ 22 | .data 23 | szMessSortOk: .asciz "Table sorted.\n" 24 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 25 | sMessResult: .asciz "Value : @ \n" 26 | szCarriageReturn: .asciz "\n" 27 | 28 | .align 4 29 | //TableNumber: .quad 1,3,6,2,5,9,10,8,4,7 30 | TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 31 | .equ NBELEMENTS, (. - TableNumber) / 8 32 | /*********************************/ 33 | /* UnInitialized data */ 34 | /*********************************/ 35 | .bss 36 | sZoneConv: .skip 24 37 | /*********************************/ 38 | /* code section */ 39 | /*********************************/ 40 | .text 41 | .global main 42 | main: // entry of program 43 | 44 | 1: 45 | ldr x0,qAdrTableNumber // address number table 46 | mov x1,#NBELEMENTS // number of élements 47 | bl heapSort 48 | ldr x0,qAdrTableNumber // address number table 49 | bl displayTable 50 | 51 | ldr x0,qAdrTableNumber // address number table 52 | mov x1,#NBELEMENTS // number of élements 53 | bl isSorted // control sort 54 | cmp x0,#1 // sorted ? 55 | beq 2f 56 | ldr x0,qAdrszMessSortNok // no !! error sort 57 | bl affichageMess 58 | b 100f 59 | 2: // yes 60 | ldr x0,qAdrszMessSortOk 61 | bl affichageMess 62 | 100: // standard end of the program 63 | mov x0, #0 // return code 64 | mov x8, #EXIT // request to exit program 65 | svc #0 // perform the system call 66 | 67 | qAdrszCarriageReturn: .quad szCarriageReturn 68 | qAdrsMessResult: .quad sMessResult 69 | qAdrTableNumber: .quad TableNumber 70 | qAdrszMessSortOk: .quad szMessSortOk 71 | qAdrszMessSortNok: .quad szMessSortNok 72 | /******************************************************************/ 73 | /* control sorted table */ 74 | /******************************************************************/ 75 | /* x0 contains the address of table */ 76 | /* x1 contains the number of elements > 0 */ 77 | /* x0 return 0 if not sorted 1 if sorted */ 78 | isSorted: 79 | stp x2,lr,[sp,-16]! // save registers 80 | stp x3,x4,[sp,-16]! // save registers 81 | mov x2,#0 82 | ldr x4,[x0,x2,lsl 3] 83 | 1: 84 | add x2,x2,1 85 | cmp x2,x1 86 | bge 99f 87 | ldr x3,[x0,x2, lsl 3] 88 | cmp x3,x4 89 | blt 98f 90 | mov x4,x3 91 | b 1b 92 | 98: 93 | mov x0,0 // not sorted 94 | b 100f 95 | 99: 96 | mov x0,1 // sorted 97 | 100: 98 | ldp x3,x4,[sp],16 // restaur 2 registers 99 | ldp x2,lr,[sp],16 // restaur 2 registers 100 | ret // return to address lr x30 101 | /******************************************************************/ 102 | /* heap sort */ 103 | /******************************************************************/ 104 | /* x0 contains the address of table */ 105 | /* x1 contains the number of element */ 106 | heapSort: 107 | stp x1,lr,[sp,-16]! // save registers 108 | stp x2,x3,[sp,-16]! // save registers 109 | bl heapify // first place table in max-heap order 110 | sub x3,x1,1 111 | 1: 112 | cmp x3,0 113 | ble 100f 114 | mov x1,0 // swap the root(maximum value) of the heap with the last element of the heap) 115 | mov x2,x3 116 | bl swapElement 117 | sub x3,x3,1 118 | mov x1,0 119 | mov x2,x3 // put the heap back in max-heap order 120 | bl siftDown 121 | b 1b 122 | 123 | 100: 124 | ldp x2,x3,[sp],16 // restaur 2 registers 125 | ldp x1,lr,[sp],16 // restaur 2 registers 126 | ret // return to address lr x30 127 | /******************************************************************/ 128 | /* place table in max-heap order */ 129 | /******************************************************************/ 130 | /* x0 contains the address of table */ 131 | /* x1 contains the number of element */ 132 | heapify: 133 | stp x1,lr,[sp,-16]! // save registers 134 | stp x2,x3,[sp,-16]! // save registers 135 | str x4,[sp,-16]! // save registers 136 | mov x4,x1 137 | sub x3,x1,2 138 | lsr x3,x3,1 139 | 1: 140 | cmp x3,0 141 | blt 100f 142 | mov x1,x3 143 | sub x2,x4,1 144 | bl siftDown 145 | sub x3,x3,1 146 | b 1b 147 | 100: 148 | ldr x4,[sp],16 // restaur 1 registers 149 | ldp x2,x3,[sp],16 // restaur 2 registers 150 | ldp x1,lr,[sp],16 // restaur 2 registers 151 | ret // return to address lr x30 152 | /******************************************************************/ 153 | /* swap two elements of table */ 154 | /******************************************************************/ 155 | /* x0 contains the address of table */ 156 | /* x1 contains the first index */ 157 | /* x2 contains the second index */ 158 | swapElement: 159 | stp x2,lr,[sp,-16]! // save registers 160 | stp x3,x4,[sp,-16]! // save registers 161 | ldr x3,[x0,x1,lsl #3] // swap number on the table 162 | ldr x4,[x0,x2,lsl #3] 163 | str x4,[x0,x1,lsl #3] 164 | str x3,[x0,x2,lsl #3] 165 | 100: 166 | ldp x3,x4,[sp],16 // restaur 2 registers 167 | ldp x2,lr,[sp],16 // restaur 2 registers 168 | ret // return to address lr x30 169 | 170 | /******************************************************************/ 171 | /* put the heap back in max-heap order */ 172 | /******************************************************************/ 173 | /* x0 contains the address of table */ 174 | /* x1 contains the first index */ 175 | /* x2 contains the last index */ 176 | siftDown: 177 | stp x1,lr,[sp,-16]! // save registers 178 | stp x2,x3,[sp,-16]! // save registers 179 | stp x4,x5,[sp,-16]! // save registers 180 | stp x6,x7,[sp,-16]! // save registers 181 | // x1 = root = start 182 | mov x3,x2 // save last index 183 | 1: 184 | lsl x4,x1,1 185 | add x4,x4,1 186 | cmp x4,x3 187 | bgt 100f 188 | add x5,x4,1 189 | cmp x5,x3 190 | bgt 2f 191 | ldr x6,[x0,x4,lsl 3] // compare elements on the table 192 | ldr x7,[x0,x5,lsl 3] 193 | cmp x6,x7 194 | csel x4,x5,x4,lt 195 | //movlt x4,x5 196 | 2: 197 | ldr x7,[x0,x4,lsl 3] // compare elements on the table 198 | ldr x6,[x0,x1,lsl 3] // root 199 | cmp x6,x7 200 | bge 100f 201 | mov x2,x4 // and x1 is root 202 | bl swapElement 203 | mov x1,x4 // root = child 204 | b 1b 205 | 206 | 100: 207 | ldp x6,x7,[sp],16 // restaur 2 registers 208 | ldp x4,x5,[sp],16 // restaur 2 registers 209 | ldp x2,x3,[sp],16 // restaur 2 registers 210 | ldp x1,lr,[sp],16 // restaur 2 registers 211 | ret // return to address lr x30 212 | 213 | /******************************************************************/ 214 | /* Display table elements */ 215 | /******************************************************************/ 216 | /* x0 contains the address of table */ 217 | displayTable: 218 | stp x1,lr,[sp,-16]! // save registers 219 | stp x2,x3,[sp,-16]! // save registers 220 | mov x2,x0 // table address 221 | mov x3,0 222 | 1: // loop display table 223 | ldr x0,[x2,x3,lsl 3] 224 | ldr x1,qAdrsZoneConv 225 | bl conversion10S // décimal conversion 226 | ldr x0,qAdrsMessResult 227 | ldr x1,qAdrsZoneConv 228 | bl strInsertAtCharInc // insert result at @ character 229 | bl affichageMess // display message 230 | add x3,x3,1 231 | cmp x3,NBELEMENTS - 1 232 | ble 1b 233 | ldr x0,qAdrszCarriageReturn 234 | bl affichageMess 235 | mov x0,x2 236 | 100: 237 | ldp x2,x3,[sp],16 // restaur 2 registers 238 | ldp x1,lr,[sp],16 // restaur 2 registers 239 | ret // return to address lr x30 240 | qAdrsZoneConv: .quad sZoneConv 241 | /********************************************************/ 242 | /* File Include fonctions */ 243 | /********************************************************/ 244 | /* for this file see task include a file in language AArch64 assembly */ 245 | .include "../includeARM64.inc" 246 | -------------------------------------------------------------------------------- /sorters/permutation_sort.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/Sorting_algorithms/Permutation_sort 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program permutation_sort.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly */ 16 | .include "../includeConstantesARM64.inc" 17 | 18 | /*******************************************/ 19 | /* Structures */ 20 | /********************************************/ 21 | /* structure permutations */ 22 | .struct 0 23 | perm_adrtable: // table value address 24 | .struct perm_adrtable + 8 25 | perm_size: // elements number 26 | .struct perm_size + 8 27 | perm_adrheap: // Init to zéro at the first call 28 | .struct perm_adrheap + 8 29 | perm_end: 30 | /*********************************/ 31 | /* Initialized data */ 32 | /*********************************/ 33 | .data 34 | szMessSortOk: .asciz "Table sorted.\n" 35 | szMessSortNok: .asciz "Table not sorted !!!!!.\n" 36 | sMessCounter: .asciz "sorted in @ permutations \n" 37 | sMessResult: .asciz "Value : @ \n" 38 | 39 | szCarriageReturn: .asciz "\n" 40 | 41 | .align 4 42 | #TableNumber: .quad 1,3,6,2,5,9,10,8,4,7,11 43 | TableNumber: .quad 10,9,8,7,6,-5,4,3,2,1 44 | .equ NBELEMENTS, (. - TableNumber) / 8 45 | /*********************************/ 46 | /* UnInitialized data */ 47 | /*********************************/ 48 | .bss 49 | sZoneConv: .skip 24 50 | stPermutation: .skip perm_end 51 | /*********************************/ 52 | /* code section */ 53 | /*********************************/ 54 | .text 55 | .global main 56 | main: // entry of program 57 | ldr x0,qAdrstPermutation // address structure permutation 58 | ldr x1,qAdrTableNumber // address number table 59 | str x1,[x0,perm_adrtable] 60 | mov x1,NBELEMENTS // elements number 61 | str x1,[x0,perm_size] 62 | mov x1,0 // first call 63 | str x1,[x0,perm_adrheap] 64 | mov x20,0 // counter 65 | 1: 66 | ldr x0,qAdrstPermutation // address structure permutation 67 | bl newPermutation // call for each permutation 68 | cmp x0,0 // end ? 69 | blt 99f // yes -> error 70 | //bl displayTable // for display after each permutation 71 | add x20,x20,1 // increment counter 72 | ldr x0,qAdrTableNumber // address number table 73 | mov x1,NBELEMENTS // number of élements 74 | bl isSorted // control sort 75 | cmp x0,1 // sorted ? 76 | bne 1b // no -> loop 77 | 78 | ldr x0,qAdrTableNumber // address number table 79 | bl displayTable 80 | ldr x0,qAdrszMessSortOk // address OK message 81 | bl affichageMess 82 | mov x0,x20 // display counter 83 | ldr x1,qAdrsZoneConv 84 | bl conversion10S // décimal conversion 85 | ldr x0,qAdrsMessCounter 86 | ldr x1,qAdrsZoneConv // insert conversion 87 | bl strInsertAtCharInc 88 | bl affichageMess // display message 89 | b 100f 90 | 99: 91 | ldr x0,qAdrTableNumber // address number table 92 | bl displayTable 93 | ldr x0,qAdrszMessSortNok // address not OK message 94 | bl affichageMess 95 | 100: // standard end of the program 96 | mov x0,0 // return code 97 | mov x8,EXIT // request to exit program 98 | svc 0 // perform the system call 99 | 100 | qAdrsZoneConv: .quad sZoneConv 101 | qAdrszCarriageReturn: .quad szCarriageReturn 102 | qAdrsMessResult: .quad sMessResult 103 | qAdrTableNumber: .quad TableNumber 104 | qAdrstPermutation: .quad stPermutation 105 | qAdrszMessSortOk: .quad szMessSortOk 106 | qAdrszMessSortNok: .quad szMessSortNok 107 | qAdrsMessCounter: .quad sMessCounter 108 | /******************************************************************/ 109 | /* control sorted table */ 110 | /******************************************************************/ 111 | /* x0 contains the address of table */ 112 | /* x1 contains the number of elements > 0 */ 113 | /* x0 return 0 if not sorted 1 if sorted */ 114 | isSorted: 115 | stp x2,lr,[sp,-16]! // save registers 116 | stp x3,x4,[sp,-16]! // save registers 117 | mov x2,0 118 | ldr x4,[x0,x2,lsl 3] 119 | 1: 120 | add x2,x2,1 121 | cmp x2,x1 122 | bge 99f 123 | ldr x3,[x0,x2, lsl 3] 124 | cmp x3,x4 125 | blt 98f 126 | mov x4,x3 127 | b 1b 128 | 98: 129 | mov x0,0 // not sorted 130 | b 100f 131 | 99: 132 | mov x0,1 // sorted 133 | 100: 134 | ldp x3,x4,[sp],16 // restaur 2 registers 135 | ldp x2,lr,[sp],16 // restaur 2 registers 136 | ret // return to address lr x30 137 | /***************************************************/ 138 | /* return permutation one by one */ 139 | /* sur une idée de vincent Moresmau */ 140 | /* use algorytm heap iteratif see wikipedia */ 141 | /***************************************************/ 142 | /* x0 contains the address of structure permutations */ 143 | /* x0 return address of value table or zéro if end */ 144 | newPermutation: 145 | stp x1,lr,[sp,-16]! // save registers 146 | stp x2,x3,[sp,-16]! // save registers 147 | stp x4,x5,[sp,-16]! // save registers 148 | stp x6,x7,[sp,-16]! // save registers 149 | ldr x2,[x0,perm_adrheap] 150 | cmp x2,0 151 | bne 2f 152 | // first call -> init area on heap 153 | mov x7,x0 154 | ldr x1,[x7,perm_size] 155 | lsl x3,x1,3 // 8 bytes by count table 156 | add x3,x3,8 // 8 bytes for current index 157 | mov x0,0 // allocation place heap 158 | mov x8,BRK // call system 'brk' 159 | svc 0 160 | mov x2,x0 // save address heap 161 | add x0,x0,x3 // reservation place 162 | mov x8,BRK // call system 'brk' 163 | svc #0 164 | cmp x0,-1 // allocation error 165 | beq 100f 166 | add x8,x2,8 // address begin area counters 167 | mov x3,0 168 | 1: // loop init 169 | str xzr,[x8,x3,lsl 3] // init to zéro area heap 170 | add x3,x3,1 171 | cmp x3,x1 172 | blt 1b 173 | str xzr,[x2] // store zero to index 174 | str x2,[x7,perm_adrheap] // store heap address on structure permutation 175 | ldr x0,[x7,perm_adrtable] // return first permutation 176 | b 100f 177 | 178 | 2: // other calls x2 contains heap address 179 | mov x7,x0 // structure address 180 | ldr x1,[x7,perm_size] // elements number 181 | ldr x0,[x7,perm_adrtable] 182 | add x8,x2,8 // begin address area count 183 | ldr x3,[x2] // load current index 184 | 3: 185 | ldr x4,[x8,x3,lsl 3] // load count [i] 186 | cmp x4,x3 // compare with i 187 | bge 6f 188 | tst x3,#1 // even ? 189 | bne 4f 190 | ldr x5,[x0] // yes load value A[0] 191 | ldr x6,[x0,x3,lsl 3] // and swap with value A[i] 192 | str x6,[x0] 193 | str x5,[x0,x3,lsl 3] 194 | b 5f 195 | 4: 196 | ldr x5,[x0,x4,lsl 3] // no load value A[count[i]] 197 | ldr x6,[x0,x3,lsl 3] // and swap with value A[i] 198 | str x6,[x0,x4,lsl 3] 199 | str x5,[x0,x3,lsl 3] 200 | 5: 201 | add x4,x4,1 202 | str x4,[x8,x3,lsl 3] // store new count [i] 203 | str xzr,[x2] // store new index 204 | b 100f // and return new permutation in x0 205 | 6: 206 | str xzr,[x8,x3,lsl 3] // store zero in count [i] 207 | add x3,x3,1 // increment index 208 | cmp x3,x1 // end 209 | blt 3b // loop 210 | mov x0,0 // if end -> return zero 211 | 212 | 100: // end function 213 | ldp x6,x7,[sp],16 // restaur 1 register 214 | ldp x4,x5,[sp],16 // restaur 1 register 215 | ldp x2,x3,[sp],16 // restaur 2 registers 216 | ldp x1,lr,[sp],16 // restaur 2 registers 217 | ret // return to address lr x30 218 | 219 | /******************************************************************/ 220 | /* Display table elements */ 221 | /******************************************************************/ 222 | /* x0 contains the address of table */ 223 | displayTable: 224 | stp x1,lr,[sp,-16]! // save registers 225 | stp x2,x3,[sp,-16]! // save registers 226 | mov x2,x0 // table address 227 | mov x3,0 228 | 1: // loop display table 229 | ldr x0,[x2,x3,lsl 3] 230 | ldr x1,qAdrsZoneConv 231 | bl conversion10S // décimal conversion 232 | ldr x0,qAdrsMessResult 233 | ldr x1,qAdrsZoneConv 234 | bl strInsertAtCharInc // insert result at // character 235 | bl affichageMess // display message 236 | add x3,x3,1 237 | cmp x3,NBELEMENTS - 1 238 | ble 1b 239 | ldr x0,qAdrszCarriageReturn 240 | bl affichageMess 241 | mov x0,x2 242 | 100: 243 | ldp x2,x3,[sp],16 // restaur 2 registers 244 | ldp x1,lr,[sp],16 // restaur 2 registers 245 | ret // return to address lr x30 246 | /********************************************************/ 247 | /* File Include fonctions */ 248 | /********************************************************/ 249 | /* for this file see task include a file in language AArch64 assembly */ 250 | .include "../includeARM64.inc" 251 | -------------------------------------------------------------------------------- /string/matching.s: -------------------------------------------------------------------------------- 1 | /* =============================== 2 | 3 | This program uses codes from Rosetta Code. 4 | See: https://rosettacode.org/wiki/String_matching 5 | This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. 6 | 7 | =============================== */ 8 | 9 | /* ARM assembly AARCH64 Raspberry PI 3B */ 10 | /* program matching.s */ 11 | 12 | /*******************************************/ 13 | /* Constantes file */ 14 | /*******************************************/ 15 | /* for this file see task include a file in language AArch64 assembly*/ 16 | .include "../includeConstantesARM64.inc" 17 | /*******************************************/ 18 | /* Initialized data */ 19 | /*******************************************/ 20 | .data 21 | szMessFound: .asciz "String found. \n" 22 | szMessNotFound: .asciz "String not found. \n" 23 | szString: .asciz "abcdefghijklmnopqrstuvwxyz" 24 | szString2: .asciz "abc" 25 | szStringStart: .asciz "abcd" 26 | szStringEnd: .asciz "xyz" 27 | szStringStart2: .asciz "abcd" 28 | szStringEnd2: .asciz "xabc" 29 | szCarriageReturn: .asciz "\n" 30 | /*******************************************/ 31 | /* UnInitialized data */ 32 | /*******************************************/ 33 | .bss 34 | /*******************************************/ 35 | /* code section */ 36 | /*******************************************/ 37 | .text 38 | .global main 39 | main: 40 | 41 | ldr x0,qAdrszString // address input string 42 | ldr x1,qAdrszStringStart // address search string 43 | 44 | bl searchStringDeb // Determining if the first string starts with second string 45 | cmp x0,0 46 | ble 1f 47 | ldr x0,qAdrszMessFound // display message 48 | bl affichageMess 49 | b 2f 50 | 1: 51 | ldr x0,qAdrszMessNotFound 52 | bl affichageMess 53 | 2: 54 | ldr x0,qAdrszString // address input string 55 | ldr x1,qAdrszStringEnd // address search string 56 | bl searchStringFin // Determining if the first string ends with the second string 57 | cmp x0,0 58 | ble 3f 59 | ldr x0,qAdrszMessFound // display message 60 | bl affichageMess 61 | b 4f 62 | 3: 63 | ldr x0,qAdrszMessNotFound 64 | bl affichageMess 65 | 4: 66 | ldr x0,qAdrszString2 // address input string 67 | ldr x1,qAdrszStringStart2 // address search string 68 | 69 | bl searchStringDeb // 70 | cmp x0,0 71 | ble 5f 72 | ldr x0,qAdrszMessFound // display message 73 | bl affichageMess 74 | b 6f 75 | 5: 76 | ldr x0,qAdrszMessNotFound 77 | bl affichageMess 78 | 6: 79 | ldr x0,qAdrszString2 // address input string 80 | ldr x1,qAdrszStringEnd2 // address search string 81 | bl searchStringFin 82 | cmp x0,0 83 | ble 7f 84 | ldr x0,qAdrszMessFound // display message 85 | bl affichageMess 86 | b 8f 87 | 7: 88 | ldr x0,qAdrszMessNotFound 89 | bl affichageMess 90 | 8: 91 | ldr x0,qAdrszString // address input string 92 | ldr x1,qAdrszStringEnd // address search string 93 | bl searchSubString // Determining if the first string contains the second string at any location 94 | cmp x0,0 95 | ble 9f 96 | ldr x0,qAdrszMessFound // display message 97 | bl affichageMess 98 | b 10f 99 | 9: 100 | ldr x0,qAdrszMessNotFound // display substring result 101 | bl affichageMess 102 | 10: 103 | 104 | 100: // standard end of the program 105 | mov x0,0 // return code 106 | mov x8,EXIT // request to exit program 107 | svc 0 // perform system call 108 | qAdrszMessFound: .quad szMessFound 109 | qAdrszMessNotFound: .quad szMessNotFound 110 | qAdrszString: .quad szString 111 | qAdrszString2: .quad szString2 112 | qAdrszStringStart: .quad szStringStart 113 | qAdrszStringEnd: .quad szStringEnd 114 | qAdrszStringStart2: .quad szStringStart2 115 | qAdrszStringEnd2: .quad szStringEnd2 116 | qAdrszCarriageReturn: .quad szCarriageReturn 117 | /******************************************************************/ 118 | /* search substring at begin of input string */ 119 | /******************************************************************/ 120 | /* x0 contains the address of the input string */ 121 | /* x1 contains the address of substring */ 122 | /* x0 returns 1 if find or 0 if not or -1 if error */ 123 | searchStringDeb: 124 | stp x1,lr,[sp,-16]! // save registers 125 | stp x2,x3,[sp,-16]! // save registers 126 | mov x3,0 // counter byte string 127 | ldrb w4,[x1,x3] // load first byte of substring 128 | cbz x4,99f // empty string ? 129 | 1: 130 | ldrb w2,[x0,x3] // load byte string input 131 | cbz x2,98f // zero final ? 132 | cmp x4,x2 // bytes equals ? 133 | bne 98f // no not find 134 | add x3,x3,1 // increment counter 135 | ldrb w4,[x1,x3] // and load next byte of substring 136 | cbnz x4,1b // zero final ? 137 | mov x0,1 // yes is ok 138 | b 100f 139 | 98: 140 | mov x0,0 // not find 141 | b 100f 142 | 99: 143 | mov x0,-1 // error 144 | 100: 145 | ldp x2,x3,[sp],16 // restaur 2 registers 146 | ldp x1,lr,[sp],16 // restaur 2 registers 147 | ret // return to address lr x30 148 | 149 | /******************************************************************/ 150 | /* search substring at end of input string */ 151 | /******************************************************************/ 152 | /* x0 contains the address of the input string */ 153 | /* x1 contains the address of substring */ 154 | /* x0 returns 1 if find or 0 if not or -1 if error */ 155 | searchStringFin: 156 | stp x1,lr,[sp,-16]! // save registers 157 | stp x2,x3,[sp,-16]! // save registers 158 | stp x4,x5,[sp,-16]! // save registers 159 | mov x3,0 // counter byte string 160 | // search the last character of substring 161 | 1: 162 | ldrb w4,[x1,x3] // load byte of substring 163 | cmp x4,#0 // zero final ? 164 | add x2,x3,1 165 | csel x3,x2,x3,ne // no increment counter 166 | //addne x3,#1 // no increment counter 167 | bne 1b // and loop 168 | cbz x3,99f // empty string ? 169 | 170 | sub x3,x3,1 // index of last byte 171 | ldrb w4,[x1,x3] // load last byte of substring 172 | // search the last character of string 173 | mov x2,0 // index last character 174 | 2: 175 | ldrb w5,[x0,x2] // load first byte of substring 176 | cmp x5,0 // zero final ? 177 | add x5,x2,1 // no -> increment counter 178 | csel x2,x5,x2,ne 179 | //addne x2,#1 // no -> increment counter 180 | bne 2b // and loop 181 | cbz x2,98f // empty input string ? 182 | sub x2,x2,1 // index last character 183 | 3: 184 | ldrb w5,[x0,x2] // load byte string input 185 | cmp x4,x5 // bytes equals ? 186 | bne 98f // no -> not found 187 | subs x3,x3,1 // decrement counter 188 | blt 97f // ok found 189 | subs x2,x2,1 // decrement counter input string 190 | blt 98f // if zero -> not found 191 | ldrb w4,[x1,x3] // load previous byte of substring 192 | b 3b // and loop 193 | 97: 194 | mov x0,1 // yes is ok 195 | b 100f 196 | 98: 197 | mov x0,0 // not found 198 | b 100f 199 | 99: 200 | mov x0,-1 // error 201 | 100: 202 | ldp x4,x5,[sp],16 // restaur 2 registers 203 | ldp x2,x3,[sp],16 // restaur 2 registers 204 | ldp x1,lr,[sp],16 // restaur 2 registers 205 | ret // return to address lr x30 206 | 207 | /******************************************************************/ 208 | /* search a substring in the string */ 209 | /******************************************************************/ 210 | /* x0 contains the address of the input string */ 211 | /* x1 contains the address of substring */ 212 | /* x0 returns index of substring in string or -1 if not found */ 213 | searchSubString: 214 | stp x1,lr,[sp,-16]! // save registers 215 | stp x2,x3,[sp,-16]! // save registers 216 | stp x4,x5,[sp,-16]! // save registers 217 | mov x2,0 // counter byte input string 218 | mov x3,0 // counter byte string 219 | mov x6,-1 // index found 220 | ldrb w4,[x1,x3] 221 | 1: 222 | ldrb w5,[x0,x2] // load byte string 223 | cbz x5,99f // zero final ? 224 | cmp x5,x4 // compare character 225 | beq 2f 226 | mov x6,-1 // no equals - > raz index 227 | mov x3,0 // and raz counter byte 228 | add x2,x2,1 // and increment counter byte 229 | b 1b // and loop 230 | 2: // characters equals 231 | cmp x6,-1 // first characters equals ? 232 | csel x6,x2,x6,eq // yes -> index begin in x6 233 | //moveq x6,x2 // yes -> index begin in x6 234 | add x3,x3,1 // increment counter substring 235 | ldrb w4,[x1,x3] // and load next byte 236 | cmp x4,0 // zero final ? 237 | beq 3f // yes -> end search 238 | add x2,x2,1 // else increment counter string 239 | b 1b // and loop 240 | 3: 241 | mov x0,x6 242 | b 100f 243 | 244 | 98: 245 | mov x0,0 // not found 246 | b 100f 247 | 99: 248 | mov x0,-1 // error 249 | 100: 250 | ldp x4,x5,[sp],16 // restaur 2 registers 251 | ldp x2,x3,[sp],16 // restaur 2 registers 252 | ldp x1,lr,[sp],16 // restaur 2 registers 253 | ret // return to address lr x30 254 | /********************************************************/ 255 | /* File Include fonctions */ 256 | /********************************************************/ 257 | /* for this file see task include a file in language AArch64 assembly */ 258 | .include "../includeARM64.inc" 259 | --------------------------------------------------------------------------------