资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
串操作指令特点:
1. 可用前缀使其重复操作;
2. 每操作一次自动修改SI和DI内容, 当DF=0时为增量, DF=1为减量;
3. 所有源操作数地址放在SI中, 在DS段, 串长 ≤ 64K;
所有目标操作数地址放在DI中, 在ES段, 串长 ≤ 64K;
4. 用重复前缀时, 如果条件满足且CX ≠ 0 时重复, 每重复一次
CX ← CX–1, 否则结束重复;
5. 重复操作时IP不变, 中断返回后继续操作。
使用串操作指令时注意:
1. SI ← 源串首(末)址
DI ← 目标串首(末)址;
2. CX ← 串长度;
3. 设DF 值;
4. 选重复前缀;
5. 使用条件重复前缀时, 判断结束条件(即 是CX=0 还是ZF=0/1结束)
指令执行时间:
计算机中的计时单位:
(1). 指令周期: 执行一条指令所花的时间;
(2). 总线周期: CPU 每访问一次内存或I/O端口所花的时间;
(3). 时钟周期(T周期): 计算机主频的倒数, 用T表示, 即 T=1 / F
1、 试分别说明下列指令中源操作数和目的操作数采用的寻址方式:
答案:
目的操作数 源操作数
( 1) MOV AX,0FFFFH 寄存器 立即
( 2) MOV ES,AX 寄存器 寄存器
( 3) XOR CL,[100H] 寄存器 直接
( 4) ADD [SI],DX 寄存器间 寄存器
( 5) MOV ES:[ H],CL 直接 寄存器
( 6) SUB [BX+SI],1 基+变 立即
( 7) ADC AX,[BX+SI+10H] 寄存器 相对基+变
( 8) PUSH DS 隐含 寄存器
(9) CLD 隐含
(10) CMP [BP+DI],CL 基+变 寄存器
2、 若( BX) =1123H, ( SI) =1968H, 位移量=0313H, ( DS) =1971H, 试确定由这些寄存器和下列寻址方式产生的有效地址和物理地址:
答案:
EA 物址
(1) 直接寻址; 0313H 19A23H
(2) 用BX的寄存器间接寻址; 1123H 1A833H
(3) 用BX的寄存器相对寻址; 1436H 1AB46H
(4) 用BX和SI的基址变址寻址; 2A8BH 1C19BH
(5) 用BX和SI的相对基址加变址寻址。 2D9EH 1C4AEH
3、 连续执行以下指令, 并在空格中填写执行指令的结果。
答案:
MOV AX, 2060H AL=60H AH=20H CF=
MOV DS, AX DS=2060H AH=20H CF=
ADD AL, AH AL=80H AH=20H CF=0
INC AX AL=81H AH=20H CF=0
MOV DX, 512 DL=00H DH=02H CF=0
SUB AX, DX AL=81H AH=1EH CF=0
第3章: 汇编语言程序设计
1. 本章学习要求
(1). 应熟悉的内容: 汇编语言的格式、 语句行的构成。
(2). 应掌握的内容: 指示性语句、 指令性语句及相互区别、 作用。
(3). 应熟悉掌握的内容: 各种结构的汇编语言程序设计的方法, 特别是分支结构和循环结构程序的特点和设计。
2. 本章重点难点分析: 伪指令、 程序设计、 子程序中参数经过堆栈传递较难。经过看例题、 做作业和上机实习解决。
如: 汇编程序是将由助记符号所编写的汇编语言源程序转换为计算机能直接执行的目标程序的软件, 即:
汇编程序
连接程序
目标程序
可执行文件
汇编语言源程序
.ASM
MASM .OBJ LINK .EXE
上图可看出汇编语言源程序(扩展名为 .ASM)经过”汇编程序”汇编后生成二进制编码的目标程序(.OBJ), 再经过”连接程序”生成可执行文件(.EXE)便能够上机执行或使用DEBUG程序进行调试。
而指示性语句(伪指令)是告诉汇编程序如何将汇编语言源程序转换为目标程序的语句, 在可执行的目标程序生成后的软件中, 伪指令是看不见的。如: SEGMENT是表示一个段的开始, ENDS表示段结束;
而ASSUME告诉汇编程序, 将某一个段寄存器设置为存放某一个逻辑段的段址, 即明确指出源程序中的逻辑段与物理段之间的关系。当汇编程序汇编一个逻辑段时, 即可利用相应的段寄存器寻址该逻辑段中的指令或数据。也就是说ASSUME是建立一个段寄存器与段名的对照表, 汇编时使汇编程序能找到本段属于哪个段寄存器, 在此对照表中所出现的存储器操作数, 寻址时只需给出偏移地址, 否则还应给出段地址。 关键字NOTHING表示取消前面用ASSUME伪操作对这个段寄存器的设置。
使用ASSUME语句, 仅仅告诉汇编程序关于段寄存器与定义段之间的对应关系。但它并不意味着汇编后这些段地址已装入了相应的段寄存器中, 这些段地址的真正装入, 仍需要用程序来完成, 且这 4个段寄存器的装入略有不同。
3. 本章典型例题分析:
【例1】若从0200H单元开始有100个数, 编一个程序检查这些数, 正数保持不变, 负数都取补后送回。
DATA SEGMENT
ORG 0200H
STRING DB 4 DUP (-55,5 DUP(6,-10,-8,9),2 DUP(-4,0))
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP (?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
BEGIN: PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV ES, AX
MOV CX, 100
LEA SI, STRING
AGAIN: MOV AL, [SI]
AND AL, AL
JNS OVER ; AL>0, 跳至OVER
NEG AL ; AL<0, 对AL求补
OVER: MOV [SI], AL
INC SI
LOOP AGAIN
INT 3
RET
START ENDP
CODE ENDS
END BEG
【例2】数据块间的搬移程序。
程序要求把内存中一数据块(称为源数据块)传送到另一存储区(称为目的数据块)。图4-11给出源数据块和目的数据块在存储器中可能的3种情况: 两块分离和有部分重叠。对于两个数据块分离的情况, 如图4-11(a), 数据的传送从数据块的首址开始, 或者从数据块的末址开始均可。但对于有部分重叠的情况, 则要加以分析, 否则重叠部分部分会因”搬移”而遭破坏, 从图4-11(b)和(c)能够得出以下结论:
当源数据块首址<目的块首址时, 从数据块末地址开始传送数据。
当源数据块首址>目的块首址时, 从数据块首地址开始传送数据。
流程图如图4-12所示,
┇
┇
┇
┇
┇
┇
┇
┇
┇
┇
┇
00000H 00000H 00000H
源数
据块 源数 目的
据块 数据块
目的 源数
目的 数据块 据块
数据块
FFFFFH FFFFFH FFFFFH
(a) (b) (c)
图4-11 数据块之间的三种情况
开 始
SI←源数据块首址
DI←目的数据块首址
CX←搬家字节数
(SI)>(DI)?
N
Y
SI←(SI)+(CX)-1
DI←(DI)+(CX)-1
(DI)←[(SI)]
SI←(SI)+1
DI←(DI)+1
SI←(SI)-1
DI←(DI)-1
DI←[(SI)]
DI←[(SI)]
DI←[(SI)]
(CX)=0?
(CX)=0?
结 束
N
N
Y
Y
图 4-12
程序如下:
STACK SEGMENT STACK
DW 64 DUP(? )
STACK ENDS
CODE SEGMENT
ASSUME CS: CODE, SS: STACK
START: MOV CX, 0010H ; 取搬家字节数(16个字节)
MOV SI, 3100H ; 取源块首址
MOV DI, 3200H ; 取目的块首址
CMP SI, DI ; 从首址开始?
JA A2 ; 是, 转移
ADD SI, CX ; 否, 以末地址开始搬家
ADD DI, CX
DEC SI
DEC DI
A1: MOV AL, [SI] ; 从末址开始搬家
MOV [DI], AL
DEC SI
DEC DI
DEC CX
JNE A1
JMP A3
A2: MOV AL, [SI] ; 从首址开始搬家
MOV [DI], AL
INC SI
INC DI
DEC CX
JNE A2
A3: MOV AH, 4CH
INT 21H
CODE ENDS
END START
4. 本章作业(带答案):
2、 若在自 H单元开始有一个1000个字节的数据块, 要把它传送到自2200H开始的存储区中去, 用以下三中方法, 分别编制程序:
(1) 不用串操作指令。
(2) 用单个传送的串操作数据传送指令。
(3) 用带重复前缀的串操作数据传送指令。
程序如下:
DATA SEGMENT
ORG H
N1 DB n1,n2,…n1000
N2 EQU H+1000–1
CON EQU 1000
DATA ENDS
STACK SEGMENT STACK ‘STACK’
DW 100DUP(?)
STACK ENDS
CODE SEGMENT
ORG 1000H
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN PROC
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,N1+1000–1 ; (2) ; (3)
MOV DI,N2
MOV CX,CON ;STD
L1: MOV AL,[SI] ;MOVSB ;REP MOVSB
MOV [DI],AL
DEC SI
DEC DI
LOOP L1 ;LOOP L1
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
3、 若在存储器中有数a、 b、 c、 d( 它们连续存放) , 编写一个程序实现:
( ( a * 10 + b) *10+c) *10+d ( 假设和小于65535)
程序如下:
DATA SEGMENT
BCM DW a,b,c,d
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
BCD1 PROC FAR
START: MOV AX, DATA
MOV DS, AX
LEA SI, BCM
MOV CX,3
MOV AX, [SI]
L1: INC SI
SHL AX, 1 ; ( AX) ←( AX) ×2
MOV BX, AX ; ( BX) ←( AX) ×2
SHL AX, 1 ; ( AX) ←( AX) ×4
SHL AX, 1 ; ( AX) ←( AX) ×8
ADD AX, BX ; ( AX) ←( AX) ×10
ADD AX,[SI]
LOOP L1
INC SI
MOV [SI], AX
MOV AH, 4CH
INT 21H
BCD1 ENDP
CODE ENDS
END START
4、 已知数组A包含10个互不相等的整数, 数组B包含15个互不相等的整数。试编写一程序, 将既在A中出现又在B中出现的偶数存放在数组C中。
程序如下:
DATA SEGMENT
ORG 0500H
DATAA DW A1,A2, …A10
DATAB DW B1,B2, …B15
COUNTA EQU 10
COUNTB EQU 15
DATAC DW 10 DUP(?)
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
BEGIN: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV ES,AX
MOV DS,AX
LEA BX,DATAC ;(BX)=数组C首址
CLD
LEA SI,DATAA ;(SI)= 数组A首址
MOV DX,COUNTA ;(DX)= 数组A元素个数
LP1: LODSW ;取数组A元素到AX
LEA DI,DATAB ;(DI)= 数组B首址
MOV CX,COUNTB ;(CX)= 数组B元素个数
REPNE SCASW ;(AX)= 数组B元素?不同重复
JNZ NEXT ;B中无此A元素转NEXT
TEST AX, 01H
JNZ NEXT
MOV [BX],AX ;有A元素且是偶数存入C中
INC BX
INC BX
NEXT: DEC DX
JNZ LP1
INT 3
START ENDP
CODE ENDS
END BEGIN
5、 若自STRING开始有一个字符串( 以‘$’号作为字符串的结束标志) , 请编程查找此字符串中有无字符‘#’, 有多少个‘#’, 并将个数存放在NUMBER字单元中, 且把每一个‘#’字符所存放的偏移地址放到自POINTER开始的连续存储字单元中。
程序如下:
DATA SEGMENT
ORG 0100H
STRING DB '593#6707#84BK47#68H#8K8#497$'
NUMBER DB ?
POINTER DW 50 DUP (?)
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
BEGIN: PUSH DS
MOV AX,0
PUSH AX
MOV AX, DATA
MOV ES, AX
MOV DS, AX
LEA SI, STRING
LEA DI, POINTER
XOR BL, BL ; BL清0
AGAIN: MOV AL, [SI]
CMP AL, ’$’ ; 与’$’比较
JZ STOP
CMP AL, ’# ’
JNZ NEXT
MOV DX,[SI]
MOV [DI], DX
INC DI
INC DI
INC BL
NEXT: INC SI
JMP AGAIN
STOP: LEA DI, NUMBER
MOV [DI], BL
INT 3
START ENDP
CODE ENDS
END BEGIN
一、 8282 (地址锁存器)的作用:
在T1时锁存地址信息。
二、 8284(时钟发生器)的作用:
1. 提供系统时钟CLK
2. 同步RESET
3. 同步READY
4. 提供其它系统时钟
三、 8286(总线缓冲器)的作用:
1. 数据缓冲
2. 增强总线负载能力
3. 控制数据传送方向
四、 8288(总线控制器)的作用:
在8088/8086 工作在最大模式时, 根据S2~S0的信号, 输出系统各种控制信号
. 本章作业: (带答案)
1. 若用4K×1位的RAM芯片组成16K×8位的存储器, 需要多少芯片(32片)? A19~A0地址线中哪些参与片内寻址(A0~A13)? 哪些参与作芯片组的片选择信号(A14~A19)?
2. 下列RAM各需要多少条地址线进行寻址? 多少条数据I/O线?
地址线 数据线 地址线 数据线
( 1) 512×4; 9 4 ( 5) 4K×1; 12 1
( 2) 1K×4; 10 4 6) 16K×4; 14 4
( 3) 1K×8; 10 8 ( 7) 64K×1; 16 1
( 4) 2K×1; 11 1 ( 8) 256K×4; 18 4
3. 使用下列RAM芯片, 组成所需的存储容量, 各需多少RAM芯片? 各需多少RAM芯片组? 共需多少寻址线? 每块片子需多少寻址线?
片数 组数 总线数 片内线
( 1) 512×4的芯片, 组成8K×8的存储容量; 32 16 13 9
( 2) 1024×1的芯片, 组成32K×8的存储容量; 256 32 15 10
( 3) 1024×4的芯片, 组成4K×8的存储容量; 8 4 12 10
( 4) 4K×1的芯片, 组成64K×8的存储容量; 128 16 16 12
4. 若用2114芯片组成2KB RAM, 地址范围为3000H~37FFH, 问地址线应如何连接? ( 假设CPU只有16条地址线, 8根数据线, 可选用线选法和全译码法)
C B A
A15 A14 A13 A12 A11 A10 A9 A8 A7 ~ A0
0 0 1 1 0 0 0 0 0 ~ 0
0 0 1 1 0 1 1 1 1 ~ 1
第三部分 综合练习题
1、 名词解释∶
•ASSUME, SEGMENT, CPU, BCD码, ASCII码, RAM, EPROM, IP, SP, CS, DS, 开中断, 总线周期, T周期, 段寄存器, 字节、 字, 汇编程序, 堆栈, 字长, 中断, 伪指令, 指示性语句、 指令性语句、 OFFSET、 物理地址、 逻辑地址、 ROM、 ORG 、 AB、 DB、 CB、 指令周期 、 全译码、 局部译码、 内存、 外存 ┅
综合练习题答案如下:
1、 名词解释(略)
3、 判断下列指令正误, 如果错误请指出原因。
答案:
( 1) MOV CL, 259 × 数据不匹配
( 2) XOR BL, BH √
( 3) ADD 100, AL × 立即数不能为目标操作数
( 4) MOV SS, 2200H × 立即数不能直接送基寄存器
( 5) POP CS × POP 不能对CS
( 6) XCHG CX, DX √
( 7) IN AL, 260H × 端口地址超过256, 应用DX间接寻址
( 8) MOV [BP+SI], [BX] × 源和目标操作数不能同时为存储器操作数
( 9) LEA BX, AX × 源操作数应为存储器操作数
( 10) MOV AX, 10H[BX] √
4、 问答题:
(1) 何为逻辑地址? 何为物理地址? 它们俩者之间有何关系?
答: 物理地址是存储器的实际地址, 一个存储单元的物理地址是惟一, 逻辑地址为程序设计中所使用的存储器地址, 它由段基址和地内偏移地址两部份构成, 物理地址=段基址×16+偏移地址, 可见一个存储单元的逻辑地址能够有若干个。
(2) 什么是总线周期?一个基本的总线周期由多少个T构成?
答: CPU每访问一次总线所花的时间称为总线周期, 一个基本的总线周期由四个T周期构成。
(3) 在使用串操作指令(如MOVS)前应注意些什么?
答: 使用串操作指令时应注意以下五点: 1·将源串的首(末)地址送入SI中、 将目标串的首(末)地址送入DI中; 2·将串长度送入CX中; 3·设置DF的值; 4·选择适当的重复前缀; 5·判断串操作指令的结束条件。
(4) 8088 CPU有多少根地址线? 多少根数据线? 它最大直接寻址范围是多少? 一次对外数据传送多少BIT二进制数?
答: 8088 CPU有20根地址线,8根数据线, 它最大直接寻址范围是1MB, 一次对外数据传送8BIT二进制数。
(5) 微机中的基本计时有哪几种? 它们之间的有何关系?
答: 微机中的基本计时有: 指令周期; 总线周期; 时钟周期。一个指令周期由若干时钟周期或总线周期构成,
一个基本的总线周期由四个时钟周期构成, 时钟周期是最小的计时单位, 它是微机主频的倒数。
(6) 8086 / 8088 微处理器内部有哪些寄存器? 其主要作用是什么?
答: 8086 / 8088 微处理器内部有: AX、 BX、 CX、 DX、 SI、 DI、 CS、 DS、 SS、 ES、 IP、 SP、 FR、 BP存放数据、 偏移地址、 段基址以及标志。
5、 自1000H单元开始, 有100个无符号数( 字节) , 编写程序计算这100个数的和, 并把和存放在1971H和1972H单元, 且高位存放在1972H单元。
程序如下:
DATA SEGMENT
ORG 1000H
N1 DB n1,n2,…n100
N2 EQU 1971H
CON EQU 100
DATA ENDS
STACK SEGMENT STACK ‘STACK’
DW 100DUP(?)
STACK ENDS
CODE SEGMENT
ORG H
ASSUME CS:CODE,DS:DATA, SS:STACK
MAIN PROC
START: MOV AX,DATA
MOV DS,AX
LEA SI,N1
MOV CX,CON
XOR AX,AX
L1: ADD AL,[SI]
ADC AH,0
INC SI
LOOP L1
MOV N2,AL
MOV N2+1,AH
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
6、 若自6000H单元开始有1000个数( 字节) , 试针对下面情况编程将它们中的最小值、 最大值找出来, 并分别存放在5000H和5001H字节单元中。
(1) 这1000个数为无符号数。
(2) 这1000个数为带符号数。
程序如下:
DATA SEGMENT
ORG 6000H
BUFFER DB X1, X2, …, X1000 ; 自定义N个无(带)符号数
COUNT EQU $-BUFFER
MAX EQU 5000H ; 保存最大值
MIN EQU 5001H ; 保存最小值
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
MAIN PROC
START: MOV AX, DATA
MOV DS, AX
MOV CX, COUNT
LEA BX, BUFFER ; 首地址→BX
MOV AL, [BX] ; AL←最大值初值
MOV DL, [BX] ; DL←最小值初值
DEC CX ; 循环次数减1
AGAIN: INC BX
CMP AL, [BX] ; 比较
JNC (JGE) NEXT1 ; 若最大值≥[BX], 则转至NEXT1
MOV AL, [BX] ; AL←保存最新的最大值
JMP NEXT2
NEXT1: CMP DL, [BX] ; 比较
JC (JL) NEXT2 ; 若最小值<[BX], 则转至NEXT2
MOV DL, [BX] ; DL←保存最新的最小值
NEXT2: LOOP AGAIN ; 循环
MOV MAX, AX ; MAX←存最大值
MOV MIN, DX ; 存最小值→MIN
MOV AH, 4CH
INT 21H ; 返回DOS
MAIN ENDP
CODE ENDS
END START
7、 用2114存储器芯片组成2KB RAM, 地址范围为C800H~CFFFH, 问地址线、 数据线及相关的控制线如何连接? (假设CPU只有16根地址线、 8根数据线, 控制线为 WR、 RD、 IO/M, 采用LS138全译法。见下图, )
C B A
A15 A14 A13 A12 A11 A10 A9 A8 A7 ~ A0
1 1 0 0 1 0 0 0 0 ~ 0
1 1 0 0 1 1 1 1 1 ~ 1
展开阅读全文