跳转至

独立汇编与机器码

显示机器码

./bisheng -cc1as \
  -triple hiipu64-hisilicon-cce \
  -target-cpu dav-c220-vec \
  -filetype asm \
  -show-encoding \
  -o - vector.s

输入:

    .text
    .a64
    .globl vector_example
vector_example:
    MOV X3, #0
    MOVEMASK MASK[0], X3
    MOVEMASK MASK[1], X3
    VADD.s16 [X0], [X1], [X2], X3, MASK
    RET

输出:

MOV       X3, #0                             // [0x00,0x00,0x06,0x07]
MOVEMASK  MASK[0], X3                        // [0x0c,0x00,0x40,0x80]
MOVEMASK  MASK[1], X3                        // [0x8c,0x00,0x40,0x80]
VADD.s16  [X0], [X1], [X2], X3, MASK        // [0x0c,0x11,0x80,0x85]
RET                                          // [0x00,0xf0,0x61,0x40]

Cube 文件把 CPU 改为 dav-c220-cube

生成目标文件

./bisheng -cc1as \
  -triple hiipu64-hisilicon-cce \
  -target-cpu dav-c220-vec \
  -filetype obj \
  -o vector.o vector.s

输出是 64 位小端 ELF 可重定位文件,e_machine0x1029

汇编检查

只检查语法而不保留输出:

./bisheng -cc1as \
  -triple hiipu64-hisilicon-cce \
  -target-cpu dav-c220-vec \
  -filetype null vector.s

加入头文件/汇编包含目录:

./bisheng -cc1as ... -I include_dir source.s

标签与重定位

分支应优先使用标签,不要手工计算最终 PC 偏移:

entry:
    CMP.EQ.s64 X0, #0
    JUMPC done
    NOP
done:
    RET

若某条控制流语法只接受立即数而不接受标签,应以汇编器诊断为准;不要直接把示例中的 #0 当成实际目标地址。

验证单条指令

  1. 建立包含 .text.a64RET 的最小文件。
  2. 使用正确的 vec/cube CPU。
  3. -filetype asm -show-encoding 检查规范化输出。
  4. 保存输出的四个小端字节和 bisheng 版本。
  5. 再把完整函数编译成目标文件,检查重定位和符号。