Assembly Language¶
王爽老师的《汇编语言》
Chap1 基础知识 ¶
机器语言 ¶
机器语言 机器指令的集合
汇编语言的产生 ¶
汇编源程序 -> 汇编编译器编译为机器码 -> 计算机执行 寄存器 存储数据的器件
汇编语言的组成 ¶
汇编语言指令 - 汇编指令 机器码的助记符,有对应的机器码 - 伪指令 无对应机器码,由编译器执行,计算机并不执行 - 其他符号 如+、-、*、/等,由编译器识别,无对应机器码
存储器 ¶
指令和数据在存储器(内存)中存放
指令和数据 ¶
都是二进制信息
存储单元 ¶
微机存储器的容量以字节为最小单位
CPU 对存储器的读写 ¶
数据读写和外部器件(芯片)进行信息交互 - 地址总线 存储单元的地址(地址信息) - 控制总线 器件的选择,读或写的命令(控制信息) - 数据总线 读或写的数据(数据信息)
地址总线 ¶
地址总线 决定寻址能力
数据总线 ¶
数据总线 决定 CPU 和外界的数据传送速度
控制总线 ¶
控制总线 决定 CPU 对外部器件的控制能力 读信号输出 输出低电平表示将要读取数据 写信号输出 传送写信号
内存地址空间 ¶
地址总线可寻到的内存单元构成 CPU 的内存空间
主板 ¶
主板上的器件通过总线相连 器件 CPU、存储器、外围芯片组、扩展插槽 扩展插槽上插有RAM内存条和各类接口卡
接口卡 ¶
CPU 通过总线向接口卡发送命令 接口卡根据CPU的命令控制外设进行工作
各类存储器芯片 ¶
- 随机存储器(RAM) 主板上的RAM和插在扩展插槽上的RAM
- 只读存储器(ROM) 装有BIOS(基本输入/输出系统)
- 接口卡上的 RAM 对大批量输入输出数据进行暂时存储,如显示卡上的RAM,即显存
内存地址空间 ¶
物理存储器在逻辑存储器中占有一个地址段,即一段地址空间
Chap2 寄存器 ¶
通用寄存器 ¶
通用寄存器 AX、BX、CX、DX 16位寄存器 存储一般性的数据
字在寄存器中的存储 ¶
字节 byte 字 word
几条汇编指令 ¶
大小写不敏感 mov add
物理地址 ¶
物理地址 内存单元构成的存储空间为一维线性空间,每个内存单元有唯一地址
8086CPU 给出物理地址的方法 ¶
物理地址 = 段地址 X16+ 偏移地址 其他部件(提供段地址和偏移地址)-> 内部总线 -> 地址加法器 (合成物理地址)-> 输入输出控制电路 -> 地址总线 ->内存
本质含义 ¶
物理地址 = 基础地址 + 偏移地址 基础地址=段地址*16
段的概念 ¶
若干地址连续的内存单元视为一个段 16位地址的寻址能力位64KB,也即一个段的长度最大为64KB
段寄存器 ¶
段寄存器 CS、DS、SS、ES
CS 和 IP ¶
CS 和 IP 指示 CPU 当前要读取指令的地方,即 CPU 将 CS:IP 指示的内容当作指令执行 CS 代码段寄存器 IP 指令指针寄存器 - 从CS:IP指向的内存单元读取指令,读取指令进入指令缓冲器 - IP=IP+所读取指令的长度,从而指向下一条指令 - 执行指令
修改 CS、IP 的指令 ¶
传送指令 - 如mov - 不能用于设置CS、IP的值
转移指令 - 能修改CS、IP的指令 - 如jmp jmp 段地址:偏移地址 同时修改CS、IP jmp 某一合法寄存器 用寄存器中的值修改IP
代码段 ¶
实验 1 ¶
- R 查看、改变 CPU 寄存器的内容
- D 查看内存中的内容
- E 改写内存中的内容
- U 将内存中的机器指令翻译成汇编指令
- T 执行一条机器指令
- A 以汇编语言的格式在内存中写入一条机器指令
Chap3 寄存器(内存访问)¶
内存中字的存储 ¶
字单元
DS 和 [address] ¶
mov - 将数据直接送入寄存器 - 将一个寄存器中的内容送入另一个寄存器 - 将内存单元中的内容送入寄存器 ds为内存单元的段地址 不支持将数据直接送入段寄存器
字的传送 ¶
注意小端
mov、add、sub 指令 ¶
add、sub 不能直接对段寄存器进行操作
数据段 ¶
讲一段内存当作数据段
栈 ¶
栈的操作规则 LIFO 后进先出
CPU 提供的栈机制 ¶
入栈操作和出栈操作均以字为单位 SS:IP指向栈顶元素 push 压入 - SP=SP-2 以当前栈顶前面的单元为新的栈顶 - 将数据送入SS:IP指向的内存单元处,此时SS:SP指向新栈顶 pop 弹出 - 送入数据 - SP=SP+2
栈顶超界的问题 ¶
需要根据可能用到的最大栈空间安排栈的大小
push、pop 指令 ¶
可以对寄存器、段寄存器、内存单元进行操作
栈段 ¶
实验 2 ¶
Chap4 第一个程序 ¶
一个源程序从写出到执行的过程 ¶
编写(文本文件) -> 编译(目标文件)连接(可执行文件,包括程序和数据、相关的描述信息) -> 执行
源程序 ¶
伪指令 ¶
伪指令是编译器执行的指令 - segment 和 ends 定义段 - end 汇编程序的结束标记 - assume 将特定用途的段与相关的管寄存器关联起来
程序 ¶
程序 源程序中最终由计算机执行、处理的数据或指令
标号 ¶
指代一个地址
程序的结构 ¶
- 定义段
- 写入指令
- 指出程序结束
- 关联段寄存器
程序返回 ¶
程序返回 一个程序结束后,将 CPU 的控制权交还给使它得以运行的程序 mov ax,4c00H int 21H
语法错误和逻辑错误 ¶
编辑源程序 ¶
edit
编译 ¶
masm 程序中有Severe Errors 找不到所给出的源程序文件
链接 ¶
link
以简化的方式进行编译和连接 ¶
分号
执行 ¶
谁将可执行文件中的程序装载进入内存并使它运行 ¶
command 加载
程序执行过程的跟踪 ¶
- ds 中存放程序所在内存区的段地址,偏移地址为 0
- 内存区前 256 个字节存放 PSP,DOS 利用 PSP(程序段前缀)来和被加载程序进行通信,向后是程序
实验 3 ¶
Chap5 [BX] 和 loop 指令 ¶
[BX]¶
inc 自增
Loop 指令 ¶
- (cx)=(cx)-1
- 判断 cx 中的值,不为零则转至标号处,为零则向下执行 cx存放循环次数
在 Debug 中跟踪用 loop 指令实现的循环程序 ¶
在汇编源程序中,数据不能以字母开头
Debug 和汇编编译器 masm 对指令的不同处理 ¶
loop 和 [bx] 的联合运用 ¶
段前缀 ¶
段前缀 用于显式地知名内存单元的段地址
一段安全的空间 ¶
段前缀的使用 ¶
实验 4 ¶
Chap6 包含多个段的程序 ¶
在代码段中使用数据 ¶
dw define world 定义字型数据 end 除了通知编译器程序结束外,还可以通知程序入口在什么地方
在代码段中使用栈 ¶
将数据、代码、栈放入不同的段 ¶
实验 5 ¶
Chap7 更灵活的定位内存地址的方法 ¶
and 和 or 指令 ¶
and 按位与 or 按位或
关于 ASCII 码 ¶
以字符形式给出的数据 ¶
'' 转化为 ASCII 码
大小写转换的问题 ¶
采用 and 和 or
[bx+idata]¶
用 [bx+idata] 的方式进行数组的处理 ¶
SI 和 DI ¶
和 bx 功能相近
[bx+si] 和 [bx+di] ¶
[bx+idata] 和 [bx+di+idata] ¶
不同的寻址方式的灵活应用 ¶
实验 6 ¶
Chap8 数据处理的两个基本问题 ¶
bx、si、di 和 bp ¶
可以用来寻址的寄存器 bx、si、di、bp 可以单个出现,或者以4种组合出现 bx和si、bx和di、bp和si、bp和di 如果使用寄存器bp,而指令中没有显式地给出段地址,段地址默认在si中
机器指令处理的数据在什么地方 ¶
指令在执行前,处理的数据在 3 个地方:CPU 内部、内存、端口
汇编语言中数据位置的表达 ¶
立即数 执行前在 CPU 的指令缓冲器中 寄存器 在寄存器中 段地址(SA)和偏移地址(EA) 段地址可以默认或显性给出
寻址方式 ¶
- 直接寻址 [idata]
- 寄存器间接寻址 [bx]
- 寄存器相对寻址 结构体 [bx].idata 数组 idata[si], 二维数组 idata[di] [bx][idata]
- 基址变址寻址 二维数组 [bx][si]
- 相对基址变址寻址 表格(结构)中的数据项 [bx].idata[si] 二维数组 idata[bx][si]
指令要处理的数据有多长 ¶
- 通过寄存器名指明
- X ptr
寻址方式的综合应用 ¶
div 指令 ¶
- 除数:8 位或 16 位,在一个 reg 中或内存单元中
- 被除数:默认放在 AX 或 DX 和 AX 中,被除数为 16 位,则为 AX,被除数为 32 位,AX 为低 16 位,DX 存放高 16 位
- 结果:除数是 8 位,AL 存储商,AH 存储余数;除数是 16 位,AX 存储商,DX 存储余数
伪指令 dd ¶
存双字
dup¶
db 3 dup (0,1,2)
实验 7 ¶
Chap9 转移指令的原理 ¶
段内转移 只修改 IP,又可分为近转移和短转移 段间转移 同时修改CS和IP 转移指令可分为: - 无条件转移指令 - 条件转移指令 - 循环指令 - 过程 - 中断
操作符 offset ¶
操作符 offset 取得标号的偏移地址
jmp 指令 ¶
转移目的地址 转移距离
依据位移进行的 jmp 指令 ¶
jmp short 标号 jmp near ptr 标号
转移的目的地址在指令中的 jmp 指令 ¶
jmp far ptr 标号
转移地址在寄存器中的 jmp 指令 ¶
jmp 16 位 reg
转移地址在内存中的 jmp 指令 ¶
jmp word ptr 内存单元地址(段内转移) jmp dword ptr 内存单元地址(段间转移)
jczx 指令 ¶
jczx 标号 cx=0 则跳
loop 指令 ¶
loop 标号 cx-- cx!=0 则跳
根据位移进行转移的意义 ¶
方便程序段在内存中的装配
实验 8 ¶
实验 9 ¶
Chap10 CALL 和 RET 指令 ¶
ret 和 retf ¶
- ret
- 用栈中的数据,修改 IP 的内容,实现近转移
- 相当于 pop IP
- retf
- 用栈中的数据,修改 CS 和 IP 的内容,实现远转移
- 相当于 pop IP pop CS
call 指令 ¶
- 将当前的 IP 或 CS 和 IP 压入栈中
- 转移
依据位移进行转移的 call 指令 ¶
call 标号 将当前IP压栈,转到标号 相当于 push IP jmp near ptr 标号
转移目的地址在指令中的 call 指令 ¶
call far ptr 标号 相当于 push CS push IP jmp far ptr 标号
转移地址在寄存器中的 call 指令 ¶
call 16 位 reg 相当于 push IP jmp 16位reg
转移地址在内存中的 call 指令 ¶
call word ptr 内存单元地址 call dword ptr 内存单元地址
call 和 ret 的配合使用 ¶
子程序
mul 指令 ¶
与除法类似 mul reg mul 内存单元
模块化程序设计 ¶
call 和 ret 实现相互联系、不同层次的子问题
参数和结果传递的问题 ¶
批量数据的传递 ¶
寄存器冲突的问题 ¶
注意出栈和入栈的顺序
实验 10 ¶
Chap11 标志存储器 ¶
标志寄存器存储的信息是程序状态字(PSW)
ZF 标志 ¶
零标志位 若结果为 0 zf=1 反之为 0
PF 标志 ¶
奇偶标志位 结果中所有 bit 为中 1 的个数为偶数,pf=1, 反之则为 0
SF 标志 ¶
符号标志位 结果为负,sf=1. 反之为 0
CF 标志 ¶
进位标志位 无符号数运算进位
OF 标志 ¶
溢出标志位
adc 指令 ¶
带进位加
sbb 指令 ¶
带借位减
cmp 指令 ¶
比较指令
检测比较结果的条件转移指令 ¶
je jne jb jnb ja jna
DF 标志和串传送指令 ¶
df 方向标志位 df=0 每次操作后si、di递增 df=1 每次操作后si、di递减 movsb movsw
pushf 和 popf ¶
pushf 将标志寄存器的值压栈 popf 从栈中弹出数据
标志寄存器在 Debug 中的表示 ¶
实验 11 ¶
Chap12 内中断 ¶
内中断的产生 ¶
- 除法错误:0
- 单步执行:1
- 执行 into 指令:4
- 执行 int 指令:n
中断处理程序 ¶
中断类型码定位中断处理程序
中断向量表 ¶
中断向量 中断处理程序的入口地址 中断向量表 中断处理程序入口地址的列表 一个表项占两个字,高地址字存放段地址,低地址字节存放偏移地址
中断过程 ¶
- 取得中断类型码
- 标志寄存器的值入栈
- 设置标志寄存器的第 8 位 TF 和第 9 位 IF 的值为 0
- CS 的内容入栈
- IP 的内容入栈
- 读取中断处理程序的入口地址设置 IP 和 CS
中断处理程序和 iret 指令 ¶
- 保存寄存器
- 处理终端
- 恢复寄存器
- 用 iret 指令返回 pop IP pop CS popf
除法错误中断的处理 ¶
除法溢出
编程处理 0 号中断 ¶
安装 ¶
代码长度 offset do0end-offset do0
do0¶
设置中断向量 ¶
do0 入口地址写入中断向量表的 0 号表项
单步中断 ¶
单步跟踪程序的执行过程
响应中断的特殊情况 ¶
实验 12 ¶
int 指令 ¶
int 指令 ¶
中断例程
编写供应用程序调用的中断例程 ¶
对 int、iret 和栈的深入理解 ¶
BIOS 和 DOS 所提供的中断例程 ¶
- 硬件系统的检测和初始化程序
- 外部中断和内部中断的中断例程
- 用于对硬件设备进行 I/O 操作的中断例程
- 其他和硬件系统相关的中断例程
BIOS 和 DOS 中断例程的安装过程 ¶
BIOS 中断例程应用 ¶
(ah)=9 在光标位置显示字符,可以提供要显示的字符、颜色属性、页号、字符重复个数 mov ah,9 mov al,'a' mov bl,7 ;颜色属性 mov bh,0 ;第0页 mov cx,3 ;字符重复个数 int 10h
DOS 中断例程应用 ¶
实验 13 ¶
Chap14 端口 ¶
端口的读写 ¶
in 读取 out 写入
CMOS RAM 芯片 ¶
70h 为地址端口 71h为数据端口
shl 和 shr 指令 ¶
shl - 左移 - 最后移出的一位写入CF中 - 最低位用0补充 shr - 右移 - 最后移出的一位写入CF中 - 最高位用0补充
CMOS RAM 中存储的时间信息 ¶
实验 14 ¶
Chap15 外中断 ¶
接口芯片和端口 ¶
CPU 通过端口和外部设备进行联系
外中断信息 ¶
- 可屏蔽中断
- 不可屏蔽中断 sti 设置IF=1 cli 设置IF=0
PC 机键盘的处理过程 ¶
- 键盘输入 按键 通码 松键 断码
- 引发 9 号中断
- 执行 int 9 中断例程
编写 int 9 中断例程 ¶
安装新的 int 9 中断例程 ¶
实验 15 ¶
指令系统 - 数据传送指令 - 算术运算指令 - 逻辑指令 - 转移指令 - 处理机控制指令 - 串处理指令
Chap16¶
描述单元长度的标号 ¶
在其他段中使用数据标号 ¶
seg 操作符 取得某一标号的段地址
直接定址表 ¶
程序入口地址的直接定址表 ¶
实验 16 ¶
Chap17 使用 BIOS 进行键盘输入和磁盘读写 ¶
int 9 中断例程对键盘输入的处理 ¶
使用 int 16h 中断例程读取键盘缓冲区 ¶
字符串的输入 ¶
应用 int 13h 中断例程对磁盘进行读写 ¶
int 13h 访问磁盘
实验 17 ¶
评论区