汇编语言快速回顾(以x86_64为例)

大学本科教育中有两门课可能涉及汇编语言的讲解,一门是《微机原理与接口技术》,一门是《计算机组成原理与汇编》,但它们讲解的往往是16位或32位指令集架构,分别以 Intel 8086 芯片和 80386 芯片为代表。随着64位系统的广泛应用,目前的主流架构转向了 x86_64,同时基于 Linux 系统的汇编环境与微软的汇编环境也不完全相同,因此有必要在大学课程基础上做一定扩展。

参考书籍:汇编程序设计与计算机体系结构:软件工程师教程

一、64位的寄存器💾

xx位 指的是 CPU 的通用寄存器(General Purpose Register)的数据宽度为 xx 位比特。

Note: 尽管当前的 x86_64 处理器是64位的,但只用到了低48位,因此理论上可以寻址 264 比特的地址空间,实际上只支持 248 比特。

64位32位64位32位
通用寄存器RAXEAX段寄存器/CS
RBXEBX/DS
RCXECX/ES
RDXEDX/SS
RSIESI/FS
RDIEDI/GS
RBPEBP指令指针寄存器RIPEIP
RSPESP标志寄存器RFLAGSEFLAGS
R8~R15///

由上表可以看出共有四类寄存器:通用寄存器(64位有16个,32位有8个),段寄存器(64位没有段寄存器),指令指针寄存器和标志寄存器。汇编程序操作的一般都是通用寄存器。从16位发展到32位,再到64位,各个体系都做到向前兼容。因此在64位架构下,依然可以操作如 EAX 这样的32位寄存器,它对应的是 RAX 寄存器的低32位。当使用小位数寄存器的名义操作大位数寄存器时,实际上操作的是大位数寄存器中与小位数相对应那部分寄存器。
例如,以 AX 的名义操作 EAX,实际上操作的就是 EAX 的低16位,因此会破坏原本 EAX 中的部分数据。

在这里插入图片描述

1.1 部分寄存器有特殊用途

  • rax/eax 通常是累加寄存器,一般数据不要保存在这类寄存器中。调用函数时的返回值应保存在 rax/eax 中。
  • rcx/ecx 在循环过程中记录循环计数器的值,因此在循环内部不应使用这类寄存器保存一般数据。
  • rbp/ebp 栈帧中的帧指针,用于指向栈中的数据。
  • rsp/esp 栈帧中的栈指针,通常指向活动栈帧的顶部。
  • rip/eip 是指令指针寄存器,指向接下来应获取、解码并执行的指令的内存地址,不应手动修改
  • rdi/edi 和 rsi/esi 是索引寄存器,用于字符串操作
  • rflags/eflags 是状态与控制寄存器,与 LAHF 以及 SAHF 指令配合使用,除此以外不可直接修改该寄存器。

rflags 中可用的只有低32位,因此 x86 与 x86_64 共用一套状态标志。

1.2 标志位和 LAHF、SAHF 指令

LAHF = Load AH Flags, SAHF = Save AH Flags
由英文含义可以知道,LAHF 是向 AH 寄存器(AH 是 AX 寄存器的高8位)中加载状态标志位;SAHF 是保存 AH 寄存器中的内容到状态标志位。但我们由前面的介绍知道,rflags/eflags 是32位寄存器,而 AH 寄存器只有8位,那么是哪些标志位可以传给 AH (或通过 AH 加载)呢?关注的8个标志位如下(实际上就是状态寄存器的低8位

76543210
SF(符号标志位)ZF(零标志位)U 恒为0AF(辅助进位标志位)U 恒为0PF(奇偶校验标志位)U 恒为1CF(进位标志位)

表格中的 U 表示 Unused,即这些位用不到(也可以理解为暂时保留),第1位应始终为1,第3、5位应始终为0。

BCD 码指用 4 位二进制数表达 1 位十进制数的编码方式。如 0b 0110 = 0d 6。

  • CF = Carry Flag, 无符号整数加法需要进位或无符号整数减法需要借位时设置。
  • PF = Parity Flag,结果中值为 1 的二进制位数是偶数个时设置。
  • AF = Auxiliary Carry Flag,用于 BCD 码的进位,当低 4 位需要向高 4 位进位或借位时设置。
  • ZF = Zero Flag,结果为 0 时设置。
  • SF = Sign Flag,结果是负值时设置(即结果用补码表示且最高位为1)。

🎊插曲:琳琅满目的XPU

CPU,中央处理单元,是计算机的核心,能够处理广泛类型的工作。除 CPU 外的 XPU 都可以理解为针对特定任务的加速处理单元
GPU,图形处理单元,专注于处理 3D 渲染、视觉效果真实性等图形处理任务;TPU (Tensor Processing Unit) ,张量处理单元,用于神经网络张量计算的加速任务;FPU (Floating-Point Unit) ,浮点运算单元,它通常整合在 CPU 中,专注于浮点运算任务;NPU (Neural-network Processing Unit) ,神经网络处理单元,采用“数据驱动并行计算”的架构,擅长处理视频、图像类的海量数据。

二、汇编语言基础📚

目前有三种较为流行的汇编器

GAS (GNU Assembler) 是一款基于 Linux 的汇编器,主要供 GNU 项目使用,用于对 Linux 内核及其他软件进行进行汇编。
MASM (Microsoft Macro Assembler) 是微软操作系统的专属汇编器,于 1981 年随 Visual Studio 一起发布。
NASM (Netwide Assembler) 的设计初衷是当时没有一个免费且好用的x86汇编器,目前是 Linux 平台上最受欢迎的汇编工具之一。

汇编器语法规则可使用的开发环境
GASAT&TApple Xcode
MASMIntelVisual Studio
NASMIntelLinux 命令行编辑工具

本科阶段学习的应该都是 Intel 语法,没办法,谁让 Microsoft 统治第三世界呢。AT&T 语法和 Intel 语法还是存在许多区别的,之后的语法规则都是基于 AT&T,至于 Intel 的规则,不妨翻出那本落满灰尘的教材或者找一门慕课吧。

2.1 汇编代码的五大支柱(基本单元)

保留字、命令(directive,国内通常称为伪指令或伪操作)、区段、标识符和指令(instruction)。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值