x86-64 · SysV:a=rdi,n=esi,返回 eax
xor eax, eax
xor ecx, ecx
.L1:
cmp ecx, esi
jge .L2
add eax, [rdi+rcx*4]
inc ecx
jmp .L1
.L2:
ret
int sum(const int *a, int n) {
int s = 0;
for (int i = 0; i < n; i++)
s += a[i];
return s;
}
约定:int 为 32 位有符号;指针按 64 位 ABI 传递。循环用有符号比较。返回值走各 ABI 的整数返回寄存器。仅讨论 a 指向至少 n 个有效 int、且累加不发生有符号溢出的定义域——C 的 signed 溢出未定义,机器级回绕不是这段 C 的普遍语义。
xor eax, eax
xor ecx, ecx
.L1:
cmp ecx, esi
jge .L2
add eax, [rdi+rcx*4]
inc ecx
jmp .L1
.L2:
ret
mov w2, wzr
mov w3, wzr
.L1:
cmp w3, w1
b.ge .L2
ldr w4, [x0, w3, sxtw #2]
add w2, w2, w4
add w3, w3, #1
b .L1
.L2:
mov w0, w2
ret
li t0, 0
li t1, 0
.L1:
bge t1, a1, .L2
slli t2, t1, 2
add t2, a0, t2
lw t3, 0(t2)
add t0, t0, t3
addi t1, t1, 1
j .L1
.L2:
mv a0, t0
ret
li / j / mv / ret 为标准汇编伪指令,均可展开为 RV64I 基础指令(addi / jal / jalr 等)。
| 维度 | x86-64 | AArch64 | RV64I |
|---|---|---|---|
| 指令长度 / 编码 | 变长,1–15 字节 | A64 定长 32 位 | 基址定长 32 位;C 扩展另有 16 位,本列未用 |
| 寻址 | 基址+变址×比例+位移,可直接访存加 | 基址+变址(可带符号扩展与比例) | Load/Store 典型为基址+12 位立即数,本列显式 slli+add |
| 寄存器 | 16 个通用寄存器 | 31 个通用(另有 SP;WZR/XZR 为零) | 32 个;x0 硬件接 0 |
| 调用约定(ABI) | SysV:前六个整数参数 rdi…r9,返回 rax | AAPCS64:x0–x7,返回 x0 | a0–a7,返回 a0 |
| 条件 | cmp 写标志,再 jcc | cmp 写 NZCV,再 b.cond(另有不改标志的 cbz 等) | 无条件码;比较与转移合一(bge) |
RISC 常见「定长、Load/Store」、CISC 常见「变长、可直接访存」是特征,不是速度排名。取指仍跟 PC;分支改下一条地址。