汇编语言第二版(王爽)知识总结
汇编语言(第二版)知识总结
第一章 基础知识
1. 存储单元为1Byte ,即字节。
2. 微小信息单位为1bit ,其中1Byte=8bit。 3. Cpu 的寻址能力
N
● 对于地址总线来说,N 根地址总线,寻址能力为2B 。 ● 对于数据总线来说,N 根地址总线,寻址能力为N/8 B。 4. 8086cpu 的PC 机内存地址空间分配如图:
00000
存储芯片从读写属性来看: RAM ROM
9FFFF (随机存储器) (只读存储器)
A0000 主板,网卡,显卡上的BIOS 装在ROM 中,不能写入操作; BFFFF
运算器 (信息处理)
控制器 (控制各种器件工作) 寄存器 (信息存储)
第2章 寄存器
(accumulate ),BX (base ),CX (count ),DX (data ); ,DI ;
5. 8086CPU有14个寄存器 SP ,BP ,IP ; CS ,SS ,DS ,ES ; PSW ;
7. 字的概念:一个字(word )是由两个字节(Byte )构成的,其中含有高位字节和低位字节; 8. 对于实验中溢出的数据,由PSW 寄存器保存溢出值; 9. 以下错误指令是常出现的:
mov ax,bl (不允许8位和16位寄存器之间传送数据) mov bh,ax (同上)
mov al,20000 (8位寄存器最大的存放值为255)
mov al,100H (不允许将高于8位的数据加到8位寄存器之中)
10. 8086CPU采用两个16位地址合成的方法来形成一个20位的物理地址,它有20位地址总 线,达到1MB 的寻址能力;
11. 8086CPU 采用段地址和偏移地址,通过地址加法器来合成物理地址
物理地址=段地址x 16 + 偏移地址 (段的大小=偏移地址的长度)
12. 偏移地址16位,其变化范围为0—FFFF H ;仅用偏移地址来寻址最多可寻64KB 个内存 单元;
13. CPU 将CS :IP 指向的内容作为指令执行,读取一条指令后,IP 值将自动增加,以便使 CPU 读下一条指令,机器码占几个字节,IP 值加几;
CS :IP 指向的内存单元读取指令,读取的指令进入指令缓存器; IP=IP+所读取指令的长度,从而指向下一条指令;
执行指令,转到步骤一,重复执行此过程;
14. 改变CS :IP 的指令:JMP 指令,修改方式为“JMP 段地址:偏移地址”,如果仅想修改 IP 的值,修改方式为“JMP 某一合法寄存器”,从而用寄存器的值修改IP 。
第3章 寄存器(内存访问)
15. 字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元,将起始地址为N 的字单元简称为N 地址字单元。 0
Eg :0012 H存放在2地址字单元 1
字单元
124E H 存放在1地址字单元 2
3
4 16. DS 和【address 】,分别表示段寄存器和内存单元的偏移地址
17. Mov 指令可以:(1)将数据直接送入寄存器 (2)将一个寄存器的内容送到另一个寄存器 (8086CPU 不支持数据直接入段寄存器)
18. 栈:LIFO (后进先出) 8086CPU 入栈(PUSH )和出栈(POP )以字为单位; 19. SS :SP 任意时刻始终指向栈顶元素,PUSH AX由下面两步构成:
(1)SP=SP-2,SS :SP 指向当前栈顶前面的单元,以当前栈顶前面的单元作为新的栈顶; (2)将AX 中的内容送入SS :SP 指向的内存单元处,SS :SP 此时指向新栈顶;
20. 8086CPU 入栈时,栈顶从高地址向低地址方向移动,栈为空的时候,SS :SP 指向最底部 的字单元的偏移地址+2;
21. 出栈后,SS :SP 指向新的栈顶,但之间栈顶的元素还在,只是不在栈中,在之后PUSH 移动至此后,此数据将会被覆盖。 22. 以下操作均可执行(”表示可互换 ):
mov (段)寄存器 寄存器 add/sub 寄存器 数据/寄存器 pop/push (段) 寄存器 mov 内存单元 add/sub 寄存器 内存单元 pop/push 内存单元 23. 一个栈段最大为64KB ,SP 的变化范围为0—FFFF H,当10000H —1FFFF H时,SS=1000H, SP=0000H,(此时SP=SP+2z只能返回0000H 处)
第4章 第一个程序
24. 一个汇编程序由多个段组成,这些段分别用来存放代码,数据,后者当做栈空间,一个 有意义的汇编程序中至少有一个段,这个段用来存放代码。
格式: (划线处表示伪代码,由编译器执行)
段名 segment 代码段
mov ax ,4c00H 程序返回指令(与中断有关) Int 21H 段名 ends (表示一个段结束) (表示程序结束)
25. 加载过程(简略图)
备注: PSP :程序段前缀(0—255字节) ;
程序地址改为 SA+10H : 0 ; SA :0 SA :0 程序入口为 SA :0 (DS=SA) ; SA+10H : 0 第一条指令 CS :IP 为SA+10H:0 ;
第5章 【bx 】和loop 指令
26. 【bx 】和内存单元的描述
① 【】表示偏移地址,也表示一个内存单元 eg :【bx 】表示偏移地址在BX 中
mov AX ,【bx 】(这个内存单元长度为2字节) mov AL ,【bx 】(这个内存单元长度为1字节) ② ()表示“一个寄存器或一个内存单元中的内容”
注意,()可以表示3种类型 :寄存器名,段寄存器名,内存单元的物理地址 ③ Idata 表示常量
27. Loop 指令的格式: loop 标号
① (CX )=(CX )- 1;
② (CX )≠ 0,则转至标号处循环执行
(CX )= 0,则继续向下执行
第7章 更灵活的定位内存地址的方法
28. 在汇编程序中,数据不能以字母开头
29. 伪指令:dw 定义字型数据;db 定义字节型数据; dd 定义双字型数据 30. 【bx+idata】/【bx 】.idata / idata【bx 】三种表示方法 31. Si 和Di 不能够分成两个8位寄存器,功能和BX 相近; 32. 大小写的转化方法:
,11011111 b (大写) or al,00100000 b (小写)
第8章 数据处理的两个基本问题
33. Reg (寄存器):,SP ,BP ,Si, Di ;
Sreg (段寄存器) : DS , SS ,CS ,ES ;
8086CPU 只有BX ,Si ,Di, BP 可以用【】来进行内存单元寻址,可以单独出现,或
BX BX BP BP Si Di Si Di 组合出现;
34. 在【】中使用BP ,如果指令没有显性给出段地址,默认在SS 中;
35. 指令在执行前,所要处理的数据可以在3个地方:CPU 内部,内存,端口; 36. 汇编语言用3个概念来表达数据的位置:立即数(idata ),寄存器,段地址和偏移地址; 37. 操作符X ptr 指明内存单元的长度,X 可以为word/byte
mov word ptr ds:【0】,1 表示访问为1个字节单元 mov byte ptr ds:【0】,1 表示访问为2个字节单元
一般来说,我们可用【bx+idata+si】的方式来访问结构体的数据,用bx 来定义整个结构
体,用idata 定位结构体中某一个数据项,用si 来定义数组中的每个元素; 38. div 指令(除法指令)
8位除数 16位除数 16位被除数 32位被除数 { AX (低16位) DX (高16位)} AL (商)AH (余数) AX (商)DX (余数) 39. 伪指令dup
db/dw/dd 重复次数 dup (重复的字节/字型/双字型) dw 0, 0, 0, 0, 0, 0 ,0, 0 dw 8 dup (0)
第9章 转移指令的原理
40. 转移指令:可以修改IP ,或同时修改CS 和IP 的指令。
8086CPU 的转移行为: 段间转移(修改CS :IP )
短转移:IP 修改范围 -128—127
近转移:IP 修改范围 -32768—32767
41. offset 取得标号处的偏移地址
nop 空指令(占位置/用于程序对齐/设标号/延时) 42. jmp 指令
✧ 依据位移转移的jmp 指令(CPU 在执行jmp 指令的时候不要需要转移的目的地址) jmp short 标号 段内短转移 功能:IP=IP+8位位移(标号处地址-jmp 指令后第一个字节地址) jmp near ptr 标号 段内近转移 功能:IP=IP+16位位移 ✧ 转移的目的地址在指令中的jmp 指令
jmp far ptr 标号 段间转移 功能:CS=标号所在段的段地址,IP=标号在段中的偏移地址 ✧ 转移地址在寄存器中的jmp 指令 jmp 16位reg 功能:IP=(16位reg ) ✧ 转移地址在内存中的jmp 指令
Jmp word ptr 内存单元地址(段内转移) 功能:转移的偏移地址是内存单元中的内容 Jmp dword ptr 内存单元地址 (段间转移)功能:内存单元中的高地址处为转移的段地址
低地址处是转移的目的偏移地址
43. jcxz 指令
jcxz 标号 功能:相当于if ((cx )==0)jmp short 标号 ; 44. loop 指令
loop 标号 功能:相当于 (cx )-- ;if ((cx )!=0)jmp short 标号 ;
第10章 CAll 和RET 指令
45. call 指令(和jmp 指令进行比较)
✧ 依据位移转移的call 指令(CPU 在执行call 指令的时候不要需要转移的目的地址) call 标号 相当于 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 内存单元地址 相当于 push IP / jmp word ptr 内存单元地址; call dword ptr 内存单元地址 相当于 push CS / push IP /jmp dword ptr 标号; 46. ret 和retf 指令
ret 指令用栈中的数据,修改IP 的内容,从而实现近转移,相当于pop IP; retf 指令用栈中的数据,修改CS 和IP 中的内容,从而实现远转移;
相当于 pop IP/pop CS 47. mul 指令
格式:mul reg 或者 mul 内存单元;
结果:8位乘法,结果放在AX 中,16位乘法,则高位放在DX 中,低位放在AX 中;
第11章 标志寄存器
48. 8086CPU 的flag 寄存器的结构:
ZF (零标志位) PF (奇偶标志位) SF (符号标志位)
结果为0,ZF=1 1的个数为奇数,PF=0 结果为负,SF=1 结果不为0,ZF=0 结果中1的个数为偶数,PF=1 结果非负,SF=0 CF (进位标志位) DF (方向标志位) OF (溢出标志位) 没有进位,CF=0 ,Si ,Di 递增 发生溢出,OF=1 发生进位,CF=1 DF=1,Si ,Di 递减 没有发生溢出,OF=0 49. adc 指令(带进位的加法指令) 格式:adc 操作对象1 操作对象2
功能:操作对象1=操作对象1 + 操作对象2 + CF 50. sbb指令(带借位的减法指令) 格式:sbb 操作对象1 操作对象2
功能:操作对象1=操作对象1 - 操作对象2 - CF 51. cmp 指令 (比较指令,不保存结果) 格式:cmp 操作对象1 操作对象2 功能: 操作对象1 - 操作对象2
;b:below;) 53. 串传送指令
一般来说,movsb 和movsw 都和rep 配合使用,如:rep movsb , 相当于 s: movsb
loop s
备注: 但8086CPU 不支持这种指令:mov es:【di 】 ,byte ptr ds:【si 】 54. cld 将标志寄存器的DF 置0,正向
std 将标志寄存器的DF 置1,逆向 pushf 将标志寄存器入栈 popf 将标志寄存器出栈
第12章 内中断
55. 内中断来之CPU 内部,即CPU 不再处理执行中的指令,而是转去处理这个特殊的信息 。 56. 内中断的产生包括以下几个:
除法错误(div 指令产生的除法溢出) 中断类型码:0 单步执行 中断类型码:1 执行into 指令 中断类型码:4 执行int 指令 中断类型码:n (int n) 57. 关于中断过程
CPU 收到中断信息—生成中断类型码—查找中断向量表—找到中断处理程序入口(设置段地址和偏移地址)
对于8086CPU ,中断向量表存在于内存0000:0000—0000:03FF的1024个单元中,由于其中有一些空白的地方,所以我们一般将自己编写的中断程序放在0000:0020—0000:02FF的256个字节空间里。
PC 机的中断例程是由CPU 硬件完成,在接受到中断信息后,会执行一下操作:
① 产生中断类型码
② 标志寄存器的值入栈(pushf )
③ 设置标志寄存器中的IF 和TF 的值为0(原因在书P250和P273) ④ CS 内容入栈 (push CS) ⑤ IP 内容入栈 (push IP) ⑥ IP=中断类型码*4 (N*4)
⑦ CS=中断类型码*4+2 (N*4+2) 58. 编写中断处理程序的步骤
① 保存用到的寄存器 ② 处理中断
③ 恢复用到的寄存器 ④ 用iret 指令返回
59. Iret 指令的功能用汇编语言描述为:
POP IP POP CS popf 60. 单步中断:CPU 执行一条指令之后,如果检测到PSW 中的TF 位为1,则产生该中断; 过程:1. 取得中断类型码1
2. 标志寄存器入栈,IF ,TF 设置为0 3. CS ,IP 入栈 4. (IP )=(1 * 4),(CS )=(1 * 4 + 2)
第13章 int 指令
61. int 指令引发的中断(int n) 过程:1. 取得中断类型码1
2. 标志寄存器入栈,IF ,TF 设置为0 3. CS ,IP 入栈 4. (IP )=(n * 4),(CS )=(n * 4 + 2) 62. BIOS 中主要包含的内容
● 硬件系统的检测和初始化程序 ● 外部中断和内部中断的中断例程
● 用于对硬件设备进行的I/O操作的中断例程 ● 其他和硬件系统相关的中断例程
63. DOS 中断例程的应用
int 10 h / 21 h :mov ah,2 置光标
mov ah,9 在光标位置显示字符
int 19 h
第14章 端口
64. CMOS RAM芯片
⏹ 包含一个实时钟和128个村吹单元的RAM 存储器 ⏹ 该芯片用电池供电
⏹ 在128个字节中,0-0dh 单元保存时间信息,其余大部分保存系统配置信息 ⏹ 该芯片有2个端口,70h 为地址端口,71h 为数据端口 65. shl (左移)和shr (右移)指令
● 将一个寄存器或内存单元中的数据向左(向右)移位 ● 将最后移出的一位写入CF 中 ● 最低位(最高位)用0补充 66. CMOS RAM中的存储的时间信息
一个字节有两个BCD 码(4位2进制数表示十进制的编码方法) BCD 码值+30h=十进制对应的ASCII 码
第15章 外中断
67. 外中断:对外部设备进行控制
外放的输入—相关接口芯片的端口—CPU 内存 IF=1 响应 可屏蔽中断 (CPU 可以不响应)
外中断源 IF=0 不响应 不可屏蔽中断 (中断类型码为2) 不可屏蔽中断的中断例程: ✧ 标志寄存器入栈 ✧ CS ,IP 入栈 ✧ (IP)=8,(CS )=0A H
几乎所有由外设引发的外中断都是可屏蔽中断 68. PC 键盘的处理过程 ⏹ 键盘输入
按下一个键—开关接通—键盘产生一个扫描码(通码,长度为1字节)—送入主板相关接口芯片的寄存器中(端口地址为60h )
松开一个键 同上(产生的扫描码叫断码,长度为1字节) 断码(第7位为1)=通码(第7位为0)+80H; ⏹ 引发9号中断(int 9) a. 读出60H 端口中的扫描码
b. 字符键的扫描码:将其和其所对应的字符码送入BIOS 键盘缓冲区
控制键的扫描码:将其转变为状态字节,写入内存中存储状态字节的单元 c. 对键盘系统进行控制
69. 编写int9中断(书P276)
第16章 直接定址表
第17章 使用BIOS 进行键盘输入和磁盘读写
备注: