实战简单代码

上代码

// 示例 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容