当前位置:文档之家› (何小海版)微机原理与接口技术部分课后习题

(何小海版)微机原理与接口技术部分课后习题

(何小海版)微机原理与接口技术部分课后习题-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII串操作指令特点: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 / F1、试分别说明下列指令中源操作数和目的操作数采用的寻址方式:答案:目的操作数源操作数(1)MOV AX,0FFFFH 寄存器立即(2)MOV ES,AX 寄存器寄存器(3)XOR CL,[100H] 寄存器直接(4)ADD [SI],DX 寄存器间寄存器(5)MOV ES:[2000H],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 1C4AEH3、连续执行以下指令,并在空格中填写执行指令的结果。

答案:MOV AX,2060H AL=60H AH=20H CF=MOV DS,AX DS=2060H AH=20H CF=ADD AL,AH AL=80H AH=20H CF=0INC AX AL=81H AH=20H CF=0MOV DX,512 DL=00H DH=02H CF=0SUB AX,DX AL=81H AH=1EH CF=0第3章:汇编语言程序设计 1. 本章学习要求(1). 应熟悉的内容:汇编语言的格式、语句行的构成。

(2). 应掌握的内容: 指示性语句、指令性语句及相互区别、作用。

(3). 应熟悉掌握的内容:各种结构的汇编语言程序设计的方法,特别是分支结构和循环结构程序的特点和设计。

2. 本章重点难点分析:伪指令、程序设计、子程序中参数通过堆栈传递较难。

通过看例题、做作业和上机实习解决。

如:汇编程序是将由助记符号所编写的汇编语言源程序转换为计算机能直接执行的目标程序的软件,即:.ASMMASM .OBJ LINK .EXE上图可看出汇编语言源程序(扩展名为 .ASM)经过“汇编程序”汇编后生成二进制编码的目标程序(.OBJ),再经过“连接程序”生成可执行文件(.EXE)便可以上机执行或使用DEBUG 程序进行调试。

而指示性语句(伪指令)是告诉汇编程序如何将汇编语言源程序转换为目标程序的语句,在可执行的目标程序生成后的软件中,伪指令是看不见的。

如:SEGMENT 是表示一个段的开始,ENDS 表示段结束;而ASSUME告诉汇编程序,将某一个段寄存器设置为存放某一个逻辑段的段址,即明确指出源程序中的逻辑段与物理段之间的关系。

当汇编程序汇编一个逻辑段时,即可利用相应的段寄存器寻址该逻辑段中的指令或数据。

也就是说ASSUME是建立一个段寄存器与段名的对照表,汇编时使汇编程序能找到本段属于哪个段寄存器,在此对照表中所出现的存储器操作数,寻址时只需给出偏移地址,否则还应给出段地址。

关键字NOTHING表示取消前面用ASSUME 伪操作对这个段寄存器的设置。

使用ASSUME语句,仅仅告诉汇编程序关于段寄存器与定义段之间的对应关系。

但它并不意味着汇编后这些段地址已装入了相应的段寄存器中,这些段地址的真正装入,仍需要用程序来完成,且这 4个段寄存器的装入略有不同。

3.本章典型例题分析:【例1】若从0200H单元开始有100个数,编一个程序检查这些数,正数保持不变,负数都取补后送回。

DA TA SEGMENTORG 0200HSTRING DB 4 DUP (-55,5 DUP(6,-10,-8,9),2 DUP(-4,0))DA TA ENDSSTACK SEGMENT PARA STACK 'STACK'DB 100 DUP ()STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,ES:DA TA,SS:STACKSTART PROC FARBEGIN: PUSH DSMOV AX, 0PUSH AXMOV AX, DATAMOV DS, AXMOV ES, AXMOV CX, 100LEA SI, STRINGAGAIN: MOV AL, [SI]AND AL, AL JNS OVER ;AL >0,跳至OVER NEG AL ;AL <0,对AL 求补 OVER: MOV [SI], AL INC SILOOP AGAIN INT 3 RETSTART ENDP CODE ENDS END BEG【例2】数据块间的搬移程序。

程序要求把内存中一数据块(称为源数据块)传送到另一存储区(称为目的数据块)。

图4-11给出源数据块和目的数据块在存储器中可能的3种情况:两块分离和有部分重叠。

对于两个数据块分离的情况,如图4-11(a),数据的传送从数据块的首址开始,或者从数据块的末址开始均可。

但对于有部分重叠的情况,则要加以分析,否则重叠部分部分会因“搬移”而遭破坏,从图4-11(b)和(c)可以得出以下结论:当源数据块首址<目的块首址时,从数据块末地址开始传送数据。

当源数据块首址>目的块首址时,从数据块首地址开始传送数据。

流程图如图4-12所示,源数据块 目的 数据块 图4-11 数据块之间的三种情况图 4-12程序如下:STACK SEGMENT STACKDW64DUP()STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACKSTART:MOV CX,0010H ;取搬家字节数(16个字节) MOV SI,3100H ;取源块首址MOV DI,3200H ;取目的块首址CMP SI,DI ;从首址开始?JA A2 ;是,转移ADD SI,CX ;否,以末地址开始搬家ADD DI,CXDEC SIDEC DIA1:MOV AL,[SI] ;从末址开始搬家MOV[DI],ALDEC SIDEC DIDEC CXJNE A1JMP A3A2:MOV AL,[SI] ;从首址开始搬家MOV[DI],ALINC SIINC DIDEC CXJNE A2A3:MOV AH,4CHINT21HCODE ENDSEND START4.本章作业(带答案):2、若在自2000H单元开始有一个1000个字节的数据块,要把它传送到自2200H开始的存储区中去,用以下三中方法,分别编制程序:(1)不用串操作指令。

(2)用单个传送的串操作数据传送指令。

(3)用带重复前缀的串操作数据传送指令。

程序如下:DATA SEGMENTORG 2000HN1 DB n1,n2,…n1000N2 EQU 2000H+1000–1CON EQU 1000DATA ENDSSTACK SEGMENT STACK ‘STACK’DW 100DUP()STACK ENDSCODE SEGMENTORG 1000HASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKMAIN PROCSTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,N1+1000–1 ; (2) ; (3)MOV DI,N2MOV CX,CON ;STD L1: MOV AL,[SI];MOVSB ;REP MOVSBMOV [DI],ALDEC SIDEC DILOOP L1;LOOP L1MOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND START3、若在存储器中有数a、b、c、d(它们连续存放),编写一个程序实现:((a * 10 + b)*10+c)*10+d (假设和小于65535)程序如下:DATA SEGMENTBCM DW a,b,c,dDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATABCD1 PROC FARSTART:MOV AX,DATAMOV DS,AXLEA SI,BCMMOV C X,3MOV AX,[SI]L1:INC SISHL AX,1 ;(AX)←(AX)×2MOV BX,AX ;(BX)←(AX)×2SHL AX,1 ;(AX)←(AX)×4SHL AX,1 ;(AX)←(AX)×8ADD AX,BX ;(AX)←(AX)×10ADD AX,[SI]LOOP L1INC SIMOV [SI],AXMOV AH,4CHINT 21HBCD1 ENDPCODE ENDSEND START4、已知数组A包含10个互不相等的整数,数组B包含15个互不相等的整数。

试编写一程序,将既在A中出现又在B中出现的偶数存放在数组C中。

程序如下:DATA SEGMENTORG 0500HDATAA DW A1,A2,…A10DATAB DW B1,B2,…B15COUNTA EQU 10COUNTB EQU 15DATAC DW 10 DUP()DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP()STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV ES,AXMOV DS,AXLEA BX,DATAC ;(BX)=数组C首址CLDLEA SI,DATAA ;(SI)= 数组A首址MOV DX,COUNTA ;(DX)= 数组A元素个数 LP1: LODSW ;取数组A元素到AXLEA DI,DATAB ;(DI)= 数组B首址MOV CX,COUNTB ;(CX)= 数组B元素个数 REPNE SCASW ;(AX)= 数组B元素?不同重复JNZ NEXT ;B中无此A元素转NEXT TEST AX,01HJNZ NEXTMOV [BX],AX ;有A元素且是偶数存入C中INC BXINC BXNEXT: DEC DXJNZ LP1INT 3START ENDPCODE ENDSEND BEGIN5、若自STRING开始有一个字符串(以‘$’号作为字符串的结束标志),请编程查找此字符串中有无字符‘#’,有多少个‘#’,并将个数存放在NUMBER字单元中,且把每一个‘#’字符所存放的偏移地址放到自POINTER开始的连续存储字单元中。

相关主题