In this blog post, I will demonstrate how to create a loop that prints messages along with loop index values, displaying digits from 0 to 30 using both AArch64 and x86_64 architectures.
AArch64
.text .globl _start min = 0 max = 31 _start: mov x19, min mov x17, 10 loop: mov x0, 1 adr x1, msg mov x2, len mov x18, x19 udiv x9, x18, x17 add x13, x9, 0x30 msub x10, x9, x17, x18 add x14, x10, 0x30 adr x15, msg strb w13, [x15, 7] strb w14, [x15, 8] mov x8, 64 svc 0 add x19, x19, 1 cmp x19, max b.ne loop .data msg: .ascii "Loop : \n" len= . - msg x86_64
.globl _start min = 0 max = 31 _start: movq $min, %r15 movq $0x30, %r12 loop: movq $min, %rdx movq %r15, %rax movq $10, %r10 div %r10 movq %rax, %r14 movq %rdx, %r13 add $0x30, %r14 add $0x30, %r13 mov %r13b, msg+8 cmp %r12, %r14 mov %r14b, msg+7 movq $len, %rdx movq $msg, %rsi movq $1, %rdi movq $1, %rax syscall inc %r15 cmp $max, %r15 jne loop movq $min, %rdi movq $60, %rax syscall .section .data msg: .ascii "Loop : \n" len = . - msg Result
AArch64 vs x86_64
I find the instruction set of AArch64 to be more straightforward and user-friendly, as I don't have to prefix every number with a '$' sign. Additionally, achieving the same task in x86_64 requires much longer lines of code compared to AArch64, which can be a bit time-consuming.
Experience in general
The debugging process was challenging for me, as a solid grasp of memory addresses, registers, and stacks is essential to uncover what's happening in the code. Furthermore, my lack of familiarity with the syntax of each architecture added an extra layer of difficulty to this project.
Another challenge for me was to remove the leading zero when dealing with single digits. For example, the desired output should be 0, 1, 2, ... 29, 30 instead of 00, 01, 02, ... 29, 30. Unfortunately, I couldn't figure out how to suppress the leading zero in this lab.


Top comments (0)