汇编语言-考点篇

汇编语言考点整理。

第一章:汇编语言基础知识

常用ASCII表值

逻辑地址与物理地址

每个存储器单元可以用 “端基地址:段内偏移地址” 准确表达物理地址。

将逻辑地址中的段地址左移 4 位,加上偏移地址就得到 20 位物理地址。

8086 规定段地址低 4 位均为0,每段最大不超过 64KB。但是每段并不要求必须是 64KB,各段之间并不要求完全分开。两个逻辑段可以部分重叠甚至完全重叠,但各段内容是不允许发生冲突的。

寻址方式

一. 立即数寻址

操作数直接存放在机器代码中。

1
mov al, 02h ; 源操作数采用立即数寻址

二. 寄存器寻址

操作数存放在 CPU 内部寄存器 REG 中。

1
mov bx, ax ; 两个操作数均采用寄存器寻址

三. 存储器寻址

  1. 直接寻址
    指令中直接包含有效地址。

    1
    mov ax, [2000h] ; 源操作数 ds:[2000h]
  2. 寄存器间接寻址
    有效地址存放在寄存器中。

    1
    mov ax, [si] ; 源操作数 ds:[si]
  3. 寄存器相对寻址
    有效地址是寄存器内容与有符号8位或16位位移量之和。

    1
    2
    mov ax, [di+06h] ; 源操作数 ds:[di+06h]
    mov ax, [bp+06h] ; 源操作数 ss:[bp+06h]
  4. 基址变址寻址
    把一个基址寄存器 (BX/BP) 加上变址寄存器 (SI/DI) 构成有效地址。

    1
    2
    mov ax, [bx+si] ; 源操作数 ds:[bx+si]
    mov ax, [bp+di] ; 源操作数 ss:[bp+di]
  5. 相对基址变址寻址
    把一个基址寄存器 (BX/BP) 加上变址寄存器 (SI/DI) 再加上有符号8位或16位位移量构成有效地址。

    1
    mov ax, [bx+si+06h] ; 源操作数 ds:[bx+si+06h]

下图展示典型的可行指令操作数组合:

第二章:8086 指令系统

指令用法

常用基本指令见:8086指令系统 | 小花生

关注这几个特殊的指令。

  1. cbw 与 cwd
1
2
cbw ; 字节转换为字(把AL中字节的符号扩展到AH中去)
cwd ; 字转换为双字(把AX中的字的符号扩展到DX中去)
  1. nop
1
nop ;不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期
  1. xlat
1
2
3
4
xlat                    ; al <- ds:[bx+al]
; 使用前,将表格的首地址存在BX寄存器中
; 将需要转换的代码(偏移量)存在AL寄存器中
; 执行换码指令后,将AL寄存器中的内容转换为目标代码
  1. 标志位操作
1
2
3
4
clc                        ; CF <- 0
stc ; CF <- 1
cld ; DF <- 0
std ; DF <- 1

常见指令错误

  • 两操作数类型不匹配
  • 立即数不允许传给段寄存器
  • 段寄存器之间不允许传送
  • 立即数不允许作目的操作数
  • sp寄存器不直接用于访问数据
  • cs段寄存器不能赋值
  • 堆栈的操作数不能是字节量
  • ……

学习每一条指令的时候看清楚适用范围 + 记住哪些寄存器不能直接访问。

指令指针 IP 不是通用寄存器,不可直接赋值,有且仅有循环、转移、子程序调用与返回、中断类指令可以改变它的值。

第三章:汇编语言程序格式

汇编语言-程序篇 | 小花生

第四章:基本汇编语言程序设计

汇编语言-程序篇 | 小花生

第五章:高级汇编语言程序设计

宏结构:宏汇编、重复汇编、条件汇编

宏汇编

宏定义:

1
2
3
宏名 macro [形参表]
宏定义体
endm

宏调用:宏调用的实质是在汇编过程中进行宏展开

1
宏名 [实参表]
1
2
3
4
&      ; 替换操作符, 用于将参数与其他字符分开。
< > ; 字符串传递操作符, 宏调用中用于括起字符串
! ; 转义操作符用于指示其后的一个字符作为一般字符,不含特殊意义
% ; 表达式操作符, 用在宏调用中, 表示将后跟的一个表达式的值作为实参, 而不是将表达式本身作为参数

重复汇编

按参数值重复:

1
2
3
repeat 重复次数
重复体
endm

按参数个数重复:

1
2
3
for 形参, <实参表>
重复体
endm

按参数字符个数重复:

1
2
3
forc 形参, 字符串
重复体
endm

条件汇编

1
2
3
4
5
if ...
...
else
...
endif

第六章:32 位指令及其编程

16位逻辑段:段地址和偏移地址都是16位:段地址左移4位加偏移地址形成20位物理地址

32位逻辑段:段地址和偏移地址都是32位:段地址加偏移地址形成32位线性地址

32位有效地址=基址寄存器+(变址寄存器 × 比例)+位移量

  • 基址寄存器——任何 8 个 32 位通用寄存器之一
  • 变址寄存器——除 ESP 之外的任何 32 位通用寄存器之一
  • 比例——可以是 1 / 2 / 4 / 8
  • 位移量——可以是 8 / 32 位值

第七章:汇编你语言与 C/C++ 的混合编程

有两种混合编程方式:嵌入式汇编、模块连接

实例见C语言 link 汇编语言 | 小花生