上代码
// 示例 C 代码
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
return a + b;
}
汇编
image.png
mov w8, #0xa ; 将十六进制值 0xa(十进制10)移动到 w8 寄存器
; =10 ; 注释,说明 0xa 等于十进制10
int w8 = 10; // 相当于 mov w8, #0xa
寄存器说明
在 ARM64 架构中:
w0-w30 - 32位寄存器(低32位)
x0-x30 - 64位寄存器
w8 是 x8 的低32位部分
mov w8, #0xa ; w8 = 10
mov w9, #0x14 ; w9 = 20
add w0, w8, w9 ; w0 = w8 + w9 = 10 + 20 = 30
不同架构的对比
x86-64:
mov eax, 10 ; Intel 语法
ARM32:
mov r0, #10 ; 没有 'w' 前缀
调试时的显示
在 VS Code 调试器中,你可能会看到:
mov w8, #0xa ; =10
这是调试器为了可读性添加的注释,帮助开发者快速理解十六进制值对应的十进制值。
简单说,这行代码就是 把数字10放到w8寄存器中。
相同的CPU架构汇编生成的硬编码是一样的。
比如 windows 和linux
55 push %rbp
55 push ebp
不同的位只是汇编风格不一样。win风格是MASM ,linux是ATT。
目标要掌握(CPU架构、指令集、汇编、硬编码机器码)之间的关系。
接下来是汇编风格
了解MASM 、NASM、ATT、ARM之间的关系。
1、MASM win的默认汇编风格
2、NASM 对MASM的优化 比如区分了大小写 MASM不区分 主要用于linux
linux 平台下 单纯写汇编 可以用NASM和ATT风格
内联汇编,只能用ATT风格
mov eax, 1(区别)
3、ATT linux默认的汇编风格 .s结尾 有%分号。
比如 push %ebp 操作寄存器
mov $1 ,%eax (区别)
4、ARM 汇编 IOT设备 非PC