《汇编语言程序设计》总复习
第一:五星复习内容如下:
一、重点例题1:计算 345AH-3348CH=?
各状态标志位值?DEBUG显示值?**教材P213至P219 图11.1**
“CPAZSTIDO 0 2 4 6 7 8 9 10 11”**这表示什么意思?**
二、循环程序分析题
类似题计算:S=1+2+3+…+100 (原课堂讲过6个)
四、子程序设计(段内、段间、模块间,返回RET),中断程序设计格式与调用格式(模块间,返回IRET),编写用户中断程序的步骤和上机操作步骤?
1**、子程序创建格式:**
子程序名 proc far/near
……**(代码部分)**
Ret
子程序名 endp
End 子程序名
2**、子程序调用格式**
(1)段内调用:CALL [NEAR PTR] 子程序名
(2)**段间调用:CALL FAR PTR 子程序名**
例1:子程序段间调用举例,主程序显示“OK!”,主程序通过段间调用子程序SUB1,子程序SUB1显示“OK!”
data segment
a db ‘OK!$’
b db ‘Heelo$’
data ends
code1 segment
assume cs:code1,ds:data
start:mov ax,data
mov ds,ax
lea dx,a
mov ah,9
int 21h
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
call far ptr sub1
mov ah,4ch
int 21h
code1 ends
code2 segment
assume cs:code2
sub1 proc far
lea dx,b
mov ah,9
int 21h
ret
sub1 endp
code2 ends
例2:子程序段内调用举例,主程序显示“OK!”,主程序通过段内调用子程序SUB1,子程序SUB1显示“OK!”
data segment
a db ‘OK!$’
b db ‘Heelo$’
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
lea dx,a
mov ah,9
int 21h
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
call near ptr sub1
mov ah,4ch
int 21h
sub1 proc far
lea dx,b
mov ah,9
int 21h
ret
sub1 endp
code ends
end start
五、汇编MASM5.0系统组成?上机步骤?汇编上机产生的文件(.ASM, .OBJ, LST, .EXE, .CRF, .REF, .MAP)的含义?如何产生的?(2020.12.16日,周三下午详细讲解了)
六.DOS中断调用(INT 21H 的功能号:1,2,5,9,10,4CH)
1**、DOS功能调用的步骤**
第一步:置入口参数
第二步:功能号送AH
第三步:执行INT 21H
2**、键盘输入一个字符的ASCII值保存到AL中。**
MOV AH, 1
INT 21H
3.**屏幕显示一个字符**
MOV DL, 字符的ASCII值
MOV AH, 2
INT 21H
4. 打印机输出一个字符
MOV DL, 字符的ASCII值
MOV AH, 5
INT 21H
5**.屏幕显示一串字符**
LEA DX, 存放字符串变量名首址
MOV AH, 9
INT 21H
6.**键盘输入一串字符保存在变量缓冲区中。**
LEA DX, 字符串变量名
MOV AH, 10
INT 21H
7.**程序结束**
MOV AH, 4CH
INT 21H
七、键盘输入整数的程序段从键盘接收十进制数存入BX程序
思想:键盘与CPU是通过ASCII字符传送,即要把输入的数字字符转换成数字,下面程序段的算法思想是:( 例输入数字字符:374 输入其它非数字字符退出)
(((0×10)+3) ×10+7) ×10)+4 ,即将字符’3’,’7’,’4’ 转数值:374
程序段:
MOV BX, 0
NEW:MOV AH, 1
INT 21H
SUB AL,30H
JL EXIT
CMP AL,9
JG EXIT
CBW
XCHG AX, BX
MOV CX, 10
MUL CX
XCHG BX,AX
ADD BX**,AX**
JMP NEW
EXIT: ………
例1:编写一个程序,计算S=1+2+3+…+100.主程序段调用子程序outp输出结果。
data segment
s dw 0
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov ax,1
mov s,0
mov cx,100
aa1:add s,ax\ ;完成S=1+2+3+…+100\
inc ax\
loop aa1\
call outp ;段内调用子程序outp
mov ah,4ch
int 21h
outp proc ;子程序outp 显示结果S
mov cx,0
mov ax,s
aa2:inc cx
mov dx,0
mov bx,10
div bx
push dx
cmp ax,0
jnz aa2
aa3:pop dx
or dl,30h
mov ah,2
int 21h
loop aa3
ret
outp endp
code ends
end start
思考:请同学们将该程序改写成段间调用
第二:系统复习内容如下:
第一部分 基础知识
\1. 各种进制及其转换
\2. 进制运算
例:3A2BH+987CH=?D2A7
10110011B-101110011B=?1000100110
\3. 计算机中数的和字符的表示
(1) 原码、反码、补码
例: X= -3 ,在16位机上,求X的原码、反码、补码=?FFFDH
原1000 0000 0000 0011
反 1111 1111 1111 1100
补 1111 1111 1111 1101
真值 x = -133d = -1000 0101b , b是二进制数后缀, d是十进制数后缀,
[-x]原 =1000 0000 1000 0101b,
以上原码最高位dao是符号位, 1表示负数 , 符号位与数值位之间的空位补0,补齐16位
[-x]反 =1111 1111 0111 1010b , 将原码除符号位之外的数值位取反得反码
[-x]补 =1111 1111 0111 1011b ,将反码末位加1得补码
(2) ASCII码的概念
记住下列字符的ASCII值(用十六进制表示)
‘**a’**, ‘**A**’, 数字‘**0’,回车符CR,换行符LF,空格符SPACE**,
(**61H,41H,30H,0DH, 0AH,20H**)
ASCII码的奇、偶校检码概念
例:字符‘A’的奇校验ASCII值用十六进制表示为:C1H
重要知识点: 数字+30H=数字字符的ASCII值
大写字符ASCII值+20H=小写字符的ASCII值
小写字符ASCII值-20H=大写字符的ASCII值
十六进制数字AF + 37H= ‘A’‘F’的ASCII值。
(3)BCD码知识:
非压缩BCD码、压缩BCD码
例:十进制数53非压缩BCD码表示为:00000101 00000011
压缩BCD码表示为:01010011
(4)、在汇编语言中程序设计中数字所带尾符
H、D(或缺省)、O、B ;例:35H, 35, 1011B 35O
(5)、几种逻辑运算
AND、OR、NOT、XOR
第二部分 80X86**计算机组织**
1、80X86微处理器的发展
2、8086CPU的寄存器组(共14个16位的寄存器)
(1)8个通用寄存器:AX、BX、CX、DX、SI、DI、BP、SP
其中AX:AH AL ; BX:BH BL
CX:CH CL ; DX:DH DL
注:弄清16位寄存器与8位寄存器的关系。
(2)4个段寄存器:CS、DS、ES、SS
(3)2个控制寄存器:IP、FLAGS
CPU 主要三部分:ALU、控制逻辑、工作寄存器组
(4)8086的FLAGS是一个16位的寄存器,有9个标志位,其中6个状态标志位(CF、PF、AF、ZF、SF、OF),3个控制标志位(TF、IF、DF) 标志位在FLAGS的分布(0 2 4 6 8 9 10 11),)P213 图11.1。
注:在汇编指令中,可放在中括号**[ ]的寄存器有4个(SI,DI,BX,BP**)
重点例题:计算**9A3BH-3CD5H=?**
并指出**6个状态标志位的值及DEBUG**显示值
CF= 0 DEBUG**显示:**NC
PF= 1 DEBUG**显示:**PE
AF= 0 DEBUG**显示:**NA
ZF= 0 DEBUG**显示:**NZ
SF= 0 DEBUG**显示:**PL
OF= 1 DEBUG**显示:**OV
(5)8086CPU引脚数(40)、数据线(16)、地址线(20)
物理地址、逻辑地址及其相互关系,逻辑地址=段地址:偏移地址
物理地址=段地址×10H+偏移地址
段的起始地址的规定,小段的首地址:能被16整除的20位物理地址
第三部分 80X86**的指令系统及寻址方式**
1、指令格式
操作码 操作数1, 操作数2,……,操作数n
2***、*8086*寻址方式*** (略)\
立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址\ (共***7***种)\
重点例题:指出下列指令源操作数与目标操作的寻址方式\
(1)\ MOV AX***,***[2002H]\
(2)\ ADD AX***,***A[BX+SI]\
(3)\ MOV BX***,***2002H\
(4)\ MOV [BX]***,***AX\
(5)\ 以第***2*小题为例解答,*ADD AX*,*A[BX+SI]***
答:源操作数为***A[BX+SI]*,属于相对基址变址寻址;目标操作数为*AX***,属于寄存器寻址。\
3***、指令中操作数的有效地址计算,***
注:指令中存储器操作数默认的段寄存器为***DS***
4、操作数种类:立即数、寄存器操作数、存储器操作数(即带**[ ]**的操作数),操作数的逻辑地址表示法,物理地址表示法。
例1:8086某存储单元的逻辑地址为1234H :0005H,该单元的物理地址为:12345H。
例2.某CPU的地址总线宽度为n位,该CPU的寻址能力为2n字节。
5**、8086的指令系统(本课程重点)**
(1)数据传送指令
助记符:MOV、PUSH、POP、PUSHF、POPF、XCHG、LAHF、SAHF、LEA、LDS、LES 等。
注意指令的格式以及操作数类型的要求
考试典型题:
1、执行下列指令序后,CF与PF的值是( B )
MOV AX,34BDH
PUSH AX
POPF
(A)0,0 (B)0,1 (C)1,0 (D)1,1
0011 0100 1011 1100
2、(略)累加器专用指令(输入输出指令、端口输入输出指令、长格式和短格式等提法)
IN、 OUT
考试典型题:
1、 用两种方法将字节数据43H从61H端口输出
方法一:(直接输出或称长格式) MOV AL,43H
OUT 61H,AL
方法二:(间接输出或称短格式) MOV AL,43H
MOV DX,61H
OUT DX,AL
注:换码指令 XLAT
功能: (AL)←((BX)+(AL))
3、地址传送指令
LEA、LDS、LES
注意地址、地址单元内容、字节、字、双字的概念。
重点考试题型:注意根据数据段,画出数据段的数据存储分配示意图以及填写程序段指令旁边寄存器的值。
4、标志寄存器传送指令 P57
LAHF、SAHF、PUSHF、POPF
考试题型:1、执行下列指令序后,标志寄存器的CF、SF的值是( B )
MOV AX,3968H
SAHF
0011 1001 0110 1000
(A)0,0 (B)0,1 (C)1,0 (D)1,1
5、类型转换指令
CBW、CWD
CBW 将AL的符号位扩展到AH
CWD 将AX的符号位扩展到DX
考试题型:1、执行下列指令后,寄存器DX的值是( D )
MOV AX,825AH
CWD
DX1111 1111 1111 1111( FFFFH )AX 1000 0010 0101 1010
(A)0000H (B)00FFH (C)FF00H (D)FFFFH
6、算术指令(重点之中的重点内容)
ADD、ADC、INC、SUB、SBB、DEC、NEG、CMP、TEST、MUL、IMUL、DIV、IDIV、AAA**、AAS、DAA、DAS、AAM、**AAD
考试题型:
(1)、执行下列指令序列后,寄存器AX的值是( C )
MOV AX,0308H
AAD;AH*10+AL->AX AX=38
MOV BL,9
DIV BL
38/9 AH=2 AL=4
(A)0056H (B)0038H (C)0204H (D)0402H
(2)、执行下列指令序列后,寄存器AX的值是( C )
MOV AL,7
MUL AL
(A)0049H (B)0007H (C)0031H (D)0707H
(3)、执行下列指令序列后,寄存器AX的值是( D )
MOV AX,0038H AX=56
MOV BL,-9 //BL=256-9=247
IDIV BL
56/-9 AH=-2 AL=-6
(A)0206H (B)0602H (C)02FAH (D)FEFAH
重点编程题或程序填空题:(详见BCD码运算实验2程序)
多位数非压缩BCD码或压缩BCD码的加减法运算程序
例:计算 3457895+1239877=?(十分重点)
计算 87665-23478=?
7、逻辑指令(按位运算)
AND、OR、NOT、XOR、TEST
重点考试题型:
(1) 写出4条指令(单条指令)实现对累加器AX清零
MOV AX, 0
SUB AX, AX
XOR AX, AX
AND AX, 0
(2) 实现对AL寄存器的高4位与低4位互换
MOV CL, 4
ROR AL, CL
(3) 实现对AL的高4位清零,低4位不变
AND AL, 0FH
8、移位指令
SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR
重点考试题型
(1) 实现AL的高4位与低4位互换
(2) 利用移位指令实现对AL的乘2操作、除2操作。
9、转移类指令
JXXX 目标处
(1) 无条件转移指令(段内、段间、直接、间接)
JMP 标号
(2) 有条件转移指令
无符号数比较转移指令:JA/JNBE, JAE/JNB, JE/JZ , JB/JNAE ,JBE/JNA
有符号数转移指令:JG/JNLE,JGE/JNL, JE/JZ,JL/JNGE,JLE/JNG
标志转移指令:JO, JNO, JS, JNS, JP/JPE(PF=1为偶转),JNP/JPO(PF=0为奇转转)
10、(**略)串处理指令**
MOVS、CMPS、SCAS、LODS、STOS
串操作指令前缀:REP、REPE/REPZ、REPNE/REPNZ
重点知识复习:
串操作指令操作前的准备工作:源串所在段送寄存器DS,源串起始偏移地址送SI;
目标串所在段送寄存器ES,目标串偏移地址送DI;清方向CLD(保证地址增方向);重复串操作的次数送寄存器CX。
考试重点题型(编程题):在变量缓冲区A处有一串字符:abcde,现要求传送到内存缓冲区B处,传送完后,并显示B处字符串。
程序清单:
DATA1 SEGMENT
A DB ‘abcde$’
B DB 6 DUP(‘$’)
DATA1 ENDS
CODE SEGMENT
ASSUME CS:CDE,DS:DATA,ES:DATA
START:MOV AX, DATA ;装填DS、ES的值
MOV DS, AX
MOV ES, AX
MOV CX, 6 ;传送字符数送CX
LEA SI, A ;源串首址送SI
LEA DI, B ;目标串首址送DI
CLD ;清地址方向,正向传送
REP MOVSB ;重复传送CX次
LEA DX, B ;显示B处字串
MOV AH, 9
INT 21H
MOV AH, 4CH ;程序结束
INT 21H
CODE ENDS
END START
习题**:编程统计内存变量A处字符串中有多少个字符‘y’?**
提示**:利用串操作指令SCASB**编程
10、控制转移类指令 P85~P95
JMP 标号、形如JXX 标号 指令
(1) 无符号数比较
(2) 有符号数比较
(3) 根据标志位值转移指令
11、循环指令
LOOP、LOOPZ/LOOPE 、 LOOPNE/LOOPNZ
考试题型:(1)、编程计算S=1+2+3+…+100
(2)、编程计算S=1×2+2×3+…+10×11
12、处理机指令
CLC、STC、CMC、CLI、STI、CLD、STD、NOP、HLT
ESC 等
13、子程序设计
(1)子程序调用指令:CALL 子程序名
(2)子程序返回主程序指令:RET
(3)子程序的定义与调用格式,详见《实验3》、《实验4》
必须搞清调用的书写格式:段内调用(同一个程序且在同一个段之内),段间调用(同一个程序文件中)、段间调用(不同程序文件间)
14、中断调用
(1)DOS中断调用格式或步骤
第一步:置入口参数
第二步:功能号送AH
第三步:执行 INT 21H
(2)必须掌握的DOS中断调用
功能号:1、2、5、9、10、4CH
(3)中断处理程序的入口地址,存放在内存最低端地址:即00000H~003FFH处,共1K字节,每个向量号占4字节,低字存放中断处理程序的IP值,高字存放中断处理程序的CS值。中断向量表可管理256个中断处理程序的入口地址,CS:IP值。中断向量号乘4得到该中断向量的IP与CS在中断向量表的位置。
考试典型题:计算INT 13H 在中断向量表的位置,即向量号13H的IP存放的在中断向量表中的起始地址,向量号13H的CS存放在中断向量表中起始地址。
(4) 中断处理程序的调用与返回
调用:INT n ; 中断返回 IRET
15、作业P107~P116
第四部分 汇编语言程序格式
1、伪操作
(1)段定义的格式
段名 SEGMENT [定位类型] [组合类型] [使用类型][类别]
……
段名 ENDS
定位类型**:** PARA (默认),被16整除,段地址形如XXX0H;
BYTE
WORD
PAGE 被256整除,段地址形如XX00H
组合类型:说明程序连接时段的合并方法,PRIVATE 私有段(默认),在连接时不与其它模块的同名段合并。PUBLIC 公有段,连接时,不同模块同名段连续接形成一个段。COMMON 连接时,不同模块的同名段重叠形成一个段。AT <表达式> 指定段地址值(但不能指定代码段)。MEMORY 与PUBLIC 同义。STACK:把不同模块中的同名段组合而形成一个堆栈段。
使用类型:只适用于386机型,USE16(默认) 使用16位寻址方式;USE32 使用32位寻址方式。
类别(**’CLASS’):**在引号给出连接时组成段组的类型名,段不合并,但在连接后形成的装入模块中,可以把它们的位置靠在一起。
例:定义一个**200字节的堆栈段,段名SABC**。
SABC SEGMENT STACK
DW 100 DUP(?)
SABC ENDS
(2)数据定义伪指令:DB、DW、DD
数值返回操作符 (略)
TYPE、SIZE、LENGTH、OFFSET、SEG
2、汇编语言上机过程
(1)汇编MASM5.0系统文件组成
MASM.EXE LINK.EXE LIB.EXE CREF.EXE
EDIT.COM DEBUG.COM 这些文件功能是什么?
LIB.EXE 库管理程序,用于建立和管理汇编语言子程序库(.LIB 文件),库文件(.LIB)供连接生成.EXE文件时作为公用程序库调用。
DEBUG.COM 调试程序,是调试汇编语言的有力工具,共提供了19条命令。(A、C、D、E、T、F、G、H、I、L、M、N、O、P、Q、R、S、T、U、W)
(2) 汇编上机时可产生哪些文件?
.ASM .OBJ .LST .CRF .REF .MAP ,EXE
这些文件是如何产生的?哪些是编辑产生的?哪些是汇编产生的?哪些是边接产生的? 这些文件的是干什么的?
.ASM文件:汇编语言源程序文件,用文本编辑工具编辑产生的。
.OBJ文件:汇编生成的目标文件,它是通过汇编程序MASM.EXE对汇编语言源程序(.asm文件)进行汇编时生成的。
.LST文件:列表文件,此文件是对汇编语言源程序进行汇编(运行MASM.EXE)时产生的(是汇编时输出文件的可选项),.LST文件包含源程序及注释、地址和目标码(即汇编后的目标程序),它是一种ASCII文件,可用文本编辑工具打开查阅。
.CRF文件:交叉索引文件,在对源程序进行汇编时(运行MASM.EXE)产生的(是汇编时输出文件的可选项)。它是用来了解源程序中每个符号是在哪里定义的,哪些指令用到了这个符号,给出该指令的行号。注:要查阅.CRF文件内容,必须通过运行交叉索引程序(CREF.EXE)对交叉索引文件(.CRF)生成交叉索引列表文件(.REF),再用文本编辑工具打开.REF文件查阅。注:交叉索引文件(.CRF)对较大的程序很有用,可以用于帮助查错。
.REF 文件:交叉索引列表文件,它是运行交叉索引程序(CREF.EXE)产生的一个文件(是交叉索引程序运行的输出项),具体是针对汇编生成的交叉索相文件(.CRF),然后再运行(CREF.EXE)生成交叉索引列表文件(.REF)。
.MAP 文件:列表映象文件,它是运行连接程序LINK.EXE时产生的,即对汇编生成的目标文件.OBJ再连接生成可执行文件时生成的(是连接时输出文件的可选项),。MAP文件提供了各段的名字、起始地址和长度以及程序入口地址。
.EXE文件:可执行文件,连接生成的。具体运行连接程序LINK.EXE,针对汇编生成的目标文件(.OBJ),再连接生成(.EXE)可执行文件,它可在操作系统环境中双击鼠标或作为运行命令(或在提示符下,输入:文件名 回车)直接运行。
(3) 汇编操作过程
编辑、汇编、连接、运行(含调试运行)
3、DEBUG上机过程及DEBUG命令
(1)如何启动与退出DEBUG?
(2)必须掌握的DEBUG命令
A、G、T、D、E、Q、N、L、W、U 等
第五部分 补充复习内容
1、 宏的定义
宏指令名 MACRO [参数表]
指令序列
ENDM
2、 宏的调用
宏指令名 [实在参数]
3、 堆栈的定义
例:定义一个具有100个字节空间的堆栈
STACK SEGMENT STACK
DW 50 DUP(?)
SATCK ENDS
4、 汇编语言程序的结束方式
方法一:
MOV AH,4CH
INT 21H
方法二:(利用子程序设计的方法)
CODE SEGMENT
ASSUME CS:CDOE。DS:DATA
子程序名 PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
指令序列
……
RET
子程序名 ENDP
CODE ENDS
END 子程序名
第5章 重点编程题
1、键盘输入一串字符,屏幕显示该字符串
2、将一串字符中的小字字符全部转换成大写字符并输出。
3、将二进制数:10110011B转换成十进制、八进制和十六进制输出
(本程序参看做实验中的宏:OUTP)
4、计算126754+66435=? 912675-22356=?并输出结果
5、S=1+2+3+…+100 并输出结果
6、S=1!+2!+3!+…5! 并输出结果
7、S=12+22+32+…+102 并输出结果
8、S=1×2+2×3+…+10×11并输出结果
9、计算S=8!
10、计算100及其以内奇数和与偶数和。
特别重点题:填写下列程序指令旁边寄存器的值,假定数据段DATA汇编后的段地址为1234H。
DATA SEGMENT
A DB 123H ,’123’
B DW 345H, ‘CD’
C DD 56789H
D DW B+3 ;D存放B+3的偏移地址
E DD C+2 ;E的低字存放C+2的偏移地址,E的高字存放C+2所在段的段地址。
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX, DATA ; AX=( 1234H )
MOV DS, AX
MOV AX, WORD PTR A+2; AX=(3101H)
MOV AX, B+1 ; AX=(4403H)
MOV AL, BYTE PTR C+3 ; AL=( 00H)
MOV AX, D+1 ;AX=( 0B00H)
LEA AX, B ; AX=(0005H )
LDS AX, C+1 ; AX=( 0567H ), DS=(0800H )
LES AX, E ; AX=(000BH ), ES=(1234H )
MOV AH,4CH
INT 21H
CODE ENDS
END START
DATA**段的存储示意图见下表:**
段地址:1234H
存储单元偏移地址 | 存储字节单元内容 | 变量名 |
---|---|---|
0000 | 23H | A |
0001 | 01H | |
0002 | 31H | |
0003 | 32H | |
0004 | 33H | |
0005 | 45H | B |
0006 | 03H | |
0007 | 44H(即‘D’) | |
0008 | 43H(即‘C’) | |
0009 | 89H | C |
000A | 67H | |
000B | 05H | |
000C | 00H | |
000D | 08H | D |
000E | 00H | |
000F | 0BH | E |
0010 | 00H | |
0011 | 34H | |
0012 | 12H |