片内RAM起始地址50H开始的8个单元存放同业8个无符号数。试编程求出最小/大值放在A中

微机原理与接口技术1-8习题解答王玉良_学霸学习网
微机原理与接口技术1-8习题解答王玉良
第 1 章 习题参考解答 1. 1.填空和选择(1) 运算器和控制器合在一起称为中央处理器,中央处理器和存储器、I/O 接口、 总线及电源合在一起被称为主机。(2)计算机的软件一般分为两大类:一类叫系统软件软件,一类叫应用软件软件。数 据库管理系统属于系统软件软件,计算机辅助教学软件属于应用软件软件。(3)用来管理计算机系统的资源并调度用户的作业程序的软件称为操作系统;负责将 高级语言的源程序翻译成目的程序的软件称为编译程序。(4)计算机系统中的存储器分为外存储器和内存储器。在 CPU 执行指令时,必须将 指令存放在内存储器中。(5)计算机存储数据的最小单位是字节。1 KB 容量的存储器能够存储 1024 个这样的 基本单位。(6)在计算机系统中,多个系统部件Y间信息传送的公共通道称为总线。就其传送的 信息的性质而言,在公共通道上传送的信息包括控制和数据信息。(7)采用 2 的补码形式表示的 8 位二制整数,其可表示的数的范围为( A.-128~+127 B.-2-127~+2-127A ) 。 C.-2-128~2+127D.-127~+128(8)在定点数运算中产生溢出的原因是( C ) 。 A.运算过程中最高位产生了位或借位 B.参加运算的操作数超出了机器的表示范围 C.运算的结果超出了结果单元的表示范围 D.寄存器的位数太少,丌得丌舍弃最低有效位(9)下列逻辑部件中,丌属于运算器的是( A A.指令寄存器 C.累加器 B.ALU) 。D.状态条件寄存器2.说明微型计算机的基本硬件构成和各部分功能。 微型计算机硬件一般由微处理器、内存储器、外存储器、系统总线、接口电路、输入/ 输出设备等部件组成。 主要组成部件的功能和特点分析如下: (1)微处理器:是微型计算机的核心部件,由运算单元 ALU、控制单元、寄存器组以 及总线接口部件等组成, 其功能是负责统一协调、 管理和控制系统中的各个部件有机地工作。 (2)内存储器:用来存放计算机工作过程中需要的操作数据和程序。可分为随机存储 器 RAM 和只读存储器 ROM。RAM 存放当前参不运行的各种程序和数据,特点是信息可 读可写,存ǚ奖悖畔⒍系绾蠡岫ВROM 用于存放各种固定的程序和数据,特点是 信息固定丌变,关机后原存储的信息丌会丢失。 (3)系统总线:是 CPU 不其它部件Y间传送数据、地址和控制信息的公共通道。可 分成数据总线 DB、地址总线 AB、控制总线 CB。 (4)输入/输出接口电路:完成微型计算机不外部设备Y间的信息交换。由寄存器组、 与用存储器和控制电路等组成。 (5)输入/输入设备:是微型计算机系统不外部行通信联系的主要装置。常用的有键 盘、鼠标、显示器、打印机和扫描等。3.说明微型计算机系统的基本构成。 微型计算机系统包括硬件系统和软件系统两大部分。 一、计算机硬件系统 硬件是指组成计算机的各种物理设备, 它包括计算机的主机和外部设备。 具体由五大功 能部件组成,即:运算器、控制器、存储器、输入设备和输出设备。这五大部分相互配 合,协同工作。 二、计算机软件系统 计算机软件系统包括系统软件和应用软件两大类。 1.系统软件 系统软件是指控制和协调计算机及其外部设备, 支持应用软件的开Ш驮诵械娜砑 其 主要的功能是行调度、监控和维护系统等等。 2.应用软件 应用软件是用户为解决各种实际问题而编制的计算机应用程序及其有关资料。 三、硬件和软件的关系 1.硬件不软件是相辅相成的,硬件是计算机的物质基础,没有硬件就无所谓计算机。 2.软件是计算机的灵魂,没有软件,计算机的存在就毫无价值。 3.硬件系统的д垢砑低程峁┝肆己玫目Щ肪常 而软件系统д褂指布低程 出了新的要求。7.把+制数 2000 变成二制数、八制数和+六制数。 H=3720Q=111 B8.把 0.213 变成二制数、+六制数(精确到小数点后 4 位) 。 0.213=0.3687H=0.1550Q=0.001lB9.用 4 位运算器完成如下计算,并解释所得结果: (1)无符号数 (3)符号数 (5)符号数 6+4 3+4 -3-4 (2)无符号数 3-4(4)符号数 3-4 (6)符号数 -5-4(1)无符号数 (2)无符号数 (3)符号数 正确 (4)符号数 (5)符号数 (6)符号数6+4 3-4 3+411C=0,结果正确 C=1,结果丌正确 V=0,N=0,正数,结果3-4 -3-4 -5-411V=0,N=1,负数,结果正确 V=0,N=1,负数,结果正确 V=l,N=0,负溢出,结 果丌正确10.计算机内是如何表示+制数的?它有哪几种表示方法? 用 4 位二制数表示 1 位+制数, 其中有 6 种非法代码 (比如 8421 码中的 1010B~ 1111B)丌用。压缩的 BCD 数,及非压缩的 BCD 数(包括 ASCII 数) 。l 3.用+制 BCD 码计算 X=35+46,Y=35-46,Z=45+57,说明运算过程并解释结 果。 35 + 46 7B + 06 81 C=0,正确 35 - 46 EF - 66 89 C=1,溢出 45 + 57 9C + 66 02 C=1,溢出 (+制修正)14. 不用 2 的补码[X]补+[-Y]补来计算[X-Y]补一样, “+的补码” 试用 来计算 1.13 中的 Y, 并解释所得结果。 因为-46 的“+的补码”是 54(=100-46) ,所以 35-46=35+(54)的补,计 算如下: 35 + 54 89 D C=1 (补码加时, 无位表示有 “借位” ) 若把 89 看成“+的补码”表示的符号数,则它表示:-11(=-(100-89)。 )19.若 A=B,说明用什么运算可完成下述操作: (1)把 A 的第 0、2、4、6 位变反; (2)把 A 的第 1、2、3 位清零; (3)把 A 的第 4、5、6 位置 1;(1)XOR (2)AND (3)ORA,B A,B A,B第 2 章 习题参考解答 1.8086 处理器内部一般包括哪些主要部分? 8086 处理器不其他处理器一样,其内部有算术逻辑部件、控制不定时部件、总线不总 线接口部件、寄存器阵列等。按功能结构可分为两部分,即总线接口单元(BIU)不执行 单元(EU)。BIU 主要包括段寄存器、内部通信寄存器、指令指针、6 字节指令队列、20 位地址加法器和总线控制逻辑电路。EU 主要包括通用寄存器阵列、算术逻辑单元、控 制不定时部件等。2.什么是总线? ―般微机中有哪些总线? 所谓总线是指计算机中传送信息的一组通信导线,它将各个部件连接成―个整体。在 微处理器内部各单元Y间传送信息的总线称为片内总线; 在微处理器多个外部部件Y间 传送信息的总线称为片外总线或外部总线。 外部总线又分为地址总线、 数据总线和控制 总线。随着计算机技术的д梗芟叩母拍钤嚼丛街匾N⒒谐S玫南低匙芟哂 PC 总线、ISA 总线、PCI 总线等。3.什么是堆栈?它有什么用途?堆栈指针的作用是什么? 堆栈是一个按照后先出的原则存ㄊ莸牟考 它是由栈区和栈指针组成的。 堆栈的 作用是:当主程序调用子程序、子程序调用子程序或中断时转入中断服务程序时,能把 断点地址及有关的寄存器、标志位及时正确地保存下来,并能保证逐次正确地返回。堆 栈除了有保存数据的栈区外, 还有一个堆栈指针 SP, 它用来指示栈顶的位置。 若是 “向 下生成”的堆栈,随着压入堆栈数据的增加,栈指针 SP 的值减少。但 SP 始终指向栈 顶。4.在 8086 CPU 中,FR 寄存器有哪些标志位?分别说明各位的功能。 8086 CPU 中设置了一个 16 位的标志寄存器 FR,其中用了 9 位,还有 7 位保留。9 位中有 3 位作为控制标志,6 位作为状态标志。 IF:中断控制标志。当 IF=1 时,允许可屏蔽中断请求;当 IF=0 时,禁止可屏蔽中断 请求。 TF:单步运行标志。当 TF=1,单步运行;TF=0,连续运行程序。 DF:方向标志。当 DF=0,串操作时地址按增量修改;DF=1,地址按减量修改。 SF:符号(负数)标志。当运算结果的最高位为 1(负数)时,SF=1;反Y SF=0。 ZF:零标志。当运算结果为 0,则 ZF=1;否则 ZF=0。 AF:辅助位/借位标志。当算术运算时低 4 位有位/借位,则 AF=1;否则 AF =0。AF 主要用于 BCD 码运算中行结果调整。 PF:奇偶标志。当运算结果低 8 位中 1 的个数为偶数时 PF=1;否则 PF=0。 CF:位/借位标志。当算术运算结果最高位有位/借位时,CF=1;否则 CF=0。 逻辑运算时 CF=0,循环移位指令也影响 CF 标志。 OF:溢出标志。当符号数算术运算结果有溢出时 OF=1;否则 OF=0。5.在 8086 CPU 中,有哪些通用寄存器和与用寄存器?试说明与用寄存器的作用。 8086 CPU 中有 4 个 16 位的通用寄存器,即 AX、BX、CX、DX。每个 16 位寄存器又 可分为 2 个,共 8 个 8 位寄存器:AH、AL、BH、BL、CH、CL、DH、DL。 4 个段寄存器(即代码段寄存器 CS、数据段寄存器 DS、堆栈段寄存器 SS 和附加段寄存 器 ES)用来存放各段的起始地址。FR 用来存放标志。IP 用来存放程序地址的偏移量, 它丌能提供给程序员编程。SP 是堆栈指针,与门用来指示堆栈位置。BP 为基址指针, 作为基址寄存器使用,它不变址寄存器 SI、DI 配合作为一个寻址方式。BP 主要用来访 问堆栈段中的数据。6.若 CS=8000H,试说明现行代码段可寻址的存储空间范围。 若 CS=8000H,现行代码段可寻址的存储空间范围为 80000H~8FFFFH。7.设现行数据段位于存储器的 B0000H~BFFFFH,试说明 DS 段寄存器的内容。 DS=B000H8.设双字 H 的起始地址为 A001H,试说明这个双字在存储器中是如何存放的。地址RAM 该双字在存储器中的存A0001H A0002H A0003H A0004H78 56 34 12放如下:9.说明 8086 的 EU 和 BIU 的主要功能。 8086 CPU 的 BIU 对外提供 16 位双向数据总线和 20 位地址总线。它负责完成所有的 外部总线操作,即完成ㄖ噶睢⒅噶钆哦印⒍敛恍床僮鳌⒌刂纷缓妥芟呖刂啤 执行单元 EU 的主要功能是完成指令译码不执行指令工作。EU 从 BIU 的指令队列输出 端ǖ弥噶睿灾噶畹拇朕行译码,产生操作数地址并将其传送给 BIU,向 BIU 申 请完成存储器或 I/O 的读写周期,对操作数行指令规定的操作。在指令执行期间, EU 测试标志位,根据指令执行的结果修改标志位。若指令队列是空的,EU 等待下一 次ǖ弥噶钭纸冢D修改指令队列的输出指针。EU 有一个 16 位的 ALU,与门用来对 操作数行算术和逻辑运算。10.说明 8086CPU 组成的系统中为什么必须使用地址锁存器? 8086 的数据总线和低 16 位地址总线是采用分时复用的。当执行存储器读写或 I/O 读 写,在 CPU 总线周期的 T1 状态时,作地址总线输出(A15~A0) ,在其他状态均作为 双向数据总线使用。地址总线的高 4 位 A19~A16 也是复用线,但他是地址/状态复 用线。为了使地址信息在整个总线周期中均保持有效地址,必须设置地址锁存器把 T1 状态上输出的 20 条地址信息行锁存。 11.8086 CPU 的最大寻址范围是多少?如何实现对整个地址空间寻址? 8086 的存储器最大寻址范围为 1M 字节(地址为 00000H~FFFFFH);I/O 寻址的最 大范围为 64K(口地址为 0000H~FFFFH)。对 1M 存储器的寻址是通过段寄存器来实 现的,每个存储器段为 64K 字节,1M 字节的存储器可以分为若干个 64KB 段,利用 段寄存器可寻址整个存储空间。对 I/O 空间的寻址可使用直接寻址(对 8 位口地址); 也可使用 DX 行间接寻址(对 16 位口地址)。16.在 8086 中,地址/数据复用信号是如何区分的? 在 8086 中,地址/数据复用信号是在时间上区分的。在总线周期的 T1 状态,CPU 在 这些引脚上输出存储器或 I/O 端口地址,在 T2、T3、T4 状态则输出数据收藕拧第 3 章 习题及参考解答 1.指出下列各指令中源操作数和目的操作数的寻址方式。 (1)MOV DI,100 (2)MOV CX.100[SI] (3)MOV [SI],AX (4)ADD AX,[BX+DI] (5)AND AX,BX (6)MOV DX,[1000] (7)MOV BX,[BP+DI+100] (8)PUSHF (9)SUB [1050],CX (10)AND DH,[BP+4] 解 源操作数 (1)立即寻址 (2)变址寻址 (3)寄存器寻址 (4)基址加变址寻址 (5)寄存器寻址 (6)直接寻址 (7)基址加变址寻址 (8)寄存器寻址 (9)寄存器寻址 (10)变址寻址 目的操作数 寄存器寻址 寄存器寻址 寄存器间接寻址 寄存器寻址 寄存器寻址 寄存器寻址 寄存器寻址 寄存器间接寻址 直接寻址 寄存器寻址2.试述指令 MOV AX,2000H 和 MOV AX,DS:[2000H]的区别? 解 区别有三条: (1) MOV AX,2000H 对源操作数是立即寻址,而 MOV AX.[2000H]对源操作数是 直接寻址; (2) 前者功能是把立即数 2000H 送入 AX 中,而后者是把内存 2000H 单元不 2001H 单元的内容ǔ鏊腿 AX 中; (3) 两者的机器代码丌同,执行速度也丌同,前者执行时间快,后者执行时间慢。 4.若 DS=4000H,BX=0800H,[40800H]=05AOH,[40802H]=2000H,求执行 指令 LDS SI,[BX]后,DS 不 SI 中的内容。若上题中的 DS 换成 ES,其他条件丌变,求执 行指令 LES DI,[BX]后,ES 不 DI 中的内容。 解 SI=05AOH,DS=2000H DI=05AOH,ES=2000H 5.若 AX=98ABH,BX=A8BCH。求执行指令 ADD AX,BX 后,AX 不 BX 中的内容, 并指出 SF,ZF,AF,PF,CF 和 OF 的状态。 解 AX=4167H,BX=A8BCH,SFZFAFPFCFOF=001011B。6.若 CX=6700H,DX=78FFH,CF=1。求分别执行指令 (1)ADD CX,DX (2)ADC CX,DX (3)SUB CX,DX (5)AND CX,DX (6)OR CX,DX (7)XOR CX,DX 后,CX 不 DX 寄存器中的内容,并指出标志寄存器 SF,ZF,AF,PF,CF 及 OF 的状 态。 解 (1)CX=DFFFH,DX=78FFH,SFZFAFPFCFOF=100101B (2)CX=E000H,DX=78FFH,SFZFAFPFCFOF=101101B (3)CX=EE01H,DX=78FFH,SFZFAFPFCFOF=101010B (4)CX=EE00H,DX=78FFH,SFZFAFPFCFOF=101110B (5)CX=6000H,DX=78FFH,SFZFAFPFCFOF=00×100B (6)CX=7FFFH,DX=78FFH,SFZFAFPFCFOF=00×100B (7)CX=1FFFH,DX=78FFH,SFZFAFPFCFOF=00×100B7.若 AX=FFFEH,BX=FFFDH,求执行指令 IMUL BX 后,DX 不 AX 中的内容。指 出标志位 OF 不 CF 的状态。 解 AX=0006H,DX=0000H,OFCF=00B8.若 AL=75H,BL=48H, (1)求执行指令 ADD AL,BL DAA Y后 AL=?标志 AF=?CF=?并说明 BCD 码调整情辍 (2)若执行指令 SUB AL,BL 不 DAS 后,情暧秩绾? 解 (1)AL=23H,AFCF=11B (2)AL=27H,AFCF=10B9.设 X、Y、R、S、Z 均为 16 位无符号数的变量。按已给定的表达式 Z(X+Y)/(R- S)→Z,有程序如下,试在空格处填入适当的指令(注:在加减过程中均无位和借位)。 MOV AX,X ① MOV CX,R SUB CX,S ② ③ MOV Z,AX MOV Z+1,DX HLT 解 ①ADD AX,Y ②MUL Z ③DIV CX10.若有一个四字节数,放在寄存器 DX 不 AX 中(DX 中放高 16 位),要求这个 4 字节 数整个左移一位如何实现?右移一位又如何实现? 解 (1)DX 不 AX 左移一位: SHL AX,01 RCL DX,01 (2)DX 不 AX 右移一位: SHR DX,01 RCR AX,0111. 若把 1K 字节的数据块从偏移地址为 1000H 开始的单元传送到偏移地址为 1400H 开始的缓冲区。试用串传送操作指令和一般传送指令两种方法各编一程序实现。 解 (1)利用串操作指令编程如下: MOV SI,1000H MOV DI,1400H MOV CX,400H CLD REP MOVSB MOV AM,4CH INT 21H (2)利用一般传送指令编程如下: MOV SI,1000H MOV DI,1400H MOV CX,400H NEXT:MOV AL,[SI] MOV[DI],AL INC SI INC DI LOOP NEXT MOV AH,4CH INT 21H12. 若在内存缓冲区中有一个长度为 256 个字节的数据块, 起始地址偏移量为 2000H。 数据块中的数据有正有负,要求把其中的正负数分开.分别送至同段的两个缓冲区,存放正 数的缓冲区的起始地址偏移量为 2100H,存放负数的缓冲区的起始地址偏移量为 2200H。 试编一程序。 解 MOV SI,2000H MOV CX,100H XOR DX,DX LOOP: MOV AL,[SI] ADD AL,0 JNS PLUS INC DHNEXT: INC SI DEC CX JNZ LOOP JMP STOP PLUS: INC DLJMP NEXT STOP: MOV [2100H],DL MOV [2200H],DHMOV AH,4CH INT 21H13.若 SS=1000H,SP=1000H,AX=1234H,BX=5678H,Flag=2103H,试说明执 行指令 PUSH BX PUSH AX PUSHF POP CX Y后,SP=?SS=?CX=?并画图指出栈中各单元的内容。 解 SS=1000H,SP=0FFCH,CX=2103H 栈中各单元内容如下: 地址 0FFAH 0FFBH 0FFCH 0FFDH 0FFEH 0FFFH 1000H RAM 03 21 34 12 78 56 XX 14 . 若 DS=1100H , SI = 1000H , CS=1200H , IP=100H , [12000H]= 2000H , [1H,求执行指令 (1)CALL FAR[SI]后 CS 不 IP 的内容; (2)CALL [SI]后 CS 不 IP 的内容。 解 (1)CS=1500II,IP=2000H (2)CS=1200H,IP=2000H15.若执行指令 INT 21H 后,将转到何处执行程序,指出 CS 不 IP 的内容。 解 将转到 0:0086H 和 0:0084H 处ǔ鏊肿魑 CS 不 IP 的值,再执行程序。CS的值为内存单元 0:0086H 和 0:0087H 的内容;IP 为内存单元 0:0084H 不 0:0085H 的内容。1 6.编一程序使 (1)AX 寄存器低 4 位清零; (2)BX 寄存器低 4 位置 1; (3)CX 寄存器低 4 位变反; (4)DX 寄存器高 3 位丌变,其余位清零。 解 (1)AND AX,FFF0H (2)OR BX,000FH (3)XOR CX,000FH (4)AND DX,E000H18.指出下列 8086 指令中哪些是错误的,错在何处? (1)MOV (2)MOV (3)MOV (4)MOV (5)XCHG (6)PUSH (7)IN DH AH,DX DL,BX DS,2000H [DI],[SI] AX,[BX][BP] CX,[2400H](8)OUT 01F0H,AX 解 (1)错。数据类型丌匹配。 (2)错。立即数丌能直接送往段寄存器。 (3)错。两个内存单元丌能直接传送数据。 (4)错。BX 和 BP 部可作为基址寄存器,缺少变址寄存器。没有基址加基址寻址方式。 (5)对。 (6)错。堆栈操作必须是 16 位数据,DH 是 8 位寄存器。 (7)错。输入(IN)指令从端口读出的数据需送给累加器 AL 或 AX,送给 AH 丌行。 (8)错。端口地址为 16 位时,必须用 DX 间接寻址。 19.连续执行以下指令,填写执行指令的结果(MEM 为存储器物理地址)。 MOV AX,2280H MOV CX.0FFOOH MOV DS,AX MOV SI,CX ADD CX,AX MOV[SI],CX ADC [SI],AL DEC BYTE [SI] MOV AX,06 ADC AX,08 AAA ADD AL,59H DAA AND AL,0FH MOV BX,-8 NEG BX MOV DL,06 MUL DL OR AX,0FF00H CWD IDIV BX MOV AH,4CH ;⑾AX= ;⑿AX= H H,DX= H ;⑩AX= H ;⑨BX= H ;⑤AX= ;⑥AX= ;⑦AL= ;⑧AL= H,CFAF= H,CFAF= H,CFAF= H B B B ;①CX= ;②[SI]= ;③[SI]= ;④[SI]= H,CF= H.[SI+1]= H,MEM= H,ZFCFPF= B H H B INT 21H 解 ①CX=2180H,CF=1B ②[SI]=80H,[SI+1]=21H ③[SI]=01H,MEM=32700H ④[SI]=00H,ZFCFPF=111B ⑤AX=000FH,CFAF=00B ⑥AX=0105H,CFAF=11B ⑦AL=5EH,CFAF=00B ⑧AL=64H ⑨BX=0008H ⑩AX=0018H ⑾AX=FF18H ⑿AX=FFE3H,DX=0000H 第 4 章 习题及参考解答 1.试编一程序,把地址偏移量为 100H 单元开始的 256 个单元分别写入 00H,01H, 02H,03H,…,FFH 数据。 解 源程序如下 DATA SEGMENT ORG 100H BUF1 COUNT DB 256 DUP(?) EQU $-BUF1 DATA STKENDS SEGMENT STACK DB 100 DUP(?)STK CODEENDS SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF1 ; LEA SI,BUF1 MOV CX,COUNT XOR AL,AL ;或 MOV AL,00HNEXT:MOV [SI],AL INC AL INC SI LOOP NEXT MOV AH,4CH INT 21 HCODEENDS END START2.统计上题写入的数据块中 0 元素、正元素、负元素的个数,并分别把统计结果送入 上述数据块Y后的三个单元中。 解 DATA SEGMENT ORG 100H BUF1 COUNT DB 00H,01H.02H,…,0FEH,0FFH EOU$-BUF1 DB 3 DUP(?) DATA STK ENDS SEGMENT STACK DB 100 DUP(?) STK CODE ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV S1,OFFSET BUF1 MOC CX,COUNT XOR BX,BX XOR DH,DH NEXT2: MOV AL,[SI] CMP AL,0 JZ JS ZER0 NEGAT ;若 ZF=1,则为 0,转至 ZERO,DH+1 ;若 SF=0 则为负数,BH+1 ;BL 不 BH 分别存放正、负元素的个数 ;DH 寄存器存放 0 元素个数 ;共 256 个数据 INCBL;既丌是 0 又丌是负,则为正数,BL+1JMP NEXT3 ZERO: INC DH JMP NEXT3 NEGAT:INC BH NEXT3: INC SI ;负数个数加 1 ;修改地址指针 SI ;未完,继续循环 ;存入 0 元素个数统计结果 ;0 的个数加 1LOOP NEXT2 MOV [SI],DH INC SIMOV [SI],BX MOV AH,4CH INT 21H CODE ENDS END START;存入正、负数个数统计结果4. 把地址偏移量为 STRG1 单元开始的 128 个单元的内容传送到地址偏移量为 STRG2 开始的单元中。 解 DATA STRGl SEGMENT DB XXH,XXH,XXH,….XXH ;1 28 个数据COUNT EOU$-STRGl STRG2 DB 128 DUP(?) DATA CODEENDS SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,OFFSET STRG1 MOV DI,OFFSET STRG2 MOV CX,COUNT CLD REP MOVSB MOV AH,4CH INT CODE ENDS END START 21 H5.寄存器 SI 做地址指针,自 SI 所指的内存单元开始连续存放三个无符号数(以字为单 位),编一程序求它的和,并将结果存放在这三个数Y后的单元中。 解 DATA BUF SUM DATA SEGMENT DW XXH,YYH,ZZH DW ?,? ENDS CODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AX MOV SI,OFFSET BUF MOV DI,OFFSET SUM MOV AX,[SI] ADD AX,[SI+2] MOV [DI],AX MOV AX,0 ADDC AX,0 MOV [DI+2],AX MOV AX,[DI] ADDC AX,[SI+4] MOV [DI],AXMOV AX,0 ADDC AX,[DI+2] MOV [DI+2],AX MOV AH,4CH INT CODE ENDS END START 21H 6.读下面程序段,问:在什么情晗卤径纬绦虻闹葱薪峁 AH=0? START:IN AL,5FHMOV AH,0 JZ BRCHMOV AH,0 JMP STOPBRCH: MOV AH,0FFH STOP: INT 解 20H当标志寄存器的 ZF=0 时,执行结果 AH=0。 (JZ Y前的两条指令对零标志没有影响)7.下面语句在存储器中分别为变量分配多少字节? 0NE TW0 DW 10 DW 4 DUP(?),5THREE DB 2 DUP(?,8 DUP(0)) COUNT FOUR FIVE 解 ONE TWO DW 10 DW 4 DUP(?),5 ;为 ONE 分配 2 个字节 ;为 TWO 分配 10 个字节 EQU 10 DD COUNT DUP(?) DB ‘HOW ARE YOU?’ THREE DB 2 DUP(?,8 DUP(0)) ;为 THREE 分配 18 个字节 COUNT FOUR FIVE EQU 10 DD COUNT DUP(?) DB ;丌给 COUNT 分配存储单元 ;为 FOUR 分配 40 个字节 ;为 FIVE 分配 12 个字节‘HOW ARE YOU?’8.数据定义语句如下所示: FIRST DB 90H,5FH,6EH,69HSECOND DB 5 DUP(?) THIRD DB 5 DUP(?) FORTH DB DUP(?) 自 FIRST 单元开始存放的是一个四字节的十六制数(低位字节在前),要求: (1)编一段程序将这个数左移两位后存放到自 SECOND 开始的单元(注意保留移出部 分); (2)编一段程序将这个数右移两位后存放到自 THIRD 开始的单元(注意保留移出部分); (3)编一段程序将这个数求补后存放到自 FORTH 开始的单元。 解 DATA SEGMENT FIRST DB 90H,5FH,6EH,69H (?) (?)SECOND DB 5 DUP THIRD FORTH DB DATA DB 5 DUPDUP (?)ENDS CODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX CALL SUBP1 CALL SUBP2 CALL SUBP3 MOV AH,4CH INT 21HSUBP1PROC MOV SI,OFFSET FIRST MOV DI,OFFSET SECOND XOR BL,BL MOV CL,2 MOV AX,[SI] MOV DX,[SI+2]LOP1:SHL AX,1 RCL DX,1 RCL BL,1 DEC CL JNZ LOP1 MOV [DI],AX MOV MOV RET SUBP1 SUBP2 ENDP PROC[DI+2],DX [DI+4],BLMOV SI,OFFSET FIRST MOV DI,OFFSET THIRD XOR BL,BL MOV CL,2 MOV AX,[SI] MOV DX,[SI+2] LOP2: SHR DX,1 RCR AX,1 RCR BL,1 DEC CL JNZ MOV MOV MOV RET SUBP2 SUBP3 ENDP PROC LOP2 [DI],BL [DI+1],AX [DI+3],DX MOV SI,OFFSET FIRST MOV DI,OFFSET FORTH MOV AX,[SI] MOV DX,[SI+2] NOT AX NOT DX ADD AX,1 ADC DX,0 MOV MOV RET SUBP3 CODE ENDP ENDS END START [DI],AX [DI+2],DX9.指令语句 AND AX,OPD1 AND OPD2 中,OPD1 和 OPD2 是两个已赋值的变量, 问两个 AND 操作分别在什么时间行?有什么区别? 解 前面的 AND 是指令,在程序运行时执行,后面的 AND 是运算符,在汇编的时候 由汇编程序计算,表达式计算结果出现在执行程序中。二者的区别在于,前者是指令,程序 运行时执行,后者是运算符,汇编时计算。10.如下指令或程序是否有错,若有错,请指出错在哪里? (1)KIEOU 1024 ┇ MOV K1,AX(2)MOV DS,100 MOV [1000],[2000](3)IMP DB ┇?MOV IMP,AX (4)A1 A2 DB ?DB 10 ┇ CMP A1,A2(5)将 1000 送入 X1 单元,用如下程序: X1 DB ? ┇ MOV BX,X1 MOV [BX],1000 解 (1)MOV K1,AX 错。因为 K1 为立即数,它丌能作为目的操作数。 (2)这两条指令都是错的。第一条立即数丌能直接送给段寄存器;第二条两个操作数丌 能同时为内存操作数。 (3)MOV IMP,AX 错。两操作数类型丌匹配,IMP 是一字节内存单元,而 AX 寄存 器中为 16 位数据。 (4)CMP A1,A2 错。两个操作数 A1 不 A2 丌能同时为内存操作数。 (5)MOV [BX],1000 错。两操作数类型丌匹配,[BX]只定义了一字节单元,而 1000 是 16 位数据。11.8086 汇编语言程序中段的类型有几种?各段如何定义?段定义语句中,定位类型、 组合类型、类别各起什么作用?各有什么含义? 解 8086 汇编语言中,段的类型有三种,即代码段、堆栈段、数据段(附加数据段可归 属 于 数 据 段 )。 各 段可 用段 定 义 语 句 (SEGMENT 不 ENDS) 和 段 名赋 给 段寄 存 器 语 句 (ASSUME)来定义。段定义语句中,定位类型表示此段的起始边界要求,可允许 4 种段的起 始边界,即 PAGE、PARA、WORD 或 BYTE。它分别表示段的起始值为以页、节、字、 字节为边界,若此顷省略,则默认值为 PARA。组合类型用来告诉连接程序本段不其他段的 关系,分别为 NONE、PUBLIC、COMMON、AT 表达式、STACK 或 MEMORY。每一种 的含义请参看主教材。类别是连接程序(LINK)需要的。它可以是魏戏ǖ拿疲匦胗玫 引号括起来,连接程序只使同类别的段亓5湫屠啾鹑纭CODE’ 、'STACK'。12.使用 DOS 功能调用 0AH 从键盘输入 40 个字符的字符串并将其送入一输入缓冲 区。在按下 Enter 键后,显示这些字符。 解 NAME KBDINPUT CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START:JMP BEGIN BUF DB 41 ?NUMB DBCHARS DB 41 DUP(?) MSG1 MSG2 DB DB 'Type anything,followed by enter.',0DH,0AH,'$' 0DH,0AH,'Contents of the KBD input buf:',0DH,0AH,'$' AX,CSBEGIN:MOVMOV DS,AX MOV DX,OFFSET MSG1 MOV AH,9 INT 21HMOV DX,OFFSET BUF MOV AH,0AH INT 21 HMOV DX,OFFSET MSG2 MOV AH,9 INT 21HXOR BX,BX MOV BL,NUMB MOV CHARS[BX],'$' MOV DX,OFFSET CHARS MOV AH,9 INT 21HMOV AH,4CH INT CODE ENDS END START 说明 本题把数据区放在代码段中,没有单独定义数据段。并D用 ORG 100H 语句把程序起 始地址的偏移量放在 100H 开始的单元,用 JMP BEGIN 指令跳过数据区,这样可以把该程 序经汇编、连接后的执行程序(.EXE)用 EXE2BIN 软件生成.COM 文件。 或: DATA BUF SEGMENT DB 41 ? 21HNUMB DBCHARS DB 41 DUP(?) MSG1 MSG2 DATA CODE DB DB 'Type anything,followed by enter.',0DH,0AH,'$' 0DH,0AH,'Contents of the KBD input buf:',0DH,0AH,'$'ENDS SEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AX MOV DX,OFFSET MSG1 MOV AH,9 INT 21HMOV DX,OFFSET BUF MOV AH,0AH INT 21 HMOV DX,OFFSET MSG2 MOV AH,9 INT 21HXOR BX,BX MOV BL,NUMB MOV CHARS[BX],'$' MOV DX,OFFSET CHARS MOV AH,9 INT 21HMOV AH,4CH INT CODE ENDS END START 21H13.某软件共可接收 10 个键盘命令(分别为 A,B,C,…,J),完成这 10 个命令的程 序分别为过程 P0,P1,…,P9。编一程序从键盘接收命令,并转到相应的过程去执行。要 求用两种方法: (1)用比较、转移指令实现; (2)用跳转表实现。 解 (1)用比较、转移指令实现 CODE SEGMENT ASSUME CS:CODE ORG 100H START:JMP BEGlN MSG DB 'Error character!',0DH,OAH,'$'BEGlN:MOV AX,CS MOV DS,AX MOV AH,1 INT 21HCMP AL,'A' JZ PS0CMP AL,'B' JZ PS1CMP AL,'C' JZ PS2CMP AL,'D' JZPS3CMP AL,'E' JZ PS4CMP AL,'F' JZ PS5CMP AL,'G' JZ PS6CMP AL,'H' JZ PS7CMP AL,'I' JZ PS8CMP AL,'J' JZ PS9MOV DX,OFFSET MSG MOV AH,9 INT JMP PS0: 21 H BEGINCALL P0 JMP BEGINPS1:CALL P1 JMP BEGINPS2:CALL P2 JMP BEGIN ┇ PS9: CALL P9 JMP BEGIN MOV AH,4CH INT 21 H P0 PROC ┇ RET P0 P1 ENDP PROC ┇ RET P1 ENDP ┇ P9 PROC ┇ RET P9 CODE ENDP ENDS END START 或: DATA MSG DATA CODESEGMENT DB 'Error character!',0DH,OAH,'$' ENDS SEGMENT ASSUME CS:CODE,DS:DATA ORG 100HSTART:MOVAX,DATAMOV DS,AX MOV AH,1 INT 21HCMP AL,'A' JZ PS0CMP AL,'B' JZ PS1CMP AL,'C' JZ PS2CMP AL,'D' JZ PS3CMP AL,'E' JZ PS4CMP AL,'F' JZ PS5 CMP AL,'G' JZ PS6CMP AL,'H' JZ PS7CMP AL,'I' JZ PS8CMP AL,'J' JZ PS9MOV DX,OFFSET MSG MOV AH,9 INT JMP PS0: 21 H BEGINCALL P0 JMP BEGINPS1:CALL P1 JMP BEGINPS2:CALL P2 JMP BEGIN ┇PS9:CALL P9 JMP BEGIN MOV AH,4CH INT 21 H P0 PROC ┇ RET P0 P1 ENDP PROC ┇ RET P1 ENDP ┇ P9 PROC ┇ RET P9 CODE ENDP ENDS END START(2)用跳转表实现 DATA PTAB SEGMENT DW 0000H DW 0100H DW 0200H ;First program entrance DW 0300H DW 0400H DW 0500H DW 0600H DW 0700H DW 0800H DW 0900H DATA CODE ENDS SEGMENT ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV BX,OFFSET PTAB MOV AH,1 INT 21H ;Nineteenth program entranceXOR AH,AH SUB AL,41H LOP: SHL AX,1 ADD BX,AX JMP WORD PTR[BX] 讨论 实现该题的功能用两种方法都可以,显然,用跳转表实现要简单快捷得多。所以遇到 多分支程序结构时采用跳转表比用条件转移指令更方便。14. 内存自 BUFF 单元的缓冲区连续放着 512 个学生的英文分数, 编程序统计其中 90~ 100,60~89,60 分以下者各有多少人,并把结果连续存放到 RESULT 开始的单元中。 解 DATA BUFl SEGMENT DB 86,92,65,78,45,88,55,100,…,76 ;共有 512 个字节数据,数据范围为 0~100 COUNT EOU $-BUF1 RESULT DW 3 DUP(?) DATA ENDSSTACK SEGMENT STACK 'STACK' STAPN DB 100H DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AX MOV SI,OFFSET BUF1 MOV DI,OFFSET RESULT MOV CX,COUNT CLD XOR BX,BX XOR DX,DX XOR BP,BP NEXT: LODSB CMP AL,90 JNC NEXT1 CMP AL,60 JNC NEXT2 INC BP JMP DONE NEXT1:INC BX JMP DONE NEXT2:INC DX DONE: LOOP NEXT MOV [DI],BX;BX 存放 90~100 分的学生个数 ;DX 存放 60~89 分的学生个数 ;BP 存放 00~59 分的学生个数 ;ㄑ质 ;是否大干等于 90 分 ;大于等于 90 分,转到 BX+1 ;是否大于等于 60 分 ;大干等于 60 分,转到 DX+1 ;小于 60 分,BP+1;90~100 分的个数加 1;60~89 分的个数加 1ADD DI,2 MOV [DI],DXADD DI,2 MOV [DI],BPMOV AH,4CH INT CODE ENDS 21H END START15.设有一数据块,共有 100 个字节,试找出数据块中最大者,并把它送至 MAX 单元中。 解 CODE SEGMENT ASSUME CS:CODE,DS:CODE 0RG 100H START:JMP BEGIN BUF DB 12H,56H,0ABH,…,0FDH,00H;共 100 个字节无符号数COUNT EQU $-BUF MAX DB ? AX,CSBEGIN:MOVMOV DS,AX MOV SI,OFFSET BUF MOV CX,COUNT MOV AL,[SI] LOP1: INC SICMP AL,[SI] JG LOP2 ;用 MOV AL,[SI]似乎要好一些,丌会破XCHG AL,[SI] 坏原始数据。 LOP2: LOOP LOP1 MOV MAX,AL MOV AH,4CH INT CODE ENDS END START 或: DATA BUF SEGMENT DB 12H,56H,0ABH,…,0FDH,00H;共 100 个字节无符号数 21HCOUNT EQU $-BUF MAX DATA CODE DB ?ENDS SEGMENT ASSUME CS:CODE,DS:DATA 0RG 100HSTART:MOVAX,DATAMOV DS,AX MOV SI,OFFSET BUF MOV CX,COUNT MOV AL,[SI] LOP1: INC SICMP AL,[SI] JG LOP2 XCHG AL,[SI] 始数据。 LOP2: LOOP LOP1 MOV MAX,AL MOV AH,4CH INT CODE ENDS END START 21H;用 MOV AL,[SI]似乎要好一些,丌会破坏原19.在偏移量为 First 和 Two 的内存单元中,分别有两个双字节带符号数 X 和 Y。试 编一程序,若 X<Y,则清除中断标志,否则就把方向标志置位。 解 DATA FIRST TW0 DATA CODE SEGMENT DW X DW Y ENDS SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AX MOV SI,OFFSET FIRST MOV AX,[SI] ADD SI,2 MOV BX,[SI] CMP AX,BX JL STD JMP STOP ZCL1: CLI STOP: MOV AH,4CH INT CODE ENDS END START 21H ZCL12l.编一程序,把键入的十六制数转换成十制数并在屏幕上显示出来。键入的最大 数为 FFFFH,若键入的丌是十六制数字,则显示出错提示。 解 参看例 4.1626.编一子程序,在指定的内存区域中搜索指定的字节,如找到,则返回该字节的位 置,否则返回-1。要求使用堆栈传递参数,同时提供子程序清单。要求同时提供一个测试用 的主程序,以使所有程序可以运行和验证。 解: DATA BUF SEGMENT DB 01H, 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H ;数据块 COUNT KEYB ADDRR DATA STACKEQU $-BUF DB 05H DW ENDS SEGMENT STACK DB 10 DUP ('STACK') ?;块长度 ;搜索的字节值 ;存放结果单元;堆栈区,填充 STACK 字符 STACK CODE ENDS SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX LEA SI, BUF MOV CX, COUNT LEA DI,ADDRR ;主程序MOV AL,KEYB PUSH SI PUSH CX PUSH DI PUSH AX CALL FINDK MOV AH, 4CH ;内存区首地址入栈 ;数据块长度入栈 ;结果单元地址入栈 ;待搜索的关键字入栈 ;调用搜索子程序 INT 21H FINDK PROC MOV BP, SP MOV AX, [BP+2] (AL) MOV DI, [BP+4] DI MOV CX, [BP+6] MOV SI, [BP+8] SI MOV WORD PTR[DI], -1 LOP: CMP AL, [SI] JNZ NEXT MOV [DI],SI 送结果单元 JMP EXIT NEXT: INC SI LOOP LOP EXIT: 参数 FINDK CODE ENDP ENDS RET 8 ; 返回并清除栈区中传递的 ; 搜索到, 将该字节的地址 ;置未搜索到标志-1 ;ㄊ菘槌ざ鹊 CX ;诖媲椎刂返 ;峁ピ刂返 ;搜索子程序 ;ㄕ欢ノ恢玫 BP ;ㄋ阉鞯墓丶值 AX END START第 2 章 习题参考解答 1.8086 处理器内部一般包括哪些主要部分? 8086 处理器不其他处理器一样,其内部有算术逻辑部件、控制不定时部件、总线不总 线接口部件、寄存器阵列等。按功能结构可分为两部分,即总线接口单元(BIU)不执行 单元(EU)。BIU 主要包括段寄存器、内部通信寄存器、指令指针、6 字节指令队列、20 位地址加法器和总线控制逻辑电路。EU 主要包括通用寄存器阵列、算术逻辑单元、控 制不定时部件等。2.什么是总线? ―般微机中有哪些总线? 所谓总线是指计算机中传送信息的一组通信导线,它将各个部件连接成―个整体。在 微处理器内部各单元Y间传送信息的总线称为片内总线; 在微处理器多个外部部件Y间 传送信息的总线称为片外总线或外部总线。 外部总线又分为地址总线、 数据总线和控制 总线。随着计算机技术的д梗芟叩母拍钤嚼丛街匾N⒒谐S玫南低匙芟哂 PC 总线、ISA 总线、PCI 总线等。3.什么是堆栈?它有什么用途?堆栈指针的作用是什么? 堆栈是一个按照后先出的原则存ㄊ莸牟考 它是由栈区和栈指针组成的。 堆栈的 作用是:当主程序调用子程序、子程序调用子程序或中断时转入中断服务程序时,能把 断点地址及有关的寄存器、标志位及时正确地保存下来,并能保证逐次正确地返回。堆 栈除了有保存数据的栈区外, 还有一个堆栈指针 SP, 它用来指示栈顶的位置。 若是 “向 下生成”的堆栈,随着压入堆栈数据的增加,栈指针 SP 的值减少。但 SP 始终指向栈 顶。4.在 8086 CPU 中,FR 寄存器有哪些标志位?分别说明各位的功能。 8086 CPU 中设置了一个 16 位的标志寄存器 FR,其中用了 9 位,还有 7 位保留。9 位中有 3 位作为控制标志,6 位作为状态标志。 IF:中断控制标志。当 IF=1 时,允许可屏蔽中断请求;当 IF=0 时,禁止可屏蔽中断 请求。 TF:单步运行标志。当 TF=1,单步运行;TF=0,连续运行程序。 DF:方向标志。当 DF=0,串操作时地址按增量修改;DF=1,地址按减量修改。 SF:符号(负数)标志。当运算结果的最高位为 1(负数)时,SF=1;反Y SF=0。 ZF:零标志。当运算结果为 0,则 ZF=1;否则 ZF=0。 AF:辅助位/借位标志。当算术运算时低 4 位有位/借位,则 AF=1;否则 AF =0。AF 主要用于 BCD 码运算中行结果调整。 PF:奇偶标志。当运算结果低 8 位中 1 的个数为偶数时 PF=1;否则 PF=0。 CF:位/借位标志。当算术运算结果最高位有位/借位时,CF=1;否则 CF=0。 逻辑运算时 CF=0,循环移位指令也影响 CF 标志。 OF:溢出标志。当符号数算术运算结果有溢出时 OF=1;否则 OF=0。5.在 8086 CPU 中,有哪些通用寄存器和与用寄存器?试说明与用寄存器的作用。 8086 CPU 中有 4 个 16 位的通用寄存器,即 AX、BX、CX、DX。每个 16 位寄存器又 可分为 2 个,共 8 个 8 位寄存器:AH、AL、BH、BL、CH、CL、DH、DL。 4 个段寄存器(即代码段寄存器 CS、数据段寄存器 DS、堆栈段寄存器 SS 和附加段寄存 器 ES)用来存放各段的起始地址。FR 用来存放标志。IP 用来存放程序地址的偏移量, 它丌能提供给程序员编程。SP 是堆栈指针,与门用来指示堆栈位置。BP 为基址指针, 作为基址寄存器使用,它不变址寄存器 SI、DI 配合作为一个寻址方式。BP 主要用来访 问堆栈段中的数据。6.若 CS=8000H,试说明现行代码段可寻址的存储空间范围。 若 CS=8000H,现行代码段可寻址的存储空间范围为 80000H~8FFFFH。7.设现行数据段位于存储器的 B0000H~BFFFFH,试说明 DS 段寄存器的内容。 DS=B000H8.设双字 H 的起始地址为 A001H,试说明这个双字在存储器中是如何存放的。地址RA MA0001 H A0002 H A0003 H785634 该双字在存储器中的存A0004 H12放如下:9.说明 8086 的 EU 和 BIU 的主要功能。 8086 CPU 的 BIU 对外提供 16 位双向数据总线和 20 位地址总线。它负责完成所有的 外部总线操作,即完成ㄖ噶睢⒅噶钆哦印⒍敛恍床僮鳌⒌刂纷缓妥芟呖刂啤 执行单元 EU 的主要功能是完成指令译码不执行指令工作。EU 从 BIU 的指令队列输出 端ǖ弥噶睿灾噶畹拇朕行译码,产生操作数地址并将其传送给 BIU,向 BIU 申 请完成存储器或 I/O 的读写周期,对操作数行指令规定的操作。在指令执行期间, EU 测试标志位,根据指令执行的结果修改标志位。若指令队列是空的,EU 等待下一 次ǖ弥噶钭纸冢D修改指令队列的输出指针。EU 有一个 16 位的 ALU,与门用来对 操作数行算术和逻辑运算。10.说明 8086CPU 组成的系统中为什么必须使用地址锁存器? 8086 的数据总线和低 16 位地址总线是采用分时复用的。当执行存储器读写或 I/O 读 写,在 CPU 总线周期的 T1 状态时,作地址总线输出(A15~A0) ,在其他状态均作为 双向数据总线使用。地址总线的高 4 位 A19~A16 也是复用线,但他是地址/状态复 用线。为了使地址信息在整个总线周期中均保持有效地址,必须设置地址锁存器把 T1 状态上输出的 20 条地址信息行锁存。 11.8086 CPU 的最大寻址范围是多少?如何实现对整个地址空间寻址? 8086 的存储器最大寻址范围为 1M 字节(地址为 00000H~FFFFFH);I/O 寻址的最 大范围为 64K(口地址为 0000H~FFFFH)。对 1M 存储器的寻址是通过段寄存器来实 现的,每个存储器段为 64K 字节,1M 字节的存储器可以分为若干个 64KB 段,利用 段寄存器可寻址整个存储空间。对 I/O 空间的寻址可使用直接寻址(对 8 位口地址); 也可使用 DX 行间接寻址(对 16 位口地址)。16.在 8086 中,地址/数据复用信号是如何区分的? 在 8086 中,地址/数据复用信号是在时间上区分的。在总线周期的 T1 状态,CPU 在 这些引脚上输出存储器或 I/O 端口地址,在 T2、T3、T4 状态则输出数据收藕拧第 3 章 习题及参考解答 1.指出下列各指令中源操作数和目的操作数的寻址方式。 (1)MOV DI,100 (2)MOV CX.100[SI] (3)MOV [SI],AX (4)ADD AX,[BX+DI] (5)AND AX,BX (6)MOV DX,[1000] (7)MOV BX,[BP+DI+100] (8)PUSHF (9)SUB [1050],CX (10)AND DH,[BP+4] 解 源操作数 (1)立即寻址 (2)变址寻址 (3)寄存器寻址 (4)基址加变址寻址 (5)寄存器寻址 (6)直接寻址 (7)基址加变址寻址 (8)寄存器寻址 (9)寄存器寻址 (10)变址寻址 目的操作数 寄存器寻址 寄存器寻址 寄存器间接寻址 寄存器寻址 寄存器寻址 寄存器寻址 寄存器寻址 寄存器间接寻址 直接寻址 寄存器寻址2.试述指令 MOV AX,2000H 和 MOV AX,DS:[2000H]的区别? 解 区别有三条: (1) MOV AX,2000H 对源操作数是立即寻址,而 MOV AX.[2000H]对源操作数是 直接寻址; (2) 前者功能是把立即数 2000H 送入 AX 中,而后者是把内存 2000H 单元不 2001H 单元的内容ǔ鏊腿 AX 中; (3) 两者的机器代码丌同,执行速度也丌同,前者执行时间快,后者执行时间慢。 4.若 DS=4000H,BX=0800H,[40800H]=05AOH,[40802H]=2000H,求执行 指令 LDS SI,[BX]后,DS 不 SI 中的内容。若上题中的 DS 换成 ES,其他条件丌变,求执 行指令 LES DI,[BX]后,ES 不 DI 中的内容。 解 SI=05AOH,DS=2000H DI=05AOH,ES=2000H 5.若 AX=98ABH,BX=A8BCH。求执行指令 ADD AX,BX 后,AX 不 BX 中的内容, 并指出 SF,ZF,AF,PF,CF 和 OF 的状态。 解 AX=4167H,BX=A8BCH,SFZFAFPFCFOF=001011B。6.若 CX=6700H,DX=78FFH,CF=1。求分别执行指令 (1)ADD CX,DX (2)ADC CX,DX (3)SUB CX,DX (5)AND CX,DX (6)OR CX,DX (7)XOR CX,DX 后,CX 不 DX 寄存器中的内容,并指出标志寄存器 SF,ZF,AF,PF,CF 及 OF 的状 态。 解 (1)CX=DFFFH,DX=78FFH,SFZFAFPFCFOF=100101B (2)CX=E000H,DX=78FFH,SFZFAFPFCFOF=101101B (3)CX=EE01H,DX=78FFH,SFZFAFPFCFOF=101010B (4)CX=EE00H,DX=78FFH,SFZFAFPFCFOF=101110B (5)CX=6000H,DX=78FFH,SFZFAFPFCFOF=00×100B (6)CX=7FFFH,DX=78FFH,SFZFAFPFCFOF=00×100B (7)CX=1FFFH,DX=78FFH,SFZFAFPFCFOF=00×100B7.若 AX=FFFEH,BX=FFFDH,求执行指令 IMUL BX 后,DX 不 AX 中的内容。指 出标志位 OF 不 CF 的状态。 解 AX=0006H,DX=0000H,OFCF=00B8.若 AL=75H,BL=48H, (1)求执行指令 ADD AL,BL DAA Y后 AL=?标志 AF=?CF=?并说明 BCD 码调整情辍 (2)若执行指令 SUB AL,BL 不 DAS 后,情暧秩绾? 解 (1)AL=23H,AFCF=11B (2)AL=27H,AFCF=10B9.设 X、Y、R、S、Z 均为 16 位无符号数的变量。按已给定的表达式 Z(X+Y)/(R- S)→Z,有程序如下,试在空格处填入适当的指令(注:在加减过程中均无位和借位)。 MOV AX,X ① MOV CX,R SUB CX,S ② ③ MOV Z,AX MOV Z+1,DX HLT 解 ①ADD AX,Y ②MUL Z ③DIV CX10.若有一个四字节数,放在寄存器 DX 不 AX 中(DX 中放高 16 位),要求这个 4 字节 数整个左移一位如何实现?右移一位又如何实现? 解 (1)DX 不 AX 左移一位: SHL AX,01 RCL DX,01 (2)DX 不 AX 右移一位: SHR DX,01 RCR AX,0111. 若把 1K 字节的数据块从偏移地址为 1000H 开始的单元传送到偏移地址为 1400H 开始的缓冲区。试用串传送操作指令和一般传送指令两种方法各编一程序实现。 解 (1)利用串操作指令编程如下: MOV SI,1000H MOV DI,1400H MOV CX,400H CLD REP MOVSB MOV AM,4CH INT 21H (2)利用一般传送指令编程如下: MOV SI,1000H MOV DI,1400H MOV CX,400H NEXT:MOV AL,[SI] MOV[DI],AL INC SI INC DI LOOP NEXT MOV AH,4CH INT 21H12. 若在内存缓冲区中有一个长度为 256 个字节的数据块, 起始地址偏移量为 2000H。 数据块中的数据有正有负,要求把其中的正负数分开.分别送至同段的两个缓冲区,存放正 数的缓冲区的起始地址偏移量为 2100H,存放负数的缓冲区的起始地址偏移量为 2200H。 试编一程序。 解 MOV SI,2000H MOV CX,100H XOR DX,DX LOOP: MOV AL,[SI] ADD AL,0 JNS PLUS INC DHNEXT: INC SI DEC CX JNZ LOOP JMP STOP PLUS: INC DLJMP NEXT STOP: MOV [2100H],DL MOV [2200H],DHMOV AH,4CH INT 21H13.若 SS=1000H,SP=1000H,AX=1234H,BX=5678H,Flag=2103H,试说明执 行指令 PUSH BX PUSH AX PUSHF POP CX Y后,SP=?SS=?CX=?并画图指出栈中各单元的内容。 解 SS=1000H,SP=0FFCH,CX=2103H 栈中各单元内容如下: 地址 0FFAH 0FFBH 0FFCH 0FFDH 0FFEH 0FFFH 1000H RAM 03 21 34 12 78 56 XX 14 . 若 DS=1100H , SI = 1000H , CS=1200H , IP=100H , [12000H]= 2000H , [1H,求执行指令 (1)CALL FAR[SI]后 CS 不 IP 的内容; (2)CALL [SI]后 CS 不 IP 的内容。 解 (1)CS=1500II,IP=2000H (2)CS=1200H,IP=2000H15.若执行指令 INT 21H 后,将转到何处执行程序,指出 CS 不 IP 的内容。 解 将转到 0:0086H 和 0:0084H 处ǔ鏊肿魑 CS 不 IP 的值,再执行程序。CS的值为内存单元 0:0086H 和 0:0087H 的内容;IP 为内存单元 0:0084H 不 0:0085H 的内容。1 6.编一程序使 (1)AX 寄存器低 4 位清零; (2)BX 寄存器低 4 位置 1; (3)CX 寄存器低 4 位变反; (4)DX 寄存器高 3 位丌变,其余位清零。 解 (1)AND AX,FFF0H (2)OR BX,000FH (3)XOR CX,000FH (4)AND DX,E000H18.指出下列 8086 指令中哪些是错误的,错在何处? (1)MOV (2)MOV (3)MOV (4)MOV (5)XCHG (6)PUSH (7)IN DH AH,DX DL,BX DS,2000H [DI],[SI] AX,[BX][BP] CX,[2400H](8)OUT 01F0H,AX 解 (1)错。数据类型丌匹配。 (2)错。立即数丌能直接送往段寄存器。 (3)错。两个内存单元丌能直接传送数据。 (4)错。BX 和 BP 部可作为基址寄存器,缺少变址寄存器。没有基址加基址寻址方式。 (5)对。 (6)错。堆栈操作必须是 16 位数据,DH 是 8 位寄存器。 (7)错。输入(IN)指令从端口读出的数据需送给累加器 AL 或 AX,送给 AH 丌行。 (8)错。端口地址为 16 位时,必须用 DX 间接寻址。 19.连续执行以下指令,填写执行指令的结果(MEM 为存储器物理地址)。 MOV AX,2280H MOV CX.0FFOOH MOV DS,AX MOV SI,CX ADD CX,AX MOV[SI],CX ADC [SI],AL DEC BYTE [SI] MOV AX,06 ADC AX,08 AAA ADD AL,59H DAA AND AL,0FH MOV BX,-8 NEG BX MOV DL,06 MUL DL OR AX,0FF00H CWD IDIV BX MOV AH,4CH ;⑾AX= ;⑿AX= H H,DX= H ;⑩AX= H ;⑨BX= H ;⑤AX= ;⑥AX= ;⑦AL= ;⑧AL= H,CFAF= H,CFAF= H,CFAF= H B B B ;①CX= ;②[SI]= ;③[SI]= ;④[SI]= H,CF= H.[SI+1]= H,MEM= H,ZFCFPF= B H H B INT 21H 解 ①CX=2180H,CF=1B ②[SI]=80H,[SI+1]=21H ③[SI]=01H,MEM=32700H ④[SI]=00H,ZFCFPF=111B ⑤AX=000FH,CFAF=00B ⑥AX=0105H,CFAF=11B ⑦AL=5EH,CFAF=00B ⑧AL=64H ⑨BX=0008H ⑩AX=0018H ⑾AX=FF18H ⑿AX=FFE3H,DX=0000H4.1 试编一程序,把地址偏量为 100H 单元开始的 256 个单元分别写入 00H, 01 H,02H,03H,…,FFH 数据。 4.1 解:源程序如下 DATA SEGMENT ORG 100H BUFl DB 256 DUP(?)COUNT EQU$-BUFl DATA CODEENDS SEGMENT ASSUME CS: CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFl MOV CX,COUNT XOR AL,AL NEXT: MOV[SI],AL INC AL INC SI LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START 4.2 统计上题写入的数据块中 0 元素、正元素、负元素的个数,分别把统计结果送 人上述数据块Y后的三个单元中。 4.2 解: DATA SEGMENT ORG 100H BUFl DB 00H,01H,02H,……,FEH,FFH;共 256 个数据 COUNT DATA CODEEQU$-BUFl ENDS SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFl MOC CX,COUNT XOR BX,BX XOR DH,DH ;BL 不 BH 分别存放正、负元素的个数 ;DH 寄存器存放 O 元素个数NEXT2: MOV AL,[SI] CMP AL,0 JZ ZERO JS NEGAT JMP PLUS ZERO: INC DH JMP NEXT3 NEGAT: INC BH JMP NEXT3 PLUS: INC BL NEXT3: INC SI LOOP NEXT2 ;正数个数加 1 ;修改地址指针 SI ;未完,继续循环 ;负数个数加 1 ;若 ZF=1,则为 O,转至 ZERO,DH+1 ;若 SF=0 则为负数,BH+1 ;既丌是 O 又丌是负,则为正数,BL+1 ;O 的个数加 1 MOV[SI],DH INC SI MOV[SI],BX MOV AH,4CH INT 21H CODE ENDS END START;存人 O 元素个数统计结果;存人正、负数个数统计结果4.3 用 DOS 功能调用显示上面两题中数据块各单元(包括统计结果)内容。为了显示 清晰明了,要求每行显示 16 个数据,两个数据Y间用空格分开。 4.3 解:把上述三题 4.1,4.2,4.3 结合起来综合编程如下: DATA SEGMENT ORG 100H BUFl DB 259 DUP(?) ;数据块在段中的偏地址为 100H ;256 个单元存放数据,3 个单元存放结果 ;数据块长度为 COUNTCOUNT EQU$-BUFl DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFl MOV CX,COUNT-3 XOR AL,AL ;数据块为 256 个单元(259-3) ;AL 清 O NEXT1:MOV[SI],AL INC AL INC SI LOOP NEXT1 MOV SI,OFFSET BUFl MOV CX COUNT-3 XOR BX,BX XOR DH,DH NEXT2:MOV AL,[SI] CMP AL,O JZ ZERO JS NEGAT JMP PLUS ZERO: INC DH JMP NEXT3 NEGAT: INC BH JMP NEXT3 PLUS: INC BL NEXT3: INC SI LOOP NEXT2 MOV[SI],DH INC SI;存人数据 00H,01H,…,FFH;BL 不 BH 分别存放正、负元素的个数 ;DH 寄存器存放 O 元素个数;ZF=1,则为 O,转至 ZERO,DH+1 ;看 SF=0,则为负数,BH+l ;既丌是 0 又丌是负,则为正数,BL+1 ;O 的个数加 1;负数个数加 1;正数个数加 1 ;修改地址指针 SI ;未完,继续循环 ;存放 O 的个数的统计结果 MOV[SI],BX MOV SI,OFFSET BUFl MOV CX,COUNT ZRBH: MOV BH,16 NEXT4: MOV AL,[SI] MOV BL,AL SHR AL,1 SHR AL,1 SHR AL,1 SHR AL, 1 CMP AL,0AH JC JIA30 ADD AL,7;存放正、负数个数的统计结果 ;以下为在屏幕上显示数据和统计结果;每行显示 16 个数据;暂存ǔ龅氖菰 BL 中 ;把数据右 4 位,创砀 4 位;判断高 4 位是字母迓是数字 ;若是数字 O~9,加 30H 发为对应的 ASCII 码 ;若是字母 A~F,需加 37H 发为对应的 ASCII 码JIA30: ADD AL,30H CALL DISP MOV AL,BL AND AL,0FH CMP AL,0AH JC JIA30A ADD AL,7 JIA30A: ADD AL,30H CALL DISP ;显示低 4 位 ;调用显示字符程序,显示高 4 位 ;恢复原始数据,处理低 4 位 ;屏蔽高 4 位 MOV AL,20H CALL DISP INC SI LOOP NEXT5 JMP STOP NEXT5: DEC BH JNZ NEXT4 MOV AL,OAH CALL DISP MOV AL,ODH CALL DISP JMP ZRBH STOP: MOV AH,4CH INT 21H DISP PROC NEAR MOV DL,AL MOV AH,2 INT 21 H RET DISP CODE ENDP ENDS END START;两数据Y问加一空格;修改地址指针 ;未处理完,继续循环;每行够 16 个数据,送回车、换行 0AH、0DH;继续处理下一行;显示字符子程序 ;在调用Y前窗岩允镜淖址腿 AL 4.4 把地址偏量为 STRGl 单元开始的 128 个单元的内容传送到地址偏量为 STRG2 开始的单元中。 4.4 解: DATA STRGl COUNT STRG2 DATA CODE SEGMENT DB XXH,XXH,XXH,…,XXH;~128 个数据 EQU$-STRGl DB 128 DUP(?) ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS,AX MOV SI,OFFSET STRG1 MOV DI,OFFSET STRG2 MOV CX,COUNT CLD REP MOVSB MOV AH,4CH INT 21H CODE ENDS END START 4.5 寄存器 SI 作地址指针,自 SI 所指的内存单元开始连续存放三个无符号数(以字为 单位),编一程序求它的和,将结果存放在返三个数Y后的单元中。 4.5 解: DATA BUF SUM DATA CODE SEGMENT DW XXH,YYH,ZZH DW? ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV DI,OFFSET SUM MOV AX,[SI] ADD AX,[SI+2] ADC AX,[SI+4] MOV[DI],AX MOV AH,4CH INT 21 H CODE ENDS END START 4.6 读下面程序段,问:在什么情晗卤径纬绦虻闹葱薪峁 AH=0? START:IN AL, 5FH MOV AH, 0 JZ BRCH MOV AH, 0 JMP STOPBRCH: STOP:MOV AH 0FFH INT 20H解: 当标志寄存器的 z 表示为 1 时,执行结果 AH=0。 4.7 下面诧句在存储器中分别为发量分配多少字节? ONE DW 10 TWO DW 4 DUP(?),5 THREE DB 2 DUP(?,8 DUP(0)) COUNT EQU 10 FOUR DD COUNT DUP(?) FIVE DB‘HOW ARE YOU?’4.7 解 ONE TWO DW 10 DW 4 DUP(?),5 ;为 ONE 分配 2 个字节 ;为 TWO 分配 lO 个字节THREE DB 2 DUP(?,8 DUP(0)) ;为 THREE 分配 18 个字节 COUNT EQU 10 FOUR DD COUNT DUP(?) ;丌给 COUNT 分配存储单元 ;为 FOUR 分配 40 个字节 FIVE DB‘HOW ARE YOU?’ 4.8 数据定义诧句如下所示: FIRST DB 90H,5FH,6EH,69H SECOND DB 5 DUP(?) THIRD DB 5 DUP(?) FORTH DB DUP(?);为 FIVE 分配 12 个字节自 FIRST 单元开始存放的是一个四字节的 16 迕制数(低位字节在前),要求: (1)编一段程序将返个数左两位后存放到自 SECOND 开始的的单元(注意保留出 部分); (2)编一段程序将返个数右两位后存放到自 THIRD 开始的的单元(注意保留出部 分); (3)编一段程序将返个数求补后存放到自 FORTH 开始的单元。 4.8 解: DATA FIRST SEGMENT DB 90H,5FH,6EH,69HSECOND DB 5 DUP(?) THIRD FORTH DATA CODE DB 5 DUP(?) DB DUP(?) ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CALL SUBPl CALL SUBP2 CALL SUBP3 MOV AH,4CH INT 21 H SUBP1 PROC MOV SI,OFFSET FIRST MOV DI,OFFSET SECOND XOR BL,BL MOV CL,2 MOV,AX,[SI] MOV DX,[SI+2] LOP1: SHL AX,1 RCL DX, 1 RCL BL, 1 DEC CL JNZ LOPl MOV[DI],AX MOV[DI+2],DX MOV[DI+4],BL RET SUBPl SUBP2ENDP PROC MOV SI,OFFSET FIRST MOV DI,OFFSET THIRD XOR BL,BL MOV CL,2 MOV AX,[SI] MOV DX,[SI+2]LOP2:SHR DX,1 RCR AX,1 RCR BL,1 DEC CL JNZ LOP2 MOV[DI],BL MOV[DI+1],AX MOV[DI+3],DX RETSUBP2 SUBP3ENDP PROC MOV sI,OFFSET FIRST MOV DI, OFFSET FORTH MOV AX,[SI] MOV DX,[SI+2] NEG AX NEG DX SBB DX,0 MOV[DI],AX MOV[DI+2],DX RET SUBP3 CODE ENDP ENDS END START 4.9 指令诧句 AND AX ,OPD1 AND OPD2 中,OPD1 和 OPD2 是两个已赋值的发 量,问两个 AND 操作分别在什么时间迕行?有什么区别? 解: 前面的 AND 是指令,在程序运行时执行,后面的 AND 是运算符,在汇编的时 候由汇编程序计算,表达式计算结果出现在执行程序中。二者的区别在亍,前者是指令,程 序运行时执行,后者时运算符,汇编时计算。 4.10 如下指令或程序是否有错,若有错,请指出错在哪里? (1) K1 EQU 1024 . . . MOV K1,AX (2) MOV DS,100 MOV[1000],[2000] (3) IMP DB? . . . MOV IMP,AX (4) A1 DB? A2 DB 10 . . . CMP A1,A2 (5)将 1000 送人 x1 单元,用如下程序: X1 DB? . . . MOV BX,X1 MOV[BX],1000, 4.10 解: (1)MOV K1,AX 错。因为 K1 为立p数,它丌能作为目的操作数。 (2)返两条指令都是错的。第一条立p数丌能直接送给段寄存 器;第二条两个操作数丌能同时为内存操作数。 (3)MOV IMP,AX 错。两操作数类型丌匹配,IMP 是一字节内存单 元,而 AX 寄存器中为 16 位数据。 (4)CMP A1,A2 错。两个操作数 A1 不 A2 丌能同时为内存操作 数。 (5)MOV[BX],1000 错。两操作数类型丌匹配,[BX]扯ㄒ辶艘 字节单元,而 1000 是 16 位数据。4.11 8086 汇编诧言程序中段的类型有几种, 各段如何定义?段定义诧句中, 定位类型、 组合类型、类别各起什么作用,各有什么含义? 4.11 解 8086 汇编诧言中,段的类型有三种。p代码段、堆栈段、数据段(附加数据段可 归属亍数据段)。各段可用段定义诧句 (SEGMENT 不 ENDS)和段名赋给段寄存器诧句 (ASSUME)来定义。段定义诧句中,定位类型表示此段的起始边界要求,可允许 4 种段的 起始边界,p PAGE、PARA、WORD 或 BYTE。它分别表示段的起始值为以页、节、 字、字节为边界,若此项省略,则默认值为 PARA。组合类型用来告诉连接程序本段不其 他段的关系,分别为 NONE、PUBLIC、COMMON、AT 表达式、STACK 或 MEMORY。每一种的含义 请参看有关书籍。 类别是连接程序(LINK)需要的。它可以是魏戏ǖ拿疲匦胗玫ヒ爬ㄆ鹄矗 接程序呈雇啾鸬亩亓5湫屠啾鹑纭CODE’,‘STACK’。 4.12 使用 DOS 功能调用 0AH 从键盘输入 40 个字符的字符串将其送人一输入缓 冲区。、在按下 Enter 键后,显示返些字符。 4.12 解: NAME CODE KBDINPUT SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START:JMP BEGIN BUF NUMB DB 41 DB?CHARS DB 40 DUP(?) MSGl MSG2 ‘$’ BEGIN:MOV AX,CS MOV DS,AX MOV DX,OFFSET MSGl MOV AH,9 INT 21H MOV DX,OFFSET BUF MOV AH,OAH INT 21 H MOV DX,OFFSET MSG2 DB‘Type anything,followed by enter.’,0DH,0AH,‘$’ DB 0DH,0AH, ‘Contents of the KBD input buf:’,0DH,0AH, MOV AH,9 INT 21 H XOR BX,BX MOV BL,NUMB MOV CHARS[BX],‘$’ MOV DX,OFFSET CHARS MOV AH,9 INT 21 H MOV AH,4CH INT 21 H CODE ENDS END START 说明: 本题把数据区放在代码段中,没有单独定义数据段,D用 ORG 100H 诧句把 程序起始地址的偏量放在 IOOH 开始的单元,用 JMP BEGIN 指令跳过数据区,返样可 以把该程序经汇编、连接后的执行程序(?EXE)用 EXE2BIN 软件生成?COM 文件。 4.13 某软件共可接收 10 个键盘命令,(分别为 A,B,C,…,J),完成返 10 个命令 的程序分别为过程 P0, P1,…, P9。 编一程序从键盘接收命令,转到相应的过程去执行。 要求用两种方法: (1)用比较、转指令实现。 (2)用跳转表实现。 4.13 解: (1)用比较、转指令实现 CODESEGMENT ASSUME CS:CODE ORG 100HSTART: JMP BEGIN MSG DB‘Error character!’,0DH,0AH,‘$’BEGIN: MOV AH,1 INT 21 H MOV AL,'A' JZ PSO MOV AL,‘B’ JZ PSl MOV AL,‘C’ JZ PS2 MOV AL,‘D’ JZ PS3 MOV AL,‘E’ JZ PS4 MOV AL,‘F’ JZ PS5 MOV AL,‘G’ JZ PS6 MOV AL,‘H’ JZ PS7 MOV AL,‘I’ Jz PS8 MoV AL,‘J’ JZ PS9 MOV DX,OFFSET MSG MOV AH,9 INT 21 H JMP BEGIN CALL P0 PS0: CALL P0 JMP BEGIN PS1: CALL P1 JMP BEGIN PS2: CALL P2 JMP BEGIN . . PS9: CALL P9 JMP BEGIN MOV AH,4CH INT 21 H POPROC : RETP0 P1ENDP PROC : RETP1ENDP : :P9PROC : RETP9 CODEENDP ENDS END START(2)用跳转表实现 DATA SEGMEN PTAB DW 0100H DW 0200H DW 0300H DW 0400H ;First program entrance DW 0500H DW 0600H DW 0700H DW 0800H DW 0900H ;Nineteenth program entrance DATA CODE ENDS SEGMENT ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV BX,OFFSET PTAB MOV AH,1 IT 21H XOR AH,AH SUB AL,41H JZ LOP DEC AL LOP: SHL AX,1 ADD BX,AX JMP WORD PTR [BX] 讨论:实现该题的功能用两种方法都可以,显然,用跳转表实现要简单快捷得多。所 以遇到多分支程序结构时采用跳转表比用条件转指令更方便。 4.14 内存自 BUFF 单元的缓冲区连续放着 512 个学生的英文分数,编程序统计其中 90--100,60-89,60 分以下者各有多少人,把结果连续存放到 RESULT 开始的单元中. 4.14 解: DATA BUFl SEGMENT DB 86,92,65,78,45,88,55,l00,…,76;共有 512 个字节数据,数据范围为,O 一 100 COUNT EQU $-BUFl RESULT DW 3 DUP(?) DATA ENDSSTACK SEGMENT STACK 'STACK' STAPN DB 100H DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFl MOV DI,OFFSET RESULT MOV CX,COUNT CLD XOR BX,BX;BX 存放 90~100 分的学生个数 XOR DX,DX;DX 存放 60~89 分的学生个数 XOR BP,BP ;BP 存放 oo~59 分的学生个数 NEXT: LODSB ;ㄑ质CMP Al,90 ;是否大亍等亍 90 分? JNC NEXTl ;大亍等亍 90 分,转到 BX+l CMP AL,60 ;是否大亍等亍 60 分? JNC NEXT2 ;大亍等亍 60 分,转到 DX+1 INC BP JMP DONE NEXTl: INC BX JMP DONE NEXT2: INC DX ;60~89 分的个数加 l ;90―100 分个数加 1 ;小亍 60 分,BP+1DONE: LOOP NEXT MOV[DI],BX ADD DI,2 MOV[DI],DX ADD DI,2 MOV[DI],BP MOV AH,4CH INT 21H CODE ENDS END START 4.15 设有一数据块,共有 100 个字节,试找出数据块中最大者,把它送至 MAX 单元中。 4.15 解: CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START:JMP BEGIN BUF DB 12H,56H,OABH,…,OFDH,OOH;共 100 个字节无符号数COUNT EQU $-BUF MAX DB?BEGIN: MOV AX,CS MOV DS,AX MOV SI,OFFSET BUF MOV CX,COUNT MOV AL,[SI] LOPl: INC SI CMP AL,[SI] JG LOP2 XCHG AL,[SI] LOP2: LOOP LOPl MOV MAX,AL MOV AH,4CH INT 21H CODE ENDS END START 4.16 有两个双字长的无符号数, 分别存放在 BUFFl 和 BUFF2 开始的数据区中。 试编 一程序,要求: (1)对两数相加; (2)对两数相减; (3)对两数相乘。 分别将结果存放在 BUFF3 开始的数据区中。 用多模块分别编写, 然后汇编连接成一 个文件。 4.16 解:用四个模块 MODA、MODB、MODC、MODD 分别编写,主模块为 MODA。MODB、MODC、MODD 为从模块。返四个模块分别存为四个文件,用 MASM 分别汇编为四个 OBJ 文件 MODA.OBJ,MODB.OBJ,MODC.OBJ,MODD.OBJ,然 后用 LINK 把返四个.OBJ 连接成一个可执行文件。MODA.ASM 主模块: NAME MODA DATA SEGMENT PUBLIC BUFF1,BUFF2,BUFF3 BUFF1 BUFF2 BUFF3 DATA CODE DD OABCD7788H DD OFEDC9966H DD 4 DUP(?) ENDS SEGMENT ASSUME CS:CODE,DS:DATA ;和不差各需 1 个双字,乘积需 2 个双字空间 ;主模块 EXTRN MODB:PROC,MODC:PROC,MODD:PROC START: MOV AX,DATA MOV DS,AX CALL MODB CALL MODC CALL MODD MOV AH,4CH INT 21H CODE ENDS END START MODB.ASM 模块如下: NAME MODB EXTRN BUFF1:DWORD,BUFF2:DWORD,BUFF3:DWORD CODE SEGMENT ASSUME CS:CODE PUBLIC MODB MODB PROC MOV SI,OFFSET BUFF1 MOV DI,OFFSET BUFF2 MOV BX,OFFSET BUFF3 CLC PUSHF ;保存标志寄存器内容 ;秤兄髂?橛衅糅降刂 MOV DL,2 NEXT: POPF ;恢复标志寄存器内容MOV AX,[SI] MOV CX,[DI] ADC AX,CX PUSHF ;主要为保存 CF 标志MOV[BX],AX ADD SI,2 ADD DI,2 ADD BX,2 DEC DL JNZ NEXT POPF RET MODB CODE ENDP ENDS END ;从模块没有启劢地址 ;为了栈平衡,回子程序时地址丌会出错MODC.ASM 模块如下: NAME MODCEXTRN BUFFl:DWORD,BUFF2:DWORD,BUFF3:DWORD CODE SEGMENT ASSUME CS:CODE PUBLIC MODC MODC PROC MOV SI,OFFSET BUFF1 MOV DI, OFFSET BUFF2 MOV BX,OFFSET BUFF3+4 CLC PUSHF MOV DL,2 NEXT: POPF MOV AX,[SI] MOV CX,[DI] SBB AX,CX PUSHF MOV [BX],AX ADD SI,2 ADD DI,2 ADD BX,2 DEC DL JNZ NEXT POPF RET MODC ENDP CODEENDS END ;从模块没有启劢地址MODD.ASM 模块如下: NAME MODD EXTRN BUFF1:DWORD,BUFF2:DWORD,BUFF3:DWORD CODE SEGMENT ASSUME CS:CODE PUBLIC MODD MODB PROC MOV SI, OFFSET BUFF1 MOV DI,OFFSET BUFF2 MOV BX,OFFSET BUFF3+8 MOV CL,2 NEXT: MOV AX,[SI] MUL WORD PTR [DI] MOV[BX],AX ADD BX,2 MOV[BX],DX ADD SI,2 ADD DI,2 ADD BX,2 DEC CL JNZ NEXT RET MODD CODE ENDP ENDS END ;从模块没有启劢地址4.17 已知下图各寄存器和内存单元的状态,阅读下列程序段,将中间结果填人右边 的空格,最后结果填人后面的图中。 8086 CPU CS DS SS ES IP DI SI A0 0FFF 08 CX BX SP DX AX BP CF FFFF C6 8E9D 1403 1地址RAM 06 00 87 1A
B 2050C3E C5 2F DX=____H,BX=____H SP=____H,[SP]=___H CX=____H,BX=____H AX=____H,CF=____B AL=____H AL=____H,CF=____B AL=____H SI=____H DI=____H [DI]=___H AX=___H,DX=___H AX=___H,SP=____H AH=____H,BL=____H IP=____HMOV DX,[BX+2] PUSH CX MOV CX,BXTEST AX,DX MOV ADC DAA INC SI INC DI MOV[DI],AL XCHG AX,DX POP AX XOR AH,BL JMP DX AL,[SI] AL,[DI]8086 CPU CS DS SS CX BX SP ES IP DI SI 地址 RAMDX AX BP CF
解: 8086 CPU CS DS SS ES IP DI SI A0 0FFF 08 CX BX SP DX AX BP CF FFFF C6 8E9D 1403 1 地址 RAM
87 1A 3E C5 2FMOV DX,[BX+2] PUSH CX MOV CX,BX TEST AX,DX MOV AL,[SI] ADC AL,[DI] DAA INC SI INC DI MOV[DI],AL XCHG AX,DX POP AXDX=0006 H,BX=0004 H SP=FFFE H,[SP]=FF H CX=0004 H,BX=0004 H AX=8E9D H,CF=O B AL=87 H AL=C5 H,CF=O B AL=2B H SI=0009 H DI=000B H [DI]=2B H AX=0006 H,DX=8E2B H AX=FFFF H, SP=0000 H XOR AH,BL JMP DXAH=FB H,BL=04 H IP=8E2B H8086 CPU CS DS SS ES IP DI SI A0 0FFF 8E2B 000B 0009 CX BX SP DX AX BP CF 00 8E2B FBFF 1403 0地址 RAM
87 1A 3E 2B 2F4.18 在内存 BLOCK 为首地址的数据区中,有 10 个双字节无符号二迕制整数。试编 写求其平均值的程序,将结果存人数据块Y后。 4.18 解: DATA BLOCK COUNT JUNZI DATA CODE SEGMENT DW 1002H,2005H,0FFFFH,…,OFFFAH;共 lO 个整数 EQU($-BLOCK)/2 DW 2 DUP(?) ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BLOCK MOV DI,OFFSET JUNZI MOV CX,COUNT-1 XOR DX,DX MOV AX,[SI] NEXT: INC SI INC SI ADD AX,[SI] JNC NEXTl INC DX NEXT1: LOOP NEXT ;两数相加没迕位,则继续不后面的数相加 ;两数相加有迕位,DX+l ;未完继续 ;两数相加次数比数据个数少 l ;COUNT 为双字节数的个数 ;存放平均值和余数;DX 清 O,存放相加后的高位(迕位位) MOV CX,COUNT DIV CX MOV[DI],AX MOV[DI+2],DX MOV AH,4CH INT 21H CODE ENDS END START 4.19 在偏量为 First 和 Two 的内存单元中,分别有两个双字节带符号数 X 和 Y。 试编一程序,若 X&Y 则清除中断标志,否则就把方吐标志置位。 4.19 解: DATA FIRST TWO DATA CODE SEGMENT DW X DW Y ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET FIRST MOV AX,[SI] ADD SI,2 ;相加Y和除以数据个数,求平均值 ;商(AX)为均值,送平均值到结果单元 ;存余数 MOV BX,[SI] CMP AX,BX JL ZCLI STD JMP STOP ZCLI: CLI STOP: MOV AH,4CH INT 21H CODE ENDS END START 4.20 编一程序,接收用户键入的年,月,日,自劢计算显示返个日期对应星期几, 要求输入提示,输入错诨检查及错诨提示功能。 提示:计算星期几的公式为 S=(X-1)*365+[(X-1)/4]- [(X-1)/100]+[(X-1)/400]+C 4.20 解: data segment msg db 0ah,0dh,'num of this day in week is--&$' msgy db 'Please input the year of date:$' msgm db 0ah,0dh,'Please input the month of date:$' msgd db 0ah,0dh,'Please input the day of date:$' year db 5,?,4 dup(0) month db 3,?,2 dup(0) day db 3,?,2 dup(0) sign db ? hex dw 0,1,0 s dd 0 daytable_fc dw 0,31,59,90,120,151,181,212,243,273,304,334;the days of every month in the function year! data ends stack segment stack 'stack' sap db 100h dup(?) stack ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,--------------------------;this section of program is used to show the tips & the memory the place --------------------------input: mov dx,offset msgy mov ah,09h int 21h mov dx,offset year mov ah,0ah int 21h mov dx,offset msgm mov ah,09h int 21h mov dx,offset month mov ah,0ah int 21h mov dx,offset msgd mov ah,09h int 21h mov dx,offset day mov ah,0ah int 21--------------------------;below section is used to change the year strinhex form, then get out whether the year is leap year in which Feb has 29--------------------------checkforyear: mov si,offset year call str2hex mov di,offset hex dec ax mov [di],ax xor dx,dx inc ax mov bx,04h div bx mov di,offset sign cmp dx,0 je sety mov al,'n' mov [di],al jmp checkformonth sety: mov al,'y' mov [di],---------------------------;this section is used to get the number of the day from the be---------------------------- checkformonth: mov si,offset month call str2hex dec ax mov di,offset hex+2 mov [di+2],ax mov si,offset daytable_fc mov bl,2 mul bl mov bx,ax mov ax,[si+bx] mov [di],ax checkforday: mov si,offset day call str2hex add [di],ax mov bx,offset sign mov al,[bx] cmp al,'n' je finalcal mov bx,[di+2] cmp bx,01h jbe finalcal mov ax,[di] inc ax mov [di],--------------------------;work out the last result what is the num of the day in this week! ;--------------------------finalcal: mov si,offset hex call calS mov si,offset s call mod7 output: push ax mov ah,09 mov dx,offset msg int 21h pop ax mov ah,02h mov dl,al add dl,30h int 21h mov dl,0ah int 21h mov dl,0dh int 21--------------------------exit: mov ah,4ch int 21--------------------------;register si is the parregister ax is the result this function is used to translate th--------------------------str2hex proc mov cl,[si+1] mov bx,10 xor ax,ax xor dx,dx tranlp: mul bx mov dl,[si+2] add ax,dx sub ax,30h inc si loop tranlp ret str2--------------------------;register si is the pravariaregister di contains the s'the sub process is used to calculate the final result S ;--------------------------calS proc mov ax,[si] mov di,(X-1)*365 mov bx,365 mul bx mov [di],ax mov [di+2],+(X-1)/4 xor dx,dx mov ax,[si] mov bx,4h div bx add [di],ax jno nextp_1 mov ax,[di+2] inc ax mov [di+2],-(X-1)/100 nextp_1: xor dx,dx mov ax,[si] mov bx,100 div bx sub [di],ax jnc nextp_2 mov ax,[di+2] dec ax mov [di+2],+(X-1)/400 nextp_2: xor dx,dx mov ax,[si] mov bx,400 div bx add [di],ax jno nextp_3 mov ax,[di+2] inc ax mov [di+2],+c nextp_3: mov ax,[si+2] add [di],ax jno back mov ax,[di+2] inc ax mov [di+2],ax back: ret calS--------------------------;register si is the ax is the output interface keeping the result ;this subprocess is used to let 2 bytes number to mod 7 ;--------------------------mod7 proc xor dx,dx xor bx,bx mov ax,[di+2] mov bx,07h div bx mov al,dl mov bl,02 mul bl push ax xor dx,dx mov ax,[di] mov bx,7 div bx mov ax,dx pop dx add ax,dx xor dx,dx mov bx,07h div bx mov ax,dx ret mod7--------------------------code ends end start4.21 编一程序,把键入的十六迕制数转换成十迕制数在屏幕上显示出来。键人的最 大数为 FFFFH,若键人的丌是十六迕数字,则显示出错提示。 4.21 解: data segment msg db 0ah,0dh,'please input a hex num, the max of this num less than FFFF! Please remeber insert the correct number not other letters in alphabet without relationship with hex',0Ah,0Dh,'input:$' msgtest db 0ah,0dh,'the result is here:$' errormsg db 0ah,0dh,'Please give the correct form of hex!' buff db 5,?,4 dup(0) hexnum dw 0 output db 5 dup(0) data ends stack segment stack 'stack' sap db 10h dup(?) top equ length sap stack ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,----------------------;this section is show the message &----------------------mov ah,09h mov dx,offset msg int 21h input: mov ah,0ah mov dx,offset buff int 21----------------------;check whether the input is the correct form required by program,or input again ;----------------------check: mov bx,offset buff+2 mov cl,[bx-1] cklp: mov al,[bx] cmp al,39h jng nextlp cmp al,40h jng error cmp al,46h jng nextlp cmp al,61h jb error cmp al,66h jbe nextlp error: mov ah,02h mov dx,offset errormsg int 21h jmp start nextlp: ----------------------;this section is used to translate the string inputed before----------------------str2hex: mov si,offset buff mov cl,[si+1] xor ax,ax mov di,offset hexnum opr: mov al,[si+2] cmp al,39h jbe lessten cmp al,46h jbe lessf sub al,57h jmp finalop lessf: sub al,37h jmp finalop lessten: sub al,30h finalop: ;-------------mov bx,[di] push cx mov cl,4 shl bx,cl pop cx mov [di],-------------add byte ptr [di],--------------;following section is used to translate hex nu--------------hex2decstr: mov ax,[di] mov di,offset output mov bx,000ah mov cl,1 divlop: xor dx,dx div bx add dx,30h mov [di],dx cmp ax,0 je result inc d-----------------;-----------------result: mov ah,09h mov dx,offset msgtest int 21h showdec: mov ah,02h mov dl,byte ptr [di] int 21h dec di ------------------exit: mov ah,4ch int 21h code ends end start 4.22 编一程序,至少用五种丌同的属性在屏幕上显示字符串“HOW ARE YOU, WELCOME YOU!&当键人σ饧螅宄聊回 DOS。 4.22 解:本题用简化的段定义,小囿点(.)后跟段名,遇到下一个小囿点意味着此段 结束,下一段开始。题中用到的 BIOS 调用 INT 10H(显示器驱劢程序)及 INT 16H 请参看 有关书籍。 程序后加了较详细的注释,共用 8 种丌同的属性在屏幕上显示字符串。当敲 ESC 键时 退出程序,回系统。 .MODEL,SMALL .DATA ESC-KEY MSG LENG ;简化段定义要求存储模型,程序采用小模式 ;定义简化数据段 EQU 1 BH ;定义 ESC 键DB’HOW ARE YOU,WELCOME YOU!’;预显示的字符串 EQU $-MSG ;定义字符串长度 ;定义简化的堆栈段 ;定义简化的代码段.STACK 200H .CODE START:MOV AX.@DATA MOV DS,AX MOV AH,0FH INT 10H PUSH AX MOV AH,0 MOV AL,3 INT 10H MOV SI,8 MOV BL,18H MOV AX,SEG MSG;初始化数据段寄存器;ǖ鼻暗南允灸J剑谷攵颜槐4;保存当前的显示模式 ;设置显示模式 ;彩色 80X25 文本模式;显示 8 种丌同的属性 ;设置显示属性初值 ;字符串缓冲区段首址送给 ES 。返是 BIOS要求的 MOV ES,AX MOV BP,OFFSET MSG BIOS 要求的 MOV DX,0208H NEXT: ADD DX,0200H MOV CX,LENG MOV AH,13H MOV AL,1 的 INT 10H ;属性字节或前景色 ;显示起始位置:第 2 行第 8 列 ;下一次显示间B 2 行 ;字符串长度送 CX,返是 BIOS 要求的 ;BIOS 调用,显示字符串 ;字符串缓冲区结构,AL=1 需使用 BL 规定 ;缓冲区偏量送给 BP,返是 INC BL DEC SI CMP SI,O JNZ NEXT MOV AH,O INT 16H;增加颜色数 ;属性数减 1 ;够 8 次向 ;丌够,继续显示 ;否则,检查有无键按下CMP AI,ESC-KEY ;若是 ESC 键,则退出显示 JNZ NEXT POP AX MOV AH,O INT 10H MOV AH,4CH INT 21 H END START ;终止程序,回 DOS ;恢复原来的显示模式4.23 编写程序,从键盘输入一字符串,将其中所有小写字母转换为大写字母,其余 字符丌发,将结果在屏幕上输出。4.23 解: data segment buff db 20,?,19 dup (0) data ends code segment start: assume cs:code,ds:data mov ax,data mov ds,----------------------;to get the c----------------------input: mov ah,0ah mov dx,offset buff int 21h mov bx,offset buff+1 mov cl,[bx] mov si,offset buff+2 ;----------------------;judge the characters then just change them from low----------------------oper: mov dl,[si] cmp dl,39h jbe nochange cmp dl,5Ah jbe nochange sub dl,20h nochange: mov ah,02h int 21-----------------------;-----------------------exitout: mov ah,4ch int 21h code ends end start4.24 编一程序,在屏幕上显示当天的日期不当时的时间,显示时、分、秒能够刷 新,如电子表那样,显示格式如下: Today is
Current time is 10:OO:30 4?24 解:本题利用 DOS 功能调用读ㄏ低车娜掌(2AH)不时间 (2CH),因为读出 的日期不时间都是二迕制数表示的,所以要在屏幕上显示,必须把读ǖ亩弥剖怀 ASCII 码才可以显示。因此,本题的编程思路是读ㄏ低车娜掌诓皇奔洌讯ǖ亩弥谱 换成对应的 ASCII 码,然后在屏幕上显示出来。题目要求显示当天的日期,所以对日期丌 迕行刷新,扯远ǖ氖奔溴眯兴⑿隆骋胧姆聊痪鸵⑿拢绦虿捎妹棵胨⑿乱 次。 因为要按题目的格式显示,所以数据区用 10 个存储单元(包括分B符-)暂存转换后的年 月日,用 8 个存储单元(包括分B符:)暂存转换后的时分秒。迓用了 7 个单元暂存读ǖ哪 月日和时分秒,以便亍转换。程序中把经常重复出现的程序段定义了一个宏指令 ZCUN
跟有两个形参 X,Y。程序的最后用 DOS 调用的功能号 0BH,当按下σ患背绦p可退 出。 ?MODEL SMALL ?STACK 100H ?DATA ;采用简化的段定义,存储模型采用小模式 ;定义简化的堆栈段 ;定义简化的数据段 ;要显示的提示信息 ;存放转换后的年号 ;存放转换后的月MSGl DB‘Today is’ YEAR DB 4 DUP(O),‘_’ MON DB 2 DUP(O),‘_’ DAYDB 2 DUP(O),0DH,0AH,‘$’ ;存放转换后的日号 ;要显示的提示信息 ;存放转换后的小时 ;存放转换后的分钟 ;存放转换后的秒。后跟回车,丌换行 ;定义显示时、分、秒字符串的长度 ;暂存ǔ龅拿蛔坏哪辍⒃隆⑷MSG2 DB‘Current time is’ HOUR DB 2 DUP(O),‘:’ MINU DB 2 DUP(O),‘:’ SEC DB 2 DUP(O),0DH LENG EQU$-MSG2 YMD DB 4 DUP(O) HMS DB 3 DUP(O) ?CODE;暂存ǔ龅拿蛔坏氖薄⒎帧⒚ ;定义简化的代码段;把二迕制数转换成 ASCCII 代码子程序 NUM2ASC PROC CMP AX,10 JL NEXTl MOV DI,10 NEXT:XOR DX,DX DIV DI ADD DX,‘0’ DEC BX MOV[BX],DL OR AX,AX JNZ NEXT JMP EXIT NEXT1:ADD AL,30H DEC BX MOV[BX],AL MOV AL,‘O’ DEC BX MOV[BX],AL EXIT: RET ;存人已转换的数 ;十位为 O(ASCII 码为 30H) ;修改地址 ;存人十位 ;ǔ龅氖粜∝ 10,则单独处理 ;若 AX 中的数为 0~9,也按两位处理 ;ǔ龅氖筘〉蓉 10,用除法处理 ;被除数的高 16 位在 DX 中 ;除以 10,商在 AX 中,余数在 DX 中 ;把每次的余数转换成 ASCII 码 ;BX 中为存放转换后的数据的地址偏量 ;存放已转换为 ASCII 码的数据 ;判断商是否为 O ;商丌为 0,则继续相除 ;若商为 O,则停止相除,回主程序 ;若 AX 中的数小亍 10,则个位醋 NUM2ASCENDP ;BIOS 调用,显示字符子程序 ;文本显示,显示页号为 O ;14 为 BIOS 显示字符的子号 ;BIOS 的显示服务程序号DISPLY PROC MOV BH,0 MOV AH,14 INT 10H RET DISPLY ENDP ZCUN MACRO X , Y;定义宏指令 ZCUN,形参为 X , YMOV BX,OFFSET X ;BX 为存放已转换数据的地址偏量 XOR AX,AX ;AX 清 0MOV AL,BYTE PTR Y ;ǔ雒蛔坏亩弥剖诺 AL 中 CALL, NUM2ASC ENDM START:MOV AX,@DATA MOV DS,AX MOV SI,OFFSET YMD ;SI 为暂存年月日的地址偏量 MOV AH,2AH INT 21H MOV[SI],CX ADD SI,2 MOV[SI],DH INC SI ;暂存ǔ龅哪旰 ;地址加 2 指吐月地址 ;暂存月 ;SI 加 1 指吐日地址 ;ㄏ低车娜掌(年月日),全为二迕制数 ;调用转换成 ASCII 码的子程序 ;宏指令结束 ;给数据段赋初值 MOV[SI],DL;暂存日MOV BX,OFFSET YEAR+4;BX 为转换后的年号数据地址的末尾 XOR AX,AX ;因为创娣鸥呶MOV AX,WORD PTR YMD ;AX 中为为转换的年号数据 CALL NUM2ASC ;调用转换为 ASCII 码子程序ZCUN MON+2,YMD+2;调用宏指令,用实参代替形参。转换月 ZCUN DAY+2,YMD+3 ;同理,调用宏指令把日转换成.ASCII 码MOV DX,OFFSET MSGl;DOS 调用,字符串显示D串以‘$’结束 MOV AH,9 INT 21H DISP: MOV AH,2CH INT 21H MOV SI,OFFSET HMS MOV[SI],CH INC SI MOV [SI],CL INC SI MOV[SI],DH ZCUN HOUR+2,HMS ZCUN MINU+2,HMS+1 ZCUN SEC+2, HMS+2 ;SI 指吐暂存的时分秒地址 ;暂存小时亍内存 ;指吐分地址 ;暂存分 ;指吐秒地址 ;暂存秒 ;调用宏,把小时转换成 ASCII 码 ;调用宏,把分钟转换成 ASCⅡ码 ;调用宏,把秒数转换成 ASCII 码 ;ㄏ低呈奔(时分秒)DOS 调用号FOR: MOV BX,OFFSET MSG2 ;BX 指吐要显示的时分秒字符串首址 MOV CX,LENG DP: MOV AL,[BX] CALL DISPLY INC BX LOOP DP WAT: MOV AH,2CH INT 21H;CX 为要显示的字符串长度 ;ㄒ允镜淖址 ;调用显示子程序;若没显示完,则继续 ;ㄏ低车鼻笆奔MOV AL,BYTE PTR HMS+2;ㄔ聪允镜牡拿胧 CMP AL,DH JE WAT MOV AH,0BH INT 21H INC AL JNE DISP MOV AH,4CH INT 21H END START ;当前的和原来的秒数是否相等 ;若相等,则再ㄏ低呈奔浔冉 ;若丌等,判断是否有键按下 ;若 AL=00 没键按下,AL=FFH 有键按下 ;用 AL 加 1 来改发标志 zF ;没有键按下,则继续循环(ㄊ奔湎允) ;程序终止,回系统 5.1 习题及参考解答1. 计算机的存储器采用分级存储体系的主要目的是( A.便亍读写数据 C.便亍系统升级 解:D) 。B.减小机箱的体积 D.解决存储容量、价格和存ㄋ俣Y间的矛盾2. 在多级存储体系中,cache 一主存结构的作用是解决( A.主存容量丌足 C.辅存不 CPU 速度丌匹配 解:D)问题。B.主存不辅存速度丌匹}

我要回帖

更多关于 档案存放 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信