Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
mohitmishra786 avatar

Assembly Arm

  • 384 installs
  • 155 repo stars
  • Updated June 27, 2026
  • mohitmishra786/low-level-dev-skills

assembly-arm is a Claude Code agent skill that teaches AArch64 and ARM Thumb assembly reading, writing, and debugging with AAPCS64 calling conventions for developers working on embedded, mobile, or Rust/C inline asm.

About

assembly-arm is a low-level-dev-skills agent skill for AArch64 and ARM Thumb assembly from the mohitmishra786 toolchain suite. The skill documents AAPCS64 register roles across x0–x7 argument slots, v0–v7 SIMD args, callee-saved x19–x28, and 16-byte stack alignment rules. Developers reach for assembly-arm when reading GCC or Clang -S output, writing inline asm in C/C++/Rust, debugging register and stack state on ARM hardware or QEMU, or applying NEON and SVE SIMD patterns in performance-critical paths.

  • AArch32/AArch64 ABI rules
  • Register and stack conventions
  • Inline asm patterns
  • Debugging disassembly
  • FFI boundary safety

Assembly Arm by the numbers

  • 384 all-time installs (skills.sh)
  • +25 installs in the week ending Aug 4, 2026 (Skillselion tracking)
  • Ranked #31 of 121 Rust skills by installs in the Skillselion catalog
  • Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill assembly-arm

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs384
repo stars155
Last updatedJune 27, 2026
Repositorymohitmishra786/low-level-dev-skills

How do you read AArch64 assembly calling conventions?

Write and debug ARM assembly for embedded, mobile, or performance-critical paths needing register-level control, ABI compliance, and inline asm in Rust/C projects.

Who is it for?

Systems and embedded developers debugging ARM64 firmware, mobile native code, or Rust/C inline assembly on AArch64 targets.

Skip if: Web frontend developers or teams building standard REST APIs without register-level ARM assembly or cross-compilation needs.

When should I use this skill?

A user asks about AArch64 registers, AAPCS64 calling convention, ARM Thumb inline asm, or reading ARM disassembly from GCC or GDB.

What you get

Correct AArch64 or ARM Thumb assembly with AAPCS64-compliant register usage, inline asm blocks, and GDB/objdump disassembly traces.

  • AAPCS64-compliant inline asm blocks
  • Annotated disassembly with register role mapping

By the numbers

  • Documents 8 integer argument registers (x0–x7) and 8 SIMD argument registers (v0–v7)
  • Requires 16-byte stack alignment at every bl or blr instruction

Files

SKILL.mdMarkdownGitHub ↗

ARM / AArch64 Assembly

Purpose

Guide agents through AArch64 (64-bit) and ARM (32-bit Thumb) assembly: registers, calling conventions, inline asm, and NEON/SVE SIMD patterns.

Triggers

  • "How do I read ARM64 assembly output?"
  • "What are the AArch64 registers and calling convention?"
  • "How do I write inline asm for ARM?"
  • "What is the difference between AArch64 and ARM Thumb?"
  • "How do I use NEON intrinsics?"

Workflow

1. Generate ARM assembly

# AArch64 (native or cross-compile)
aarch64-linux-gnu-gcc -S -O2 foo.c -o foo.s

# 32-bit ARM Thumb
arm-linux-gnueabihf-gcc -S -O2 -mthumb foo.c -o foo.s

# From objdump
aarch64-linux-gnu-objdump -d -S prog

# From GDB on target
(gdb) disassemble /s main

2. AArch64 registers (AAPCS64)

RegisterAliasRole
x0x7Arguments 1–8 and return values
x8xrIndirect result location (struct return)
x9x15Caller-saved temporaries
x16x17ip0, ip1Intra-procedure-call temporaries (used by linker)
x18prPlatform register (reserved on some OS)
x19x28Callee-saved
x29fpFrame pointer (callee-saved)
x30lrLink register (return address)
spStack pointer (must be 16-byte aligned at call)
pcProgram counter (not directly accessible)
xzrwzrZero register (reads as 0, writes discarded)
v0v7q0q7FP/SIMD args and return
v8v15Callee-saved SIMD (lower 64 bits only)
v16v31Caller-saved temporaries

Width variants: x0 (64-bit), w0 (32-bit, zero-extends to 64), h0 (16), b0 (8).

3. AAPCS64 calling convention

Integer/pointer args: x0x7 Float/SIMD args: v0v7 Return: x0 (int), x0+x1 (128-bit), v0 (float/SIMD) Callee-saved: x19x28, x29 (fp), x30 (lr), v8v15 (lower 64 bits) Caller-saved: everything else

Stack must be 16-byte aligned at any bl or blr instruction.

4. Common AArch64 instructions

InstructionEffect
mov x0, x1Copy register
mov x0, #42Load immediate
movz x0, #0x1234, lsl #16Move zero-extended with shift
movk x0, #0xabcdMove with keep (partial update)
ldr x0, [x1]Load 64-bit from address in x1
ldr x0, [x1, #8]Load from x1+8
str x0, [x1, #8]Store x0 to x1+8
ldp x0, x1, [sp, #16]Load pair (two regs at once)
stp x29, x30, [sp, #-16]!Store pair, pre-decrement sp
add x0, x1, x2x0 = x1 + x2
add x0, x1, #8x0 = x1 + 8
sub x0, x1, x2x0 = x1 - x2
mul x0, x1, x2x0 = x1 * x2
sdiv x0, x1, x2Signed divide
udiv x0, x1, x2Unsigned divide
cmp x0, x1Set flags for x0 - x1
cbz x0, labelBranch if x0 == 0
cbnz x0, labelBranch if x0 != 0
bl funcBranch with link (call)
blr x0Branch with link to address in x0
retReturn (branch to x30)
ret x0Return to address in x0
adrp x0, symbolPC-relative page address
add x0, x0, :lo12:symbolLow 12 bits of symbol offset

5. Typical function prologue/epilogue

// Non-leaf function
stp  x29, x30, [sp, #-32]!   // save fp, lr; allocate 32 bytes
mov  x29, sp                  // set frame pointer
stp  x19, x20, [sp, #16]     // save callee-saved registers
// ... body ...
ldp  x19, x20, [sp, #16]     // restore
ldp  x29, x30, [sp], #32     // restore fp, lr; deallocate
ret

// Leaf function (no calls, no callee-saved regs needed)
// Can use red zone (no rsp adjustment) — but AArch64 has no red zone
sub  sp, sp, #16             // allocate locals
// ... body ...
add  sp, sp, #16
ret

6. Inline assembly (GCC/Clang)

// Barrier
__asm__ volatile ("dmb ish" ::: "memory");

// Load acquire
static inline int load_acquire(volatile int *p) {
    int val;
    __asm__ volatile ("ldar %w0, %1" : "=r"(val) : "Q"(*p));
    return val;
}

// Store release
static inline void store_release(volatile int *p, int val) {
    __asm__ volatile ("stlr %w1, %0" : "=Q"(*p) : "r"(val));
}

// Read system counter
static inline uint64_t read_cntvct(void) {
    uint64_t val;
    __asm__ volatile ("mrs %0, cntvct_el0" : "=r"(val));
    return val;
}

AArch64-specific constraints:

  • "Q" — memory operand suitable for exclusive/acquire/release instructions
  • "r" — any general-purpose register
  • "w" — any FP/SIMD register

7. NEON SIMD intrinsics

#include <arm_neon.h>

// Add 4 floats at once
float32x4_t a = vld1q_f32(arr_a);   // load 4 floats
float32x4_t b = vld1q_f32(arr_b);
float32x4_t c = vaddq_f32(a, b);
vst1q_f32(result, c);

// Horizontal sum
float32x4_t sum = vpaddq_f32(c, c);
sum = vpaddq_f32(sum, sum);
float total = vgetq_lane_f32(sum, 0);

Naming convention: v<op><q>_<type>

  • q suffix: 128-bit (quad) vector
  • _f32: float32, _s32: int32, _u8: uint8, etc.

For a register reference, see references/reference.md.

Related skills

  • Use skills/low-level-programming/assembly-x86 for x86-64 assembly
  • Use skills/compilers/cross-gcc for cross-compilation toolchain
  • Use skills/debuggers/gdb for debugging ARM code with gdbserver

Related skills

How it compares

Pick assembly-arm over assembly-x86 when targeting AArch64 embedded firmware, iOS/Android native code, or ARM cross-compilation toolchains.

FAQ

What ARM architectures does assembly-arm cover?

assembly-arm covers AArch64 (64-bit) and ARM Thumb (32-bit) assembly. The skill documents AAPCS64 for AArch64 and AAPCS for 32-bit ARM, including register width variants x0, w0, h0, and b0.

How does assembly-arm generate ARM assembly output?

assembly-arm guides agents to run aarch64-linux-gnu-gcc -S -O2 for AArch64 or arm-linux-gnueabihf-gcc -S -mthumb for 32-bit targets. Disassembly uses aarch64-linux-gnu-objdump -d -S or GDB disassemble /s main.

Rustbackend

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.