组成原理

Topic · Three Contracts Side by Side

三大 ISA
对照

同一段极简 C:把数组加总。仅讨论 a 指向至少 n 个有效 int、且累加不发生有符号溢出的定义域(C 的 signed 溢出未定义),避免把三段机器级回绕当成 C 的普遍等价。下面三列是自写汇编示意,指令语义按各自手册对齐,不是某编译器的最优输出(未展开、未 SIMD、未改成指针递增)。结论只有一句:三套契约,设计取舍不同。不评「谁更好」,也不把某一列助记符默成 408 必背表。

01同一段逻辑

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 的普遍语义。

02三列示意

ABI,不是 ISA参数放哪只寄存器,属于调用约定(ABI):System V AMD64、AAPCS64、RISC-V 整数 psABI。ISA 管可见寄存器集合、编码与语义。沿用书笔记已钉的分界。

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

ARM64 · AAPCS64:a=x0,n=w1,返回 w0

    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

RV64 · 整数约定:a=a0,n=a1,返回 a0

    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 等)。

03对照维度

维度x86-64AArch64RV64I
指令长度 / 编码变长,1–15 字节A64 定长 32 位基址定长 32 位;C 扩展另有 16 位,本列未用
寻址基址+变址×比例+位移,可直接访存加基址+变址(可带符号扩展与比例)Load/Store 典型为基址+12 位立即数,本列显式 slli+add
寄存器16 个通用寄存器31 个通用(另有 SP;WZR/XZR 为零)32 个;x0 硬件接 0
调用约定(ABI)SysV:前六个整数参数 rdi…r9,返回 raxAAPCS64:x0–x7,返回 x0a0–a7,返回 a0
条件cmp 写标志,再 jcccmp 写 NZCV,再 b.cond(另有不改标志的 cbz 等)无条件码;比较与转移合一(bge)

RISC 常见「定长、Load/Store」、CISC 常见「变长、可直接访存」是特征,不是速度排名。取指仍跟 PC;分支改下一条地址。