第一章
- 计算机组成
五部分:(运算器、控制器)、存储器、输入/输出设备
↑↑ CPU ↑↑ ↑内存↑
三条总线:控制总线、地址总线、数据总线
- 不同进制及BCD码的转换
- 特殊ascll
‘0’~‘9’—— 30H ~ 39H
‘A’~‘F’—— 41H ~ 46H
回车 —— 0DH
换行 —— 0AH
- 溢出判断
- 运算器对有符号数和无符号数同等对待
- 进位保存在CF9(进位标志位)中
- 当参与运算的两数符号相同,结果符号却他们相异时,判断溢出
第二章
- 16位寄存器
AX、BX、CX、DX
SI、DI
BP、SP
其中AX、BX、CX、DX可分为高位,低位两个八位寄存器使用
如:
- 32位操作系统工作模式
a. 实模式
b. 保护模式
c. 虚拟86模式
- 实模式的特点
a. 加电复位之后,486工作在实模式下,系统在Dos管理下
b. 只能访问 1M 内存
c. 存储管理部件对存储器只分段,不分页,每段最大64KB
d. 段寄存器中存放段基址
- 实模式下段寄存器存放相应逻辑段基址
逻辑段 段基址 偏移地址
代码段 CS IP
堆栈段 SS SP
数据段 DS 根据不同的寻
附加段 ES 址方式,选择BX/SI/DI
- 物理地址 = 段基址 * 2^4 + 偏移量
- 虚拟地址、线性地址、物理地址
虚拟地址 ——> 分段部件 = 线性地址
线性地址 ——> 分页部件 = 物理地址
在实模式下,没有分页部件,即 线性地址 = 物理地址
第三章
- 指令
指令 = 操作码 + 操作数
指令格式如下:
标号:操作码助记符 [TAB] 操作数(多个操作数用 , 隔开) ;注释
其中,标号表示该条指令的符号地址(逻辑地址),以下划线或字母开始不超过31个字符
- 标志寄存器
C、A、S、P、Z、O
- C(进位/借位标志)
加减法执行后,最高位产生进位或借位,则C置1,否则置0
2. A(辅助进位/借位)
加法或减法执行后,D3向D4有进位或借位,则A置1,否则置0
3. S(符号寄存器)
S标志记录结果的最高位的值
4. P(奇偶标志)
根据运算结果低8位中 1 的个数判定,个数为偶数则P置1,奇数则置0(P只关心低8位)
5. Z(全〇标志)
isZero( ) 若全为零则置1
6. O(溢出标志位)
若溢出则置1
- 寻址方式
- 立即寻址
只能用于源操作数,不能用于目标操作数
常用于赋值
16进制表示时,开头为 A~F时,需要在开头加0
2. 寄存器寻址
立即数在寄存器中
3. 直接寻址
形式:
a. 段寄存器:[偏移地址] 如:Mov AX, DS:[45H]
b. 段寄存器:变量名 如:Mov AX, DS:Buf
4. 间接寻址
BP SS
BX SI DI DS
5. 基址寻址
BP SS
BX DS
段寄存器:[基址寄存器 + 位移量]
6. 变址寻址
SI DI DS
段寄存器:[比例因子 * 变址寄存器 + 位移量]
7. 基+变
段寄存器:[基址寄存器 + 比例因子 * 变址寄存器 + 位移量]
- 符号指令和伪指令
;数据定义伪指令 用于定义变量
DB 定义字节变量
DW 定义字变量
DD 定义双字变量;符号定义伪指令 用于定义常量和符号名
EQU 等值伪指令(定义出来视为常量)
= 等号伪指令(等号伪指令定义出来的常量值可变,EQU定义出来的不可变);数值回送运算符
SEG 回送逻辑段的段基址或标号/变量所在逻辑段的段基址
OFFSET 回送标号/变量的偏移地址
TYPR 回送标号或变量的类型(字节返回1,字返回2,双字返回3)
$ 使用 $ 统计之前的所有字符长度, 常数不算(紧跟在DBDWDD之后可以统计字符串长度);属性操作符
PTR 格式
类型说明符 PTR 标号或变量的地址表达形式
1. 寄存器前不能加 PTR, 内存数前才可以
2. 长度不确定时使用,MOV WORD PTR [BX], 1234
3. 有变量且长度不一致,MOV AX, WORD PTR BUF
- 基本指令集
1. MOV
格式:MOV 目标操作数, 源操作数立即数不能做目标操作数
不可同时操作内存数
不可同时操作段寄存器
不允许将立即数传入段寄存器2. LEA 偏移地址传送指令
格式:LEA 目标操作数, 源操作数MOV BX, OFFSET BUF
LEA BX, BUF
上两句等价目标操作数要为16/32位寄存器,不影响6个标志位3. XCHG
格式:XCHG 目标操作数, 源操作数
将目标操作数和源操作数数据交换不能同时为内存数,段寄存器,立即数4. 堆栈操作
进出堆栈 的数据长度必须为字或双字
4.1 PUSH
格式:PUSH 操作数
将源操作数压入栈中,16位时 (sp)-2 -> (sp)
4.2 POP
格式:POP 操作数
将栈顶元素弹出,(sp)+ 2 -> (sp)
4.3 PUSHA/POPA
全部压入栈/弹出栈5.加减法
5.1 加法
5.1.1 ADD
格式:ADD 目标操作数, 源操作数
源操作数 + 目标操作数 -> 目标操作数
两数等长,且不可同为内存数,段寄存器
5.1.2 ADC
格式:ADC 目标操作数, 源操作数
(CF)+ 目标操作数 + 源操作数
5.2 减法
5.2.1 SUB
格式:SUB 目标操作数, 源操作数
目标操作数 - 源操作数 -> 目标操作数
5.2.2 SBB
格式:SBB 目标操作数, 源操作数
目标操作数 - 源操作数 - (CF) -> 目标操作数
6 CMP
格式:CMP 目标操作数,源操作数
只改变6个标志位,不保存运算结果
目标操作数不可为立即数
7 自增自减
7.1 INC
格式:INC 目标操作数
目标操作数自增1
7.2 DEC
格式:DEC 目标操作数
目标操作数自减1
8 NEG
格式:NEG 目标操作数
将目标操作数求补后(即0-目标操作数)的结果(补码的形式)送入目标操作数
9 逻辑运算
9.1 AND(与)
格式:AND 目标操作数,源操作数
将目标操作数与源操作数相与,送入目标操作数
常常用于指定位清零(置0)
9.2 OR(或)
格式:OR 目标操作数,源操作数
将源操作数与目标操作数相或,放入目标操作数
常用于指定位置1
9.3 NOT(非)
格式:NOT 目标操作数
将目标操作数按位取反,送回目标操作数中
9.4 XOR(异或)
格式:XOR 目标操作数,源操作数
将目标操作数和源操作数异或,送入,目标操作数中
常用于指定位取反
10 TEST(测试指令)
格式:TEST 目标操作数,源操作数
将两数进行与运算,结果不保存,C、O置0,对A未定义,S、P、Z按结果设置
11 移位指令
11.1 开环移位指令 算术左移: SAL 操作数,移位次数算术右移: SAR 操作数,移位次数逻辑左移: SHL 操作数,移位次数逻辑右移: SHR 操作数,移位次数
11.2 闭环移位指令含进位的循环左移: RCL 操作数,移位次数含进位的循环右移: RCR 操作数,移位次数不含进位的循环左移:ROL 操作数,移位次数不含进位的循环右移:ROR 操作数,移位次数
12 循环转移指令
12.1 JMP(无条件转移)
格式:JMP 标号
12.2 LOOP
格式:LOOP 标号
例:MOV CX, 7
A: ...LOOP A
即循环7次
12.3 条件转移指令
JZ/JE Z为1
JNZ/JNE Z为0
JS S为1
JNS S为0
JO O为1
JNO O为0
JP P为1
JNP P为0
JC C为1
JNC C为0
12.4 无符号数大小比较(CMP X, Y)
JA X > Y
JNA X <= Y
JC X < Y
JNC X >= Y
12.5 有符号数大小比较(CMP X, Y)
JG X > Y
JGE X >= Y
JL X < Y
JLE X <= Y
13 子程序
子程序格式:
CALL [子程序名]
...
...
[子程序名] PROC
...
RET
ENDP
第四章
- EXE源程序的编程结构
DATA SEGMENT USE16
......
(数据定义)
DATA ENDS
CODE SEGMENT USE16
BEG: ...
... ...
CODE ENDS
END BEG
- 开发过程
a. 编辑程序,设该程序为 a.asm
b. 汇编该程序 masm a.asm(书上为:ml/c a.asm)产生 a.obj文件
c. 链接 link a.obj
d. 执行 a.exe
- 部分dos/bios功能
- 01H
例子: MOV AH, 1
INT 21H
等待从键盘输入一个字符,同时将该字符显示在显示器上
入口参数:无
出口参数:AL = 按键 ASCLL值
2. 02H
例子:MOV DL, 'A'
MOV AH, 2
INT 21H
在屏幕上显示一个字符,光标右移一位
入口参数:DL = 显示字符的ASCLL
出口参数:无
注:会破坏AL寄存器
3. 09H
显示字符串
入口参数:DS:DX = 字符串首地屏幕上 ,字符串必须'$'结尾
出口参数:无
注:会破坏AL
4. 0AH
等待字符串输入,保存入缓冲区,同时在屏幕上显示
入口参数:DS: DX = 输入数据缓冲区首地址
以回车为标志,缓冲区首单元放置预计可接受字符个数,buf+1格放置实际字符数(不包含回车),符串由buf+2 开始存储。缓冲区不接受超长字符。
5. 0EH
bios:输出字符。
MOV AH 0EH
MOV AL ‘A’
INT 10H