一、基础知识
- 存储单元为1Byte
- cpu寻址能力
N根地址总线,寻址能力为pow(2,N) B
N根数据总线,寻址能力为N/8 B - 存储芯片
RAM 随机存储器
ROM 只读存储器(含主板、网卡、显卡的BIOS等) - cpu组成
运算器
控制器
寄存器
二、寄存器
- 寄存器分类:
ax、bx、cx、dx 可分为两个8位独立使用
si、di
指针寄存器:sp、bp、ip
段寄存器:cs、ss、ds、es
标志寄存器:psw - 一个字由两个字节构成
- 8086cpu用两个16位地址合成20位的物理地址,有20位地址总线,寻址能力1MB
物理地址=段地址*16+偏移地址
只有bx,si,di,bp可以在[]中用来寻址
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di] - cs:ip指向当前执行命令地址
- jmp 段地址:偏移地址 或 jmp 某一合法寄存器(仅改变ip)
- 数据不能直接放入段寄存器
- ss:sp指向栈顶元素
- 一个栈段最大为64KB
- 入栈,栈顶向低地址移动;出栈,栈顶向高地址移动
- 高地址存高位,低地址存低位
三、第一个程序
格式:
assume 段寄存器:段名
段名 segment
代码段
…
mov ax,4c00H
int 21H
段名 ends
end
四、bx和loop指令
- []表示偏移地址,也代表一个内存单元
- ()表示一个寄存器或内存单元中的内容
- Idata表示常量
- loop执行流程
(cx)=(cx)-1
(cx)=0?
不等于跳转回loop
等于继续向下执行
五、转移指令的原理
- 段间转移同时修改cs和ip
jmp far ptr 标号
jmp dword ptr 内存单元地址 - 段内转移只修改ip
jmp short 标号
jmp near ptr 标号
jmp word ptr 内存单元地址 - offset取得标号处的偏移地址
- nop空指令(对齐、延时)
- jcxz指令
jcxz 标号
if ((cx)==0) jmp short 标号 - loop指令
loop 标号 (cx)–;if((cx)!=0) jmp short 标号
六、call和ret指令
- call指令
call 标号 = push ip / jmp near ptr 标号
call far ptr 标号 = push cs / push ip / jmp far ptr 标号
call word ptr 内存单元地址 = push ip / jmp word ptr 标号
call dword ptr 内存单元地址 = push cs / push ip / jmp dword ptr 标号 - ret指令
ret = pop ip
retf = pop ip / pop cs - mul指令
mul reg / mul 内存单元
8位 结果放ax / 16位 结果放dx(高位)和sx(低位)
七、标志寄存器
- flag寄存器分类
ZF 零标志位;PF 奇偶标志位;SF 符号标志位;
CF 进位标志位;DF 方向标志位;OF 溢出标志位 - adc指令
adc o1 o2 相当于 o1=o1+o2+CF - sbb指令
sbb o1 o2 相当于 o1=o1-o2-CF - cmp指令
cmp o1 o2
比较o1-o2的结果 不保存结果 - 检验比较结果的条件转移指令
e:equal ; a:above ; b:below - 串传送指令
rep movsb/movsw
相当于
s: movsb/movsw
loop s - cld指令将DF置0,正向
- std指令将DF置1,逆向
- pushf 将标志寄存器入栈
- popf 将标志寄存器出栈
八、内中断
- 内中断分类
–除法错误 中断类型码:0
–单步执行 中断类型码:1
–执行into指令 中断类型码:4
–执行int指令 中断类型码:n - 中断处理过程
接收中断信息–生成中断类型码–查找中断向量表–找到中断处理程序入口(设置段地址和偏移地址)
–产生中断类型码
–pushf
–置IF=0 TF=0
–push cs
–push ip
–ip=中断类型码4(4N)
–cs=中断类型码4+2(4N+2) - 编写中断处理程序的步骤
–保存用到的寄存器
–处理中断
–恢复用到的寄存器
–iret - iret
pop ip
pop cs
popf - 单步中断
如果psw中的TF=1,则执行单步中断
–取得中断类型码1
–pushf,设IF=0 TF=0
–push cs, push ip
–(ip)=(4),(cs)=(4+2) - 设置ss和sp的指令要连续放置,避免中断
九、int指令
- int中断过程
–取得中断类型码
–pushf,设IF=0 TF=0
–push cs, push ip
–(ip)=(4n),(cs)=(4n+2) - BIOS内容
–硬件系统的检测和初始化程序
–外部中断和内部中断的中断例程
–用于对硬件设备进行的I/O操作的中断例程
–其他和硬件系统相关的中断例程 - BIOS和DOS执行中断都用ah来传递内部子程序的编号
- int 10h是BIOS提供的
- int 21h是DOS提供的
十、端口
- CMOS RAM芯片
–包含一个实时钟和128个存储单元的RAM存储器
–用电池供电
–70h为地址端口,71h为数据端口 - shl和shr指令
–将一个寄存器或内存单元中的数据移位
–将最后移出的一位写入CF中
–最高位/最低位用0补充 - in读数据 out写数据
只能用ax或al来存放从端口读入或发送到端口的数据
十一、外中断
- 根据外中断源分类
可屏蔽中断 IF=1 CPU执行完当前指令后响应中断;IF=0 不响应
不可屏蔽中断 中断类型码为2
sti 设置IF=1
cli 设置IF=0 - 不可屏蔽中断的中断例程
–pushf
–push cs ; push ip
–(ip)=8 , (cs)=0A H
几乎所有由外部设备引起的中断都是可屏蔽中断 - 键盘处理过程
1)键盘输入
----按下一个键
–开关接通
–产生一个扫描码(通码,1Byte)
–送入主板相关接口芯片的寄存器中(端口地址为60h)
----松开一个键 步骤同上 断码=通码+80H
断码第7位为1 通码第7位为0
一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码
2)引发9号中断
–读出60H端口中的扫描码
–字符键的扫描码:将其和其所对应的字符码送入BIOS 键盘缓冲区
控制键的扫描码:将其转变为状态字节,写入内存中存储状态字节的单元
–对键盘系统进行控制
–编写int9中断 - 设置中断向量表新入口地址时,最好写成:
cli 屏蔽中断
设置入口地址
sti 可以响应中断