加载中...
汇编语言学习记录

机器语言与汇编语言

机器语言是机器指令的集合,而机器指令则是由一串二进制数表示。

汇编语言的主体是汇编指令,汇编指令是机器指令的助记符,是一一对应的关系;

汇编语言其他部分由编译器执行的伪指令和编译器识别的其他符号组成。

计算机的组成

我没有系统性的学习过计组的知识,这里是基于视频教程和8086(十六位)给出的一些知识点,若有错误请轻喷。

关于主板

主板由下面四个部分组成:

  • CPU
  • 总线
  • 内存
  • 扩展槽

CPU

CPU是计算机的核心组件,控制运作和运算,而提供指令和数据可以让它工作。

各个组成部分

  • 运算器:进行信息处理
  • 寄存器:进行信息存储
  • 控制器:协调组件工作
  • 内部总线:实现CPU内各个器件之间的联系

内存

存储单元

存储器中被划为若干个单元,从0开始编号。

地址空间

对应内存单元的个数,一个内存单元是1字节。

所有物理存储器被看作一个由若干单元组成的逻辑存储器,每个物理存储器占其中的一个地址段,也就是一段地址空间。

CPU读写数据就是在对应物理存储器中读写数据。

物理地址

每一个内存单元在所有内存单元构成的一维线性空间中都有唯一的地址,这个地址被称为物理地址。

例如:8086CPU用两个16位地址(段地址、偏移地址)合成一个20位的物理地址。

物理地址=段地址 X 16(左移四位) + 偏移地址

读写

CPU要进行数据读写,必须的交互:

  • 存储单元的地址(地址信息)
  • 器件的选择,读或写命令(控制信息)
  • 读或写的数据(数据信息)

总线

定义

基本认识:连接CPU和芯片的导线。

物理上是一根根导线的集合。

逻辑上分为三种:

  • 地址总线
  • 数据总线
  • 控制总线

地址总线

指定存储单元,宽度决定存储大小。

数据总线

控制CPU与内存和其他组件的数据传输,宽度决定传送速度。

控制总线

CPU通过控制总线对外部器件进行控制,宽度决定控制能力。

扩展槽

主板上用于插入各种扩展卡的物理插槽,主要作用是为计算机增加或升级功能,弥补主板自带功能的不足,如下图:

主板扩展槽与内存布局示意图

关于指令和数据

存储在内存或磁盘上,都是二进制信息。

由CPU决定二进制信息是指令还是数据。

数据用二进制B,十六进制H,八进制O,十进制D表示。

数据量:B KB MB GB TB

寄存器

什么不加是16位,加E是32位,加R是64位。

例如:AX EAX RAX

通用寄存器

  1. AX:Accumlator 累加器
  2. BX:Base 基地址寄存器
  3. CX:Count 计数器
  4. DX:Data 数据寄存器

以AX为例

十六位寄存器可以存储一个十六位数据。

最大值是二进制1111 1111 1111 1111,即十进制2^16 - 1(65535),十六进制的FFFF。

在8088中AX可以分为AH和AL(其他寄存器也一样)。

8086的字长为16bit,一个字可以存在一个十六位寄存器上,高位字节存在这个寄存器的高8位寄存器,低位字节存在低8位寄存器。

指针寄存器

  1. SP:Stack Pointer堆栈指针
  2. BP:Base Pointer基址指针

变址寄存器

  1. SI:Source Index源变址
  2. DI:Destination Index目的变址

指令指针寄存器

IP:Instruction Pointer存放下一条将要执行指令的偏移地址

段寄存器

  1. CS:Code Segment代码段
  2. DS:Data Segment数据段
  3. SS:Stack Segment堆栈段
  4. ES:Extra Segment附加段

标志寄存器

PSW:Program Status Word程序状态字

PSW 在 8086 中常称为FLAGS。

常用x86/x64汇编指令集

下面是一些常用的x86/x64汇编指令。

一、数据传送指令

指令操作示例说明
MOV目的 ← 源mov eax, 123最基础的数据传送
MOVZX零扩展传送movzx eax, bl8→32位,高位补0
MOVSX符号扩展传送movsx rax, al8→64位,保留符号
LEA取有效地址lea rbx, [rax+rcx*4]计算地址,不访问内存
XCHG交换xchg eax, ebx交换两个寄存器/内存的值
PUSH压栈push raxRSP -= 8, [RSP] = RAX
POP弹栈pop rcxRCX = [RSP], RSP += 8

二、算术运算指令

指令操作示例说明
ADD加法add rax, rbxRAX += RBX
SUB减法sub rsp, 32RSP -= 32
INC加1inc rcxRCX++
DEC减1dec rdxRDX—
NEG取负neg raxRAX = -RAX
MUL无符号乘mul rbxRDX:RAX = RAX * RBX
IMUL有符号乘imul rax, 5RAX *= 5
DIV无符号除div rbxRAX = RDX:RAX / RBX, RDX = 余数
IDIV有符号除idiv rbx同上,有符号版本

三、逻辑与移位指令

指令操作示例说明
AND按位与and rax, 0xFF保留低8位
OR按位或or rcx, rdx合并位
XOR按位异或xor rax, rax常用清零(等价 RAX=0)
NOT按位非not rbx逐位取反
SHL左移shl rax, 2RAX <<= 2(乘以4)
SHR逻辑右移shr rax, 1RAX >>= 1(除以2)
SAR算术右移sar rbx, 3保留符号右移
ROL/ROR循环左/右移rol al, 1循环移位

四、控制转移指令

无条件跳转

指令说明示例
JMP无条件跳转jmp label
CALL调用子程序call func
RET返回ret / ret 16

条件跳转(基于标志位)

指令条件说明
JE / JZZF=1相等/为零
JNE / JNZZF=0不等/非零
JG / JNLEZF=0且SF=OF有符号大于
JGE / JNLSF=OF有符号大于等于
JL / JNGESF≠OF有符号小于
JLE / JNGZF=1或SF≠OF有符号小于等于
JA / JNBECF=0且ZF=0无符号大于
JAE / JNBCF=0无符号大于等于
JB / JNAECF=1无符号小于
JBE / JNACF=1或ZF=1无符号小于等于

五、比较与测试指令

指令操作示例说明
CMP比较cmp rax, rbx执行减法,设置标志位
TEST测试test rax, rax按位与,设置标志位

六、字符串操作指令

指令说明常用前缀
MOVS复制字符串rep movsb
STOS存储字符串rep stosb
LODS加载字符串lodsb
CMPS比较字符串repe cmpsb
SCAS扫描字符串repne scasb

七、标志位操作指令

指令说明
CLC清除进位标志
STC设置进位标志
CMC取反进位标志
CLD清除方向标志(递增)
STD设置方向标志(递减)

八、常用伪指令(汇编器指令)

伪指令说明示例
DB / BYTE定义字节db 0x55
DW / WORD定义字(2字节)dw 1234
DD / DWORD定义双字(4字节)dd 0x12345678
DQ / QWORD定义四字(8字节)dq buffer
EQU定义常量SIZE equ 100
ALIGN地址对齐align 16

本文作者:$ubJ3C7 @ $ubJ3C7のBlog

本文链接:https://subj3ct-66.github.io/blog/assembly-study/

本文标题:汇编语言学习记录

本文版权:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

留言