汇编语言复习

本文详细介绍了汇编语言的基础知识,包括微型计算机硬件组成、PSW、存储器、寻址方式等,并深入探讨了指令与伪指令、子程序、堆栈操作、模块连接、宏汇编以及I/O方式等内容。

空格 - 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为无符号数的溢出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值