汇编语言复习
空格 - 20h
换行 - 0xA
回车 - 0xD
0~9 - 30h~39h
a - 41h
A - 61h
1.典型的微型计算机硬件组成:
中央处理机(CPU)
-运算器
-控制器
-寄存器组
存储器
-主存也称为内存,CPU通过总线直接获取,分为ROM(Read Only Memory)和RAM(Random Access Memory)
-辅存也称为外存,CPU通过I/O接口对其进行存取
系统总线
-数据总线,双向总线,用于传输数据信息
-地址总线,单向总线,用于输出COU要访问的内存单元或I/O端口的地址
-控制总线,传送控制信息。
I/O接口和I/O设备
2.PSW(Program Status Word)
-CF(Carry Flag)进位标志,说明无符号数的溢出
-ZF(Zero Flag)零标志
-SF(Sign Flag)符号标志,为最高位的值
-PF(Parity Flag)奇偶标志,1的个数为偶数时,PF=1(注意:只反映最低8位中1的个数)
-OF(Overflow Flag)溢出标志,说明带符号数的溢出
-DF(Direction Flag)方向标志,用于串指令操作中,地址变化的方向
注意:SP总与SS段寄存器连用。
3.储存器
-存储器以字节为编程单位
-每个字节单元对应唯一编码
-地址是无符号整数(十六进制)
-字的低位字节存入低地址,高位字节存入高地址
-字单元地址用低地址表示
-段起始地址:段不能起于任意地址,而必须从任意小段的首地址开始
-段的大小:0~64KB范围内任意字节
根据上述段起始地址和短的大小,可以推出
=>1MB的空间最多能分成64K个段
=>1MB的空间最少能分成16个段
物理地址(PA) = 段地址*16d + 偏移地址
4.寻址方式
立即数寻址
MOV AX, 3096H
寄存器寻址
MOV AX, BX
直接寻址
MOV AX, [2000H]
寄存器间接寻址
MOV AX, [BX]
寄存器相对寻址
MOV AX, COUNT[SI]
基址变址寻址
MOV AX, [BP][DI]
相对基址变址寻址
MOV AX, MASK[BX][SI]
5.寻址方式细节
-符号地址(变量名)
用符号代替数值表示地址
(String db 'wdadawd')
-指令必须在代码段CS中
-PUSH指令的源操作数和POP指令的目的操作数必须使用SS段
-串处理指令的目的串用附加段ES
-[立即数]形式加上段跨越前缀和不加的区别
MOV AX, 1000H <==> MOV AX, [1000H](AX = 1000H)
MOV AX, 1000H <=/=> MOV AX, DS: [1000H]
前者AX = 1000H,后者AX = (1000+ ds地址 * 16d))
6.寻址方式注意事项
-寄存器操作数地址只能由BX、BP和SI、DI给出(Base 和 Index)
-只有存储器操作数需要用段跨越的前缀,即SI、DI和BP、BX; 寄存器不能加段跨越前缀
段内转移
-段内直接寻址:转向的有效地址 = (IP)当前 + 16位位移量, 即(IP)=(IP)当前+16位位移量
-段内间接寻址:有效地址形成物理地址里的内容即为转向的有效地址(IP),即PA=10H *(CS)+(IP)单元格内的内容。
段间转移
-段间直接寻址:用指令中提供的转向短地址和偏移地址取代CS和IP
(格式:JMP FAR PTR NEXTROUNT)
Answer:
offset NEXTROUNT -> (IP)
seg NEXTROUNT -> (CS)
-段间间接寻址:用存储器中的两个相继字的内容取代CS 和 IP,存储单元的地址可用存储器寻址方式得到。
(注意:先IP后CS)
(格式:JMP DWORD PTR [INTERS+BX])
Answer:
[DS*16d + INTERS + BX + 1][DS*16d + INTERS + BX] => IP
[DS*16d + INTERS + BX + 3][DS*16d + INTERS + BX + 2] => CS
7.伪指令与指令
伪指令:伪指令是说明性语句或管理语句
合并段伪指令
segname1 segment
...
segname1 ends
segname2 segment
...
segname2 ends
Groupname Group segname1, segname2...
code segment
start:
assume cs:code segment, ds:Groupname
mov ax, Groupname
mov ds, ax
code ends
end start
-表达式赋值伪操作
ALPHA EQU 9
BETA EQU ALPHA + 18
BB EQU [BP + 18]
-地址计数器$
-用于指令中:保存当前正在汇编的指令的地址
-用于赋值伪指令中:表示地址计数器当前值
-表达式操作符
-type:返回变量字节数
-length:对于中使用DUP的情况,返回该变量的单元数。其他情况返回1。
-size:type * length
-offset:偏移地址
-seg:段地址
指令:操作码,操作数
-处理及控制命令
-STL:令CF=1
-CLC:令CF=0
-执行速度:寄存器操作数>立即数操作数>存储器操作数
-数据传送指令MOV注意事项
-两个操作数的类型要相同
-两个操作数不能同时为段寄存器
-立即数不能直接送段寄存器
-目标操作数不能是CS和立即数
-两个操作数不能同时为存储器寻址
-IP不能作为操作数
-MOV不影响标志位
-堆栈注意事项
-堆栈操作以字为单位
-不影响标志位
-只能PUSH 寄存器,存储器和段寄存器
-POP不能用立即寻址方式
-POP指令的目标操作数不能是CS
-SP指向栈顶
-先修改指针,再赋值
-换码指令XLAT:(AL)= ((BX)+(AL))
-有效地址传送指令LEA:传送有效地址
-LES:相继两字送 寄存器、DS
-LDS:相继两字送 寄存器、ES
-OF:若两个数相加,他们最高位相同,结果相异,则OF = 1,否则为0;
若两个数做差,他们的操作数符号相反,结果与减数相同,则OF = 1,否则为0。
(利用十进制判断即可)
-CF:若和的最高有效位 有 向高位进位, 则CF = 1,否则为0;
{若两个数相减,被减数的最高有效为 有 向高位的借位,则CF = 1,否则为0。
加法形式为若最高位无进位,则CF = 1,否则为0}
-MUL指令的源操作数不能为立即数
-循环移位和带进位的循环移位区别:后者CF参与循环移位过程
-MOVSB 把SI字节单元内容送入DI字节单元,与cld,rep搭配
-STOSB/STOSW 把AL/AX单元内容送入DI所对应的字节/字单元。
8.子程序
子程序调用
-段内调用:1.IP入栈 2.IP = Offset 子程序
-段间调用:1.(CS、IP)入栈 2.CS = Seg 子程序;IP = Offset 子程序
9.堆栈传参
如何避免子程序入栈出错
利用BP保存栈顶指针SP,并利用BP,获取想要的参数
10.模块连接方法
在汇编时利用include伪指令连接
-注意
-被include的文件不能独立汇编,是依附主程序而存在的
-合并的源程序之间的各种标识符,应该统一规定,不能发生冲突
在LINK连接时把各个模块连接在一起
-各源程序要设置必要的段地址,至少要设置代码段(其它段根据需要安排);
-模块中要使用其它模块的标号时,用EXTRN语句说明;
-本模块中存在可被其它模快引用的标号时,用PUBLIC语句声明。EXTRN和PUBLIC语句放在所有段的前面
11.宏汇编
宏定义:
可放在程序的任何地方,但要再调用之前定义
LOCAL标号:
紧接在MACRO之后,用??0001...代替
宏指令与子程序的区别
-处理时间不同:子程序是程序执行期间,由CPU执行;宏调用是在汇编时处理
-处理的方式不同:子程序是由call指令将控制权由调用者转给子程序并执行;宏调用只是替换
-参数处理不同
-执行速度不同
-占用存储器空间大小不同和
12.I/O方式
直接存储器存取方式(DMA:Direct Memory Access)
程序直接控制I/O方式(查询方式)
-直接寻址:前256个端口,用于寻址00H~0FFH(长格式)
-间接寻址:利用DX寻址全部64K个端口(长格式)
中断传送方式
-软件中断(内中断)
-中断号0:除法错
-中断号1:单步中断
-中断号3:断点中断
-中断号4:溢出中断
-用户自定义中断,如int 21h
-将IF、TF压栈,并将二者赋值为0(即内部默认关中断);再以CS、IP的顺序压栈,且IP (n*4+1,n*4);CS (n*4 + 3,n*4 + 2)
-IRET:IP、CS、IF、TF出栈
-硬件中断(外中断)
-可屏蔽中断:用户能控制的中断
-由8529A向CPU发起中断请求信号
-CPU允许,则产生中断
-产生条件:IF = 1,中断屏蔽寄存器中断屏蔽位 = 0
-中断处理完毕后,EOI(中断屏蔽寄存器第5位)应该置为1。
-非屏蔽中断:用户不能禁止的中断。就算IF = 0,CPU也会响应。
-中断号2
-中断优先级
软件中断(除了单步中断) >不可屏蔽中断>可屏蔽中断>单步中断
-中断向量表
共256项,每一项占用4个字节。低字节为偏移地址IP,高字节为段地址CS
-设置中断向量
MOV AX, SEG iproc
MOV DS, AX
MOV DX, OFFSET iproc
MOV AH, 25H
MOV AL, 中断类型号
INT 21H
-读取中断向量
MOV AH, 35H
MOV AL, 中断类型号
INT 21H
返回 ES:BX
-中断程序的调用和编写步骤
-主程序
1.设置中断向量
2.设置CPU的中断中断允许位IF(STI)
3.设置设备的中断屏蔽位
-中断处理子程序
1.保存寄存器内容
2.若允许中断嵌套,则开中断(STI)(因为INT之后,硬件自动将IF、TF置为0)
3.中断处理功能
4.关中断(CLI)
5.送中断结束命令给中断命令寄存器(置EOI = 1)
6.回复寄存器内容
7.IRET中断返回
13.BIOS和DOS功能调用
键盘I/O (8259A第一位,键盘中断寄存器)
键盘缓冲区是一个先进先出的循环队列
-键盘中断(BIOS9号中断程序)从8255芯片的输入端口读取一个字节,低7位是扫描码,最高位“按下为0,放开为1”
-BIOS键盘处理程序(9号中断处理程序)将扫描码转换成相应的字符码,大部分字符码是标准的ASCII码,以字类型存储在键盘缓冲区中,其中高位为扫描码,低位为ASCII码。
-键盘状态字:INT 16H的2号功能。将键盘状态字节返回AL,1表示按下
-单字符输入:
MOV AH,1
INT 21H
输入结果保存在AL中
-接受功能键或数字组合键必须要调用两次DOS功能
1.第一次回送00。
2.第二次会送扫描码。
-字符缓冲区的定义
1.MAXLEN
2.ACTULEN
3.STRING
显示器I/O(INT 10H)
-屏幕被分成25行,80列。每屏最多显示2000个字符,左上角坐标为(0,0),右下角坐标为(24,79)
-每个字符由两个连续字节组成。一个表示ASCII码,一个保存字符属性
-单色显示适配器,显存的起始地址是B000:0000
-串行通信I/O
-异步通信:一个字符一个字符地传输,每个字符一位一位得传输,传输一个字符时,以“起始位”开始,然后传输字符本身的各位,接着传输“校验位”,最后以停止位结束该字符的传输。一次传输的起始位、字符各位、校验位、停止位构成一组完整的信息,称为“帧(Frame)”,帧与帧之间可有任意个空闲位。数据位满足左低右高。
-同步通信:不给每个字符都加起始位和停止位,而把字符按顺序连接起来,组成一个数据块。这样一个数据块称为一个“信息桢”。在数据的开始加上一个同步字符,在信息的末尾加有一定的差错校验字符。
-波特率:单位时间内传送的二进制数据位数(bps)
-文件存取
-ASCIZ串:最后一个字节位00
14.试题笔记
-程序中的k进制数,在汇编时形成二进制数。
-立即数寻址方式正确的是此数在代码段
-微型机中的接口指除了CPU、RAM、外设之外的部分
-NEG指令不能设置溢出标志位
-MOV [1234H], 5AEFH错误,[1234H]未加ds, 则默认为立即数
-OF为带符号数的溢出,CF为无符号数的溢出