A1: 汇编基础

基本组成元素

Instruction

MOV

1
2
3
MOV AX, 1 ; 将值1存储到AX寄存器中
MOV BX, AX ; 将AX寄存器中的值存储到BX寄存器中
MOV [BX], 2 ; 将值2存储到BX寄存器指向的内存地址中

ADD SUB

1
2
3
MOV AX, 1 ; 将值1存储到AX寄存器中
ADD AX, 2 ; 将AX寄存器中的值加上2,结果存储回AX寄存器中
SUB AX, 1 ; 将AX寄存器中的值减去1,结果存储回AX寄存器中

INC DEC

1
2
3
MOV AX, 1 ; 将值1存储到AX寄存器中
INC AX ; 将AX寄存器中的值加1,结果存储回AX寄存器中
DEC AX ; 将AX寄存器中的值减1,结果存储回AX寄存器中

AND OR XOR

1
2
3
4
5
MOV AX, 1 ; 将值1存储到AX寄存器中
MOV BX, 2 ; 将值2存储到BX寄存器中
AND AX, BX ; 将AX寄存器中的值和BX寄存器中的值进行按位与运算,结果存储回AX寄存器中
OR AX, BX ; 将AX寄存器中的值和BX寄存器中的值进行按位或运算,结果存储回AX寄存器中
XOR AX, BX ; 将AX寄存器中的值和BX寄存器中的值进行按位异或运算,结果存储回AX寄存器中

MOVSB

  • 源地址中的字节复制到目标地址,并将指针都加上1

LOOP

  • LOOP指令会将CX寄存器中的计数器值减1,然后检查计数器的值是否为0,如果不为0则跳转到标号所指定的位置继续执行循环体,否则退出循环

NOP

  • No Operation,目的为延时填充

CMP TEST

  1. CMP指令将第一个操作数减去第二个操作数,并根据结果设置标志位,以表示比较的结果。
  • 如果第一个操作数大于第二个操作数,则标志位中的ZF(零标志位)将被清除,SF(符号标志位)和OF(溢出标志位)将被设置。

  • 如果第一个操作数等于第二个操作数,则ZF将被设置,SF和OF将被清除。

  • 如果第一个操作数小于第二个操作数,则ZF、SF和OF都将被清除。

  1. TEST将两个操作数进行逐位的逻辑AND运算,并设置标志位来指示运算结果。
  • 如果运算结果为0,则将零标志位(ZF)设置为1。

  • 如果运算结果中有奇数个1,则将奇偶标志位(PF)设置为1。

  • 将符号标志位(SF)设置为运算结果的最高位(即最左边的位)。

  • 将进位标志位(CF)和溢出标志位(OF)清零。

跳转指令

  1. 无条件跳转:JMP
1
2
3
4
    JMP Loop //跳转到Loop处
    ...
Loop:
    ...
  1. 条件跳转:JZ,JNZ
1
2
3
4
5
    MOV AX, 0
    JZ Zero //在ZF为1时跳转到Zero处
    ...
Zero:
    ... 
  1. 条件跳转: JE、JNE
1
2
3
4
5
6
    MOV AX, 5
    CMP AX, 5
    JE Equal //在ZF为1时跳转到Equal处
    ...
Equal:
    ...
  1. 条件跳转: JA、JAE、JB、JBE
1
2
3
4
5
6
    MOV AX, 10
    CMP AX, 5
    JA Greater //在AX中的值大于5时跳转到Greater处
    ...
Greater:
    ...

INT

1
2
3
MOV AH, 0x4C ; 设置AH寄存器为4Ch
MOV AL, 0 ; 设置AL寄存器为0,表示退出程序
INT 0x21 ; 触发中断,中断号为21h

DB EQU

  1. DB (Date Byte)
  • 范例
1
label DB initial_value[, additional_values...];实际操作中不需要中括号
  • 实例
1
MY_DATA DB 0x41 0x42 0x43 ; 定义了包含三个字节的数据段

运算符

offset

获取偏移量,即标签在程序中的地址段基址

修饰符

[ ]

1
2
mov [AX] BX ; 表示AX中的地址
mov AX [BX] ; 表示BX中的内容

Register (以x86为例)

通用寄存器

  1. 16位
AX 累加器寄存器
BX 基址寄存器
CX 计数器寄存器
DX 数据寄存器
SI(Source Index) 源地址寄存器
DI 目的地址寄存器
  1. 32位
  • 加上前缀E
  1. 64位
  • 加上前缀R

段寄存器

CS 代码段寄存器
DS 数据段寄存器
ES 附加段寄存器
SS 堆栈段寄存器
FS 存储一个段的基地址(与线程相关)
GS 存储一个段的及地址(与进程相关)

指针寄存器

PC 程序计数器
BP 基址指针寄存器
SP 堆栈指针寄存器
HP 管理堆内存的分配和释放
DP 数据指针(索引寄存器),用于数组或其他结构的访问

操作码

0:无操作

1:存储器读取

2:存储器写入

3:寄存器-寄存器算术操作

4:常量扩展和寄存器-立即数算术操作

5:逻辑操作

6:条件分支

7:无条件跳转

8:函数调用

9:函数返回

10:中断处理

11:输入输出

12-15:保留

Memory

Label

Constant

数值常量

1
2
3
4
5
1234 ; 十进制常量
0b1110 ; 二进制常量
0123h  ; 十六进制常量
0x41   ; 十六进制常量
0331o ; 八进制常量

字符常量

1
2
'A' 字符常量
'\'' 转义字符常量

字符串常量

1
"Hello,world"

符号常量

  1. 定义方式
  • 使用宏指令EQU定义
  1. 实例
  • 定义缓冲区大小
1
BUFFER_SIZE EQU 100

处理器

处理器状态 – 标志位(flags) —— 特殊的处理器状态

  1. 零标志位(ZF):最近执行的操作结果是否为0

  2. 符号标志位(SF):最近执行的操作结果的最高有效位(MSB)是否为1。

  3. 进位标志位(CF):在无符号数加法或减法中,判断结果是否超出了当前的数据类型范围. 在位运算中,该标志位通常表示最高位的溢出情况。

  4. 溢出标志位(OF):在有符号数加法或减法中,判断结果是否超出了当前的数据类型范围. 在位运算中,该标志位通常表示最高位的溢出情况。

  5. 奇偶标志位(PF):判断最近执行的操作结果的二进制表示中1的个数是否为偶数。

CPU的指令执行

取指(Fetch)

译码(Decode)

执行(Execute)

访存(Memory Access)

写回(Wirte Back)

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy