汇编复习重点1武汉理工Word下载.docx
《汇编复习重点1武汉理工Word下载.docx》由会员分享,可在线阅读,更多相关《汇编复习重点1武汉理工Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
•SP寄存器中存放的是堆栈操作单元的偏移量,SP总是指向栈顶。
(考试要求要会画堆栈的示意图)
第三章
1、8088/8086与操作数有关的寻址方式
立即寻址方式
寄存器寻址方式
直接寻址方式
寄存器间接寻址方式
寄存器相对寻址方式
基址变址寻址方式
基址变址相对寻址方式
寻址方式总结
三种类型的操作数:
立即数(data),寄存器操作数(reg),存储器操作数(mem)。
双操作数指令的常见格式(以数据传送指令为例)
–MOVreg,data
–MOVmem,data
–MOVreg,reg
–MOVreg,mem
–MOVmem,reg
2.段前缀
寻址方式隐含地规定了存储器操作数的段地址。
允许数据存放在其它的段(代码段除外)。
此时应在指令中给出“段前缀”。
例如,MOVAX,ES:
[3000H]
源操作数的物理地址=(ES)×
10H+3000H
3、8086指令系统
六大类:
数据传送指令,
算术运算指令,
逻辑运算和移位指令,
控制转移指令,
串操作指令,
处理器控制指令
1)数据传送指令
1.MOV指令
–MOVreg,data;
reg:
CS,IP,DS,ES,SS除外
–MOVmem,data
–MOVreg,reg
2.PUSH和POP指令
PUSHregPOPreg
PUSHmemPOPmem
3.交换指令
XCHGreg,reg
XCHGreg,mem
XCHGmem,reg
2)输入输出指令
(1)直接输入输出指令
INAL,PORT;
AL←(PORT)
INAX,PORT;
AX←(PORT+1,PORT)
OUTPORT,AL;
(PORT)→AL
OUTPORT,AX;
(PORT+1,PORT)→AX
注:
PORT为输入输出端口号,范围为0~255(00~FFH)
(2)间接输入输出指令
格式:
INAL,DX;
操作:
AL←(DX)
INAX,DX;
AX←(DX+1,DX)
OUTDX,AL;
(DX)→AL
OUTDX,AX;
(DX+1,DX)→AX
在使用间接输入输出指令之前,需将端口号→DX
3)地址传送指令
地址传送指令有LEA
LEA(LoadEffectiveAddress)(取有效地址指令)
格式:
LEAreg,mem;
将源操作数mem的有效地址EA传送到目的操作数reg,目的操作数为一个16位的通用寄存器。
4)算术运算指令
(1)二进制加法和减法指令
指令名称格式操作
加法ADDDST,SRCDST←SRC+DST
带进位加法ADCDST,SRCDST←SRC+DST+CF
减法SUBDST,SRCDST←DST﹣SRC
带借位减法SBBDST,SRCDST←ST﹣SRC﹣CF
标志位:
所有状态标志都受到指令执行结果的影响。
(2)加1减1和比较指令
名称格式操作
加1INCOPROPR←OPR+1
INCreg
INCmem
减1DECOPROPR←OPR-1
DECreg
DECmem
ODITSZAPC
×
---×
×
-
(3)求补指令
NEGreg
NEGmem
操作:
对操作数按位取反,末位加1。
(4)比较指令
CMPOPR1,OPR2;
操作:
OPR1-OPR2
比较指令实际上是做减法,但不保存相减的结果,只是根据结果置标志位。
通常,把CMP指令安排在条件转移指令(如JZ,JG,JO等)之前
(5).乘法指令
1)带符号乘法
IMULSRC
所执行的操作:
字节操作数:
AX←(AL)*(SRC)
字操作数:
DX:
AX←(AX)*(SRC)
(乘积带符号,并符合一般代数符号规则)
2)无符号乘法
MULSRC
同IMUL,但操作数和乘积均不带符号。
(6)除法指令
1)带符号除法
IDIVSRC
SRC为字节数据:
AL←(AX)/(SRC)之商
AH←(AX)/(SRC)之余数
SRC为字数据:
AX←(DX:
AX)/(SRC)之商
DX←(DX:
AX)/(SRC)之余数
商和余数是带符号的:
商的符号符合一般代数符号规
则,余数的符号与被除数相同。
2)无符号除法
DIVSRC
与IDIV相同,但操作数,商和余数均是无符号的。
5)、符号扩展指令
CBW
将AL中的8位带符号数扩展为16位并送入AX中。
实际上就是将AL的最高位送入AH的所有各位。
CWD
将AX中的16位带符号数扩展为32位并送入DX和AX中(其中DX存放高16位,AX存放低16位)。
实际上就是将AX的最高位送入DX的所有各位。
4.2.3逻辑运算和移位指令
1)逻辑运算指令
名称格式操作
非NOTOPROPR←OPR
或ORDST,DSTDST←DST∧SRC
与ANDDST,SRCDST←DST∧SRC
异或XORDST,SRCDST←DST∨SRC
测试TESTOPR1,OPR2OPR1∧OPR2
标志:
0---×
U×
0
(NOT指令除外,对标志位无影响)
2)移位指令
名称格式操作
逻辑左移SHLOPR,CNT
算术左移SALOPR,CNT
逻辑右移SHROPR,CNT
算术右移SAROPR,CNT
(OPR是除立即数以外的任何一种寻址方式,CNT可以是1或CL)
---×
(左移1位时,若最高位发生改变,则OF=1;
否则OF=0。
)
名称格式操作
(不带进位)ROLOPR,CNT
循环左移
(不带进位)ROROPR,CNT
循环右移
(带进位)RCLOPR,CNT
(带进位)RCROPR,CNT
4.2.4控制转移指令
1.与转移有关的寻址方式
(无条件转移指令)
例如,
JMPNEARPTRNEXT
JMPFARPTRNEXT
JMPWORDPTR[BX]
JMPDWORDPTR[BX]
NEXT:
标号
3.循环控制指令
LOOPOPR
–功能:
•(CX)-1→CX
•若(CX)=0,则转移至标号OPR处;
否则顺序执行。
4.子程序调用与返回
CALL
RET
5.中断调用与返回
INT
IRET
6、条件转移指令
第四章汇编语言程序格式
1、汇编语言源程序必须符合汇编程序的语法要求
2、语法要求涉及以下方面:
源程序的结构和书写格式,语句行的格式及表达式,伪指令
通常,一个汇编源程序一般应该由3个逻辑段组成,即数据段、堆栈段和代码段。
每个逻辑段以SEGMENT语句开始,以ENDS语句结束。
整个源程序以END语句结束。
1)、数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。
2)、堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。
3)、代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令
–例题从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。
(这个程序的格式很完整,一般的程序按照这个格式来。
DATASEGMENT(数据段)
程序采用分段的格式,每段起始都要有段名,并以SEGMENT开始,以ENDS结束总程序结束符为END,一个源程序只能有、并且只能有一个END。
DATASEGMENT(数据段)中设计数据区。
代码段中ASSUME指明映射的代码堆栈到对应的段。
如果有非代码段则需要对寄存器赋值。
执行从START开始。
程序中应用伪操作来提供帮助,方便记忆。
使用DOS系统功能调用来输入输出、回车换行、结束。
BUFDB11,0,11DUP(?
DATAENDS
CODESEGMENT(代码段)
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,BUF
MOVAH,10
INT21H
MOVDL,0DH
MOVAH,2
MOVDL,0AH
MOVAL,BUF+1
MOVAH,0
LEABX,BUF+2
ADDBX,AX
MOVBYTEPTR[BX],‘$’
LEADX,BUF+2
MOVAH,9
MOVAH,4CH
CODEENDS
ENDSTART
语句格式
汇编语言语句可以由以下几部分组成:
[标识符]操作符[操作数][;
注释]
标识符是一个符号,表示本条语句的符号地址。
一般来说,标识符可以是标号和变量。
标号和变量都具备3种属性:
段属性、偏移属性及类型属性。
操作符可以是机器指令、伪指令和宏指令的助记符。
操作数字段是操作符的操作对象。
当有两个或两个以上的操作数时,各操作数之间用逗号隔开。
注释字段是以“;
”开头的说明部分。
注释字段是语句的非执行部分。
常用的伪操作:
1、数据定义伪指令
一般格式:
[变量名]操作符参数[,参数…][;
注释]
常用的数据定义伪指令操作符
定义字节变量伪指令DB
定义字变量伪指令DW
定义双字变量伪指令DD
定义四字变量伪指令DQ
定义十字节变量伪指令DT
常见的参数有以下5种形式:
1、常数或常数表达式
2、?
3、DUP子句
ARRAYDB2DUP(0,1,2,?
)的示意图如下:
ARRAY
00
01
02
4、地址表达式(DB除外)
5、字符串
如图:
DATASEGMENT
ADB12H,?
(8位)
BDW?
3456H(16位)
CDDD789ABCDEH(32位)
DDB‘ABCD′
EDW‘AB′,’CD′
DATAENDS
注意:
操作数?
可以保留存储空间,但不存入数据。
DB′AB′和DW′AB′的存储情况不同。
参数DUP可以用来复制某些操作数:
地址计数器$
当前地址计数器所指向的值
算术运算符
常见的有+、-、MOD、SHL、SHR、*、/共7个符号,分别表示加、减、取模(求余数)、逻辑左移、逻辑右移、乘、除。
这些操作符都可用于数据之间的运算,+、-操作符还可用于地址之间、数据与地址之间的运算。
例如,
“124MOD3”的结果为1
“10110101BSHL2”的结果为11010100B
MOVDX,[BLOCK+(6-1)×
2]
数值回送操作数
OFFSET变量名或标号
返回变量或标号的偏移地址部分。
例如,若A为变量名或标号;
则OFFSETA返回A的偏移地址。
注意:
下列两条指令的功能完全相同。
MOVDX,OFFSETBLOCK
LEADX,BLOCK
指定属性(合成)运算符
指定属性运算符可用于指定存储器操作数或标号的属性。
常见的有PTR、:
、THIS等3个符号,其功能分别为:
指定存储器操作数或标号的类型、指定存储器操作数的段归属、指定当地的变量或标号的类型。
类型名PTR存储器操作数或标号
例如,因为操作类型不明确,指令MOV[BX],5不能通过汇编。
下列两条指令有不同的执行结果。
MOVBYTEPTR[BX],5
MOVWORDPTR[BX],5
DOS系统功能调用
指类型为21H的软件中断,其对应的中断处理程序中包含了一系列最常用的功能子程序,这些子程序分别实现外设管理、文件读/写和管理、目录管理等功能。
AH
功能
调用参数
返回参数
01
键盘输入并回显
AL=输入字符
07
键盘输入无回显
02
显示输出
DL=输出字符
09
显示字符串
DS:
DX=串地址
‘$’结束字符串
0A
输入字符串
DX=缓冲区首地址
(DX:
DX)=缓冲区最大
字符数
(DS:
DX+1)=实际
输入的字符数
第五章
1、循环程序的结构
例:
录入四位十六进制数,保存在BX中。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVCX,0404H
MOVBX,0
L1:
MOVAH,01H
INT21H
SUBAL,30H
CMPAL,0AH
JLL2
SUBAL,07H
L2:
SHLBX,CL
ORBL,CL
DECCH
JNZL1
MOVAH,4CH
CODEENDS
ENDSTART
更多参考,请看书上例题:
例5.1\例5.4、例5.6
第六章
一、子程序设计方法—子程序调用与返回指令
1.段内直接调用和返回
CALLNEARPTRSUBR
功能:
(IP)入栈,
(IP)+16位位移量→IP
栈顶内容出栈→IP
2.段间直接调用和返回
CALLFARPTRSUBR
功能:
(CS)入栈,(IP)入栈
子程序入口的偏移地址→IP
子程序入口的段地址→CS
RET
栈顶内容出栈→IP
栈顶内容出栈→CS
3、段内调用与段内返回的处理过程
①CPU开始执行CALLSUBR,CS和IP指向断点
②CPU执行CALLSUBR
(IP1)入栈(断点地址入栈),(IP2)→IP
③CPU开始执行RET时,CS和IP指向的位置
④CPU执行RET,
栈顶内容出栈,(IP1)→IP(断点地址出栈,CS和IP重新指向断点)
✧详细应用请参考例题:
例6.4、例6.9、例6.11、习题6.4
第八章
1、中断向量,实际上就是中断服务程序的入口地址。
每个中断向量占4字节的存储单元。
前两个字节单元存放中断服务程序入口地址的偏移量,后两个字节单元存放中断服务程序入口地址的段基值。
2、中断服务程序入口地址信息设置在存储器的最低端,即从00000H~003FFH的1K字节存储空间中。
这一存储空间就叫中断向量表
3、内部中断(INT指令和IRET指令)
INTN;
N:
中断类型码
功能:
(PSW)入栈,(CS)入栈,(IP)入栈;
(N×
4)→IP,(N×
4+2)→CS
IRET
栈顶内容出栈→IP,栈顶内容出栈→CS,栈顶内容出栈→PSW
具体应用请参考课本例题:
例8.5