1、1习题 11.1 什么是汇编语言?为什么要学习汇编语言?【解】:汇编语言是机器语言的符号表示形式。汇编语言将机器语言指令和地址符号化,程序员只需要记住符号名并用其编程,汇编器负责把汇编程序翻译成机器指令和正确的地址数值。大多数程序应该也可以用高级语言编写,但是在某些情况下汇编语言也是必不可少的。汇编语言可以访问计算机的所有指令,可以利用计算机的所有特性,而高级语言就没有这样的能力,高级语言能做的事情汇编语言都能做,而汇编语言能做的高级语言不一定能做到。学习汇编语言的原因主要有两个:性能和对计算机的完全控制。一般而言,汇编语言具有如下特点:执行速度快;程序短小;可以直接控制硬件;可以方便地编译;
2、辅助计算机工作者掌握计算机体系结构。1.2 把下列十进制数转换成二进制数、八进制数、十六进制数: 6.25 5.75 0.875 254【解】: 6.25D = (6.25) 10 = (110.01)2= (110.010)2 = (6.2)8= (0110.0100)2 = (6.4)16 5.75 D = (5.75) 10 = (101.11)2= (101.110)2 = (5.6)8= (0101.1100)2 = (5.C)16 0.875 D = (0.875)10 = (0.111)2习题 22.1 什么是微处理器?它包含哪几部分?【解】:微处理器(CPU)的任务是执行存放在
3、存储器里的指令序列。为此,除要完成算术逻辑操作外,还需要担负 CPU 和存储器以及 I/O 之间的数据传送任务。早期的 CPU 芯片只包括运算器和控制器两大部分。从 80386 开始,为使存储器速度能更好地与运算器的速度相匹配,已在芯片中引入高速缓冲存储器。 它们主要由以下三部分组成。(1)算术逻辑部件算术逻辑部件(Arithmetic Logic Unit,ALU)用来进行算术和逻辑运算及其相应操作。(2)控制逻辑部件控制逻辑部件负责对全机的控制工作,包括从存储器取出指令,对指令进行译码分析,从存储器取得操作数,发出执行指令的所有命令,把结果存入存储器以及对总线及 I/O 的传送控制等。(3
4、)工作寄存器工作寄存器在计算机中起着重要的作用,每一个寄存器相当于运算器中的一个存储单元,但它的存取速度比存储器要快得多。它用来存放计算过程中所需要的或所得到的各种信息,包括操作数地址、操作数及运算的中间结果等。2.2 8086 微处理器由哪几部分组成?各部分的功能是什么? 【解】:按功能可分为两部分:总线接口单元 BIU(Bus Interface Unit)和执行单元 EU(Execution Unit) 。总线接口单元 BIU 是 8086 CPU 在存储器和 I/O 设备之间的接口部件,负责对全部引脚的操作,即 8086 对存储器和 I/O 设备的所有操作都是由 BIU 完成的。所有对
5、外部总线的操作都必须有正确的地址和适当的控制信号,BIU 中的各部件主要是围绕这个目标设计的。它提供了 16 位双向数据总线、20 位地址总线和若干条控制总线。 其具体任务是:负责从内存单元中预取指令,并将它们送到指令队列缓冲器暂存。CPU 执行指令时,总线接口单元要配合执行单元,从指定的内存单元或 I/O端口中取出数据传送给执行单元,或者把执行单元的处理结果传送到指定的内存单元或 I/O 端口中。执行单元 EU 中包含 1 个 16 位的运算器 ALU、8 个 16 位的寄存器、1 个 16位标志寄存器 FR、1 个运算暂存器和执行单元的控制电路。这个单元进行所有指令的解释和执行,同时管理上
6、述有关的寄存器。EU 对指令的执行是从取指令操作码开始的,它从总线接口单元的指令队列缓冲器中每次取一个字节。如果指令队列缓冲器中是空的,那么 EU 就要等待 BIU 通过外部总线从存储器中取得指令并送到 EU,通过译码电路分析,发出相应控制命令,控制 ALU 数据总线中数据的流向。2.3 简述 8086 CPU 的寄存器组织。【解】:(1)通用寄存器:通用寄存器又称数据寄存器,既可作为 16 位数据寄存器使用,也可作为两个 8 位数据寄存器使用。当用作 16 位时,称为AX、BX、CX、DX。当用作 8 位时,AH、BH、CH、DH 存放高字节,AL、BL、CL、DL 存放低字节,并且可独立寻
7、址。这样,4 个 16 位寄存器就可当作 8 个 8 位寄存器来使用。(2)段寄存器:段寄存器共有 4 个 CS、DS、SS、ES。代码段寄存器 CS 表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移值则由 IP 提供;堆栈段寄存器 SS 指定当前堆栈的起始地址;数据段寄存器 DS 指示2当前程序使用的数据所存放段的起始地址;附加段寄存器 ES 则指出当前程序使用附加段地址的起始位置,该段一般用来存放原始数据或运算结果。 (3)指针和变址寄存器:堆栈指针 SP 用以指出在堆栈段中当前栈顶的地址。入栈(PUSH)和出栈(POP )指令由 SP 给出栈顶的偏移地址。基址指针
8、BP 指出要处理的数据在堆栈段中的基地址,故称为基址指针寄存器。变址寄存器 SI 和 DI用来存放当前数据段中某个单元的偏移量。(4)指令指针与标志寄存器:指令指针 IP 的功能跟 Z80 CPU 中的程序计数器 PC 的功能类似。正常运行时,IP 中存放的是 BIU 要取的下一条指令的偏移地址。它具有自动加 1 功能,每当执行一次取指令操作时,它将自动加 1,使它指向要取的下一内存单元,每取一个字节后 IP 内容加 1,而取一个字后 IP 内容则加2。某些指令可使 IP 值改变,某些指令还可使 IP 值压入堆栈或从堆栈中弹出。标志寄存器 FLAGS 是 16 位的寄存器,8086 共使用了
9、9 个有效位,标志寄存器格式如图 2.5 所示。其中的 6 位是状态标志位,3 位为控制标志位。状态标志位是当一些指令执行后,表征所产生数据的一些特征。而控制标志位则可以由程序写入,以达到控制处理机状态或程序执行方式的表征。2.4 试述 8086 CPU 标志寄存器各位的含义与作用。【解】:(1) 6 个状态标志位的功能分别叙述如下:CF(Carry Flag)进位标志位。当执行一个加法(或减法)运算,使最高位产生进位(或借位)时,CF 为 1;否则为 0。PF(Parity Flag)奇偶标志位。该标志位反映运算结果中 1 的个数是偶数还是奇数。当指令执行结果的低 8 位中含有偶数个 1 时
10、,PF=1;否则 PF=0。AF(Auxiliary carry Flag)辅助进位标志位。当执行一个加法 (或减法)运算,使结果的低 4 位向高 4 位有进位(或借位) 时,AF=1;否则 AF=0。ZF(Zero Flag)零标志位。若当前的运算结果为零,ZF=1;否则 ZF=0。SF(Sign Flag)符号标志位。它和运算结果的最高位相同。OF(Overflow Flag)溢出标志位。当补码运算有溢出时, OF=1;否则OF=0。(2) 3 个控制标志位用来控制 CPU 的操作,由指令进行置位和复位。DF(Direction Flag)方向标志位。它用以指定字符串处理时的方向,当该位置
11、“1” 时,字符串以递减顺序处理,即地址以从高到低顺序递减。反之,则以递增顺序处理。IF(Interrupt enable Flag)中断允许标志位。它用来控制 8086 是否允许接收外部中断请求。若 IF=1,8086 能响应外部中断,反之则不响应外部中断。注意:IF 的状态不影响非屏蔽中断请求(NMI)和 CPU 内部中断请求。TF(Trap Flag)跟踪标志位。它是为调试程序而设定的陷阱控制位。当该位置“1” 时,8086 CPU 处于单步状态,此时 CPU 每执行完一条指令就自动产生一次内部中断。当该位复位后,CPU 恢复正常工作。2.5 8086 中,存储器为什么采用分段管理? 【
12、解】:8086/8088 的地址总线宽度为 20 位,其最大寻址空间是 1 MB。而其他微处理器则在实模式下只能访问前 1 MB 的存储器地址。实际上,实模式就是为8086/8088 而设计的工作方式,它要解决在 16 位字长的机器里怎么提供 20 位地址的问题,而解决的办法是采用存储器地址分段的方法。程序员在编制程序时要把存储器划分成段,在每个段内地址空间是线性增长的。每个段的大小可达 64 KB,这样段内地址可以用 16 位表示。存储器分段的方法虽然给程序设计带来一定的麻烦,但这种方法可以扩大存储空间,而且对于程序的再定位也是很方便的。2.6 什么是逻辑地址?什么是物理地址?如何由逻辑地址
13、计算物理地址?【解】:物理地址:完成存储器单元或 I/O 端口寻址的实际地址成为物理地址,CPU 型号不同其物理地址也不同。物理地址是指 CPU 和存储器进行数据交换时实际所使用的地址,而逻辑地址是程序使用的地址。物理地址由两部分组成:段基址(段起始地址高 16 位)和偏移地址。前者由段寄存器给出,后者是指存储单元所在的位置离段起始地址的偏移距离。当 CPU 寻址某个存储单元时,先将段寄存器的内容左移 4 位,然后加上指令中提供的 16 位偏移地址而形成 20 位物理地址。在取指令时,CPU 自动选择代码段寄存器 CS,左移 4 位后,加上指令提供的 16位偏移地址,计算出要取指令的物理地址。
14、堆栈操作时,CPU 自动选择堆栈段寄存器 SS,将其内容左移 4 位后,加上指令提供的 16 位偏移地址,计算出栈顶单元的物理地址。每当存取操作数时,CPU 会自动选择数据段寄存器(或附加段寄存器 ES),将段基值左移 4 位后加上 16 位偏移地址,得到操作数在内存的物理地址。2.7 8086 和 8088 的主要区别有哪些? 【解】: 8086 与 8088 的主要区别如下:8086 的外部数据总线和内部数据总线都是 16 位的,是真正的 16 位机。8088 的内部数据总线是 16 位的,而外部数据总线是 8 位的,所以称为准 16 位机或超级 8 位机。两者有着相同的内部寄存器和指令系
15、统,在软件上是完全兼容的。它们的主要区别表现在:(1) 8086 的指令预取队列为 6 个字节,而 8088 只有 4 个字节。(2) 8086 的 AD15AD0 为地址、数据双向分时复用的;而 8088 只有AD7AD0 为地址、数据双向分时复用的,A15 A8 仅用于输出地址信号。在进行 16 位数据操作时,8086 只需一个总线周期就可完成,而 8088 则需要两个总线3周期来完成,因此 8088 的速度较 8086 要慢些。(3) 8086 上的 BHE 信号在 8088 上变为 SSO。(4) 8086的引脚 28 为 M/IO,即 CPU 访问内存时该引脚输出高电平,访问接口时则
16、输出低电平。对于 8088 而言,该引脚的状态正好相反,变为 IO/M。8086/8088 后继机型也包括准 32 位和标准 32 位机,如 80386 的 SX 和 DX 类型。2.8 80x86 微处理器的指令队列的容量和作用是什么?【解】:当 EU 正在执行指令中,且不需占用总线时, BIU 会自动地进行预取指令操作,将所取得的指令按先后次序存入 16 字节的指令队列寄存器,该队列寄存器按“先进先出”的方式工作,并按顺序取到 EU 中执行。其操作遵循下列原则:每当指令队列缓冲器中存满一条指令后,EU 就立即开始执行。每当 BIU 发现队列中空了两个字节时,就会自动地寻找空闲的总线周期进行
17、预取指令操作,直到填满为止。每当 EU 执行一条转移、调用或返回指令后,则要清除指令队列缓冲器,并要求 BIU 从新的地址开始取指令,新取的第一条指令将直接经指令队列缓冲器送到EU 去执行,并在新地址基础上再作预取指令操作,实现程序段的转移。2.9 在 80x86 微机的输入/输出指令中,I/O 端号通常是由 DX 寄存器提供的,但有时也可以在指令中直接指定 00H0FFH 的端口号。试问可直接由指令指定的I/O 端口数是多少?【解】:由于在 80x86 的输入/输出指令中,可以直接在 00H0FFH 指定,所以直接由指令指定的 I/O 端口数是 256。2.10 有两个 16 位字 1EE5
18、H 和 2A3CH 分别存放在 80x86 微机存储器的 000B0H和 000B3H 单元中。请用图表示出它们在存储器里的存放情况。【解】:它们在存储区的存放情况如下:2.11 哪些寄存器可以用来指示存储器地址?【解】:以下寄存器可以用来只是存储区地址:BX(Base)可以作为通用寄存器使用,此外,在计算存储器地址时,它经常用作基址寄存器;SP、BP 、SI、DI 四个16 位寄存器可以像数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用,此外,它们更经常的用途是在存储器寻址时,提供偏移地址,因此,它们可称为指针和变址寄存器;只有代码段(Code Segment,CS)
19、、数据段(Data Segment,DS) 、堆栈段(Stack Segment,SS)和附加段(Extra Segment,ES)4个寄存器,段寄存器也是一种专用寄存器,它们专用于存储器寻址,用来直接或间接地存放段地址。2.12 在实模式下,段地址和偏移地址为 3017:000A 的存储单元的物理地址是什么? 如果段地址和偏移地址是 3015:002A 和 3010:007A,它们的物理地址又是什么呢?【解】:由于物理地址段地址10H 偏移地址段地址和偏移地址为 3017:000A 的存储单元的物理地址:物理地址3017H10H000AH3017AH段地址和偏移地址为 3015:002A 和
20、 3010:007A 的存储单元的物理地址:物理地址3015H10H002AH3017AH物理地址3010H10H007AH3017AH2.13 如果在一个程序开始执行以前(CS)0A7F0H(如十六进制数的最高位为字母,则应在其前加一个 0),(IP)=2B40H,试问该程序的第一个字的物理地址是多少?【解】:由于物理地址段地址10H 偏移地址物理地址0A7F0H10H2B40H0AAA40H2.14 在实模式下,存储器中每一段最多可有 10000H 个字节。如果用调试程序 Debug 的 R 命令在终端上显示出当前各寄存器的内容如下,请画出此时存储器分段的示意图,以及条件标志 OF、SF、
21、ZF、CF 的值。CDEBUG-RAX=0000 BX=0000 CX=0079 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=10E4 ES=10F4 SS=21F0 CS=31FF IP=0100 NV UP DI PL NZ NA PO NC【解】:略2.15 下列操作可使用到哪些寄存器?(1) 加法和减法。(2) 循环计数。(3) 乘法和除法。(4) 保存段地址。1EHE5H000B0H000B1H000B2H000B3H000B4H3CH2AH4(5) 表示运算结果为 0。(6) 将要执行的指令地址。(7) 将要从堆栈取出数据的地址。【解】:(1
22、) 加法和减法。使用的寄存器有:AX、BX、CX、DX、AL。(2) 循环计数。 使用的寄存器有:CL、CX。(3) 乘法和除法。使用的寄存器有: AX、CL、AL、DX。(4) 保存段地址。使用的寄存器有: ES、DI。(5) 表示运算结果为 0。使用的寄存器为通用寄存器。(6) 将要执行的指令地址。使用的寄存器有: CS、SS、SP、IP、BP。(7) 将要从堆栈取出数据的地址。使用的寄存器有: CS、SP、SS。2.16 80x86 微机的存储器中存放信息如图 2.13 所示。试读出 30022H 和30024H 字节单元的内容,以及 30021H 和 30022H 字单元的内容。【解】
23、:30022H 字节单元的内容是:0ABH30024H 字节单元的内容是:0EFH30021H 字单元的内容是:0AB34H 30022H 字单元的内容是:0CDABH习题 33.1 指令分成几部分?每部分的作用是什么?【解】:每条指令由两部分组成:操作码字段和地址码字段。操作码字段:用来说明该指令所要完成的操作。地址码字段:用来描述该指令的操作对象。一般是直接给出操作数,或者给出操作数存放的寄存器编号,或者给出操作数存放的存储单元的地址或有关地址的信息。3.2 指出下列 MOV 指令的源操作数的寻址方式:MOV AX,1234HMOV AX,BXMOV AX,BXMOV AX,TABLE;T
24、ABLE ;TABLE 是一个变量名MOV AX,1234HMOV AX,BX+1234HMOV AX,BPSIMOV AX,BX+SI-1234H【解】:MOV AX,1234H 立即寻址MOV AX,BX 寄存器寻址MOV AX,BX 寄存器间接寻址MOV AX,TABLE ;TABLE 是一个变量名 直接寻址方式MOV AX,1234H 直接寻址方式MOV AX,BX+1234H 寄存器相对寻址MOV AX,BPSI 基址变址寻址MOV AX,BX+SI1234H 相对地址变址寻址3.3 设:(DS)=2000H, (BX)=0100H, (SS)=1000H, (BP)=0010H,T
25、ABLE的物理地址为 2000AH, (SI)=0002H。求下列每条指令源操作数的存储单元地址:MOV AX,1234HMOV AX,BXMOV AX,TABLEBXMOV AX,BPMOV AX,BPSI【解】: 存储单元地址:(DS)10H + EA =2000H10H+1234H=21234H存储单元地址:(DS)10H +(BX)=2000H10H+0100H=20100H存储单元地址:(DS)10H+EA=2000H 10H+0100H+000AH=2010AH存储单元地址:(SS)10H+EA=1000H10H+0010H=10010H储单元地址:(SS)10H+EA=1000H
26、10H+0010H+0002H =10012H3.4 设 ARRAY 是字数组的首地址,写出将第 5 个字元素取出送 AX 寄存器的指令,要求使用以下几种寻址方式: 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址【解】:(1)直接寻址(2)寄存器间接寻址(3)寄存器相对寻址(4)基址变34H12HABH30020H30021H30022H2H30023H30024HHCDHEFH存储器5址寻址MOV AX, ARRAY+8 MOV BX, ARRAY+8 MOV BX, 8 LEA BX, ARRAYMOV AX, BX MOV AX, ARRAYBX MOV SI, 8 MOV AX
27、,BX+SI3.5 设有以下程序段,求执行完此程序后 AX 寄存器中的内容:ABC EQU 2 DATA1 DB 20HDATA2 DW 1000HSTART: MOV AX,DATA1+ABC 【解】:(AX)=0010H3.6 设变量 ARRAY 中连续存放了字变量 NUMBR 的偏移地址和段地址,试写出把变量 NUMBR 装入 AX 寄存器中的指令序列。【解】: ARRAY DW, 1234H, 5678HLEA SI, ARRAY PUSH DSMOV AX, SI+3MOV DS, AXMOV BX, SIMOV AX, BXPOP DS3.7 设当前(CS)=2000H, (IP)
28、=2000H,标号 NEXT 定义在当前代码段偏移地址是 0100H 处, (DS)=1000H, (BX)=1000H, (11000H)=00H, (11001H)=30H,数据段定义的字变量 ARRAY 的内容为 1000H,试写出下列转移指令的目标转移地址 JMP NEAR PTR JMP BX JMP WORD PTR ARRAY【解】: JMP NEAR PTR 此转移指令的目标转移地址为:20100H JMP BX 此转移指令的目标转移地址为:21000H JMP WORD PTR ARRAY 此转移指令的目标转移地址为:23000H3.8 设当前(CS)=2000H, (IP)
29、=2000H,标号 NEXT 定义在 3000H:1000H处。当前(DS)=1000H, (BX)=1000H, (11000H)=00H, (11001H)=03H, (11002H)=00H, (11003H)=30H,数据段定义的字变量 ARRAY 的内容为0300H, (ARRAY+2)=3000H,试写出下列转移指令的目标转移地址: JMP FAR PTR NEXT JMP DWORD ARRAY【解】: JMP FAR PTR NEXT 此转移指令的目标转移地址为:31000H JMP DWORD ARRAY 此转移指令的目标转移地址为:30300H3.9 下列每组指令有何区别?
30、(1) MOV AX,1234H MOV AX,1234H (2) MOV AX,TABLE MOV AX,TABLE(3) MOV AX,TABLE LEA AX,TALBE(4) MOV AX,BX MOV AX,BX【解】:(1) MOV AX,1234H 将立即数 1234H 送到寄存器 AX 中 MOV AX,1234H 将存储区1234H中的内容送到寄存器 AX 中(2) MOV AX,TABLE 将标号 TABLE 的地址送到寄存器 AX 中MOV AX,TABLE 将存储区TABLE 中的内容送到寄存器 AX中(3) MOV AX,TABLE 将标号 TABLE 的地址送到寄存
31、器 AX 中 LEA AX,TALBE 将标号 TABLE 的地址送到寄存器 AX 中(4) MOV AX,BX 寄存器寻址 MOV AX,BX 寄存器间接寻址3.10 MOV CS,AX 指令正确吗?【解】:MOV CS,AX 指令不正确。因为 CS 是指令寄存器,由系统自动改变,不能由指令进行更改。3.11 写一指令序列,将 3456H 装入 DS 寄存器。【解】:MOV AX, 3456HMOV DS, AX3.12 在 8086/8088 微处理器中,PUSH 和 POP 指令在堆栈与寄存器或存储单元之间传送数据时,一次总是传送多少字节?【解】:在 8086/8088 微处理器中,PU
32、SH 和 POP 指令的操作是字操作,所以在堆栈与寄存器或存储单元之间传送数据时,一次总是传送 2 字节。3.14 若正在访问堆栈中 03600H 单元,则 SS 和 SP 的值是多少?【解】:若正在访问堆栈中 03600H 单元,则 SS 和 SP 的值会有好多组合,其中可10H00H20HDATA1DATA26以有 SS 是 0300H,SP 是 0600H。3.15 若(SS)=2000H, (SP)=000AH,先执行将字数据 1234H 和 5678H 压入堆栈的操作,再执行弹出一个字数据的操作,试画出堆栈区及 SP 的内容变化过程示意图(标出存储单元的物理地址) 。【解】:物理地址
33、(SS)10HSP3.16 解释 XLAT 指令是怎样转换 AL 寄存器中的内容的。并编写一段程序用XLAT 指令将 BCD 码 09 转换成对应的 ASCII 码,并将 ASCII 码存入数据 ARRAY 中。【解】:XLAT 指令是将 AL 的内容替换成存储单元中的一个数,往往用于代码转换。使用此指令前,先在数据段建立一个表格,表格首地址存入 BX 寄存器,欲取代码的表内位移量存入 AL 寄存器中。XLAT 指令将(AL)值扩展成 16 位,与(BX)相加形成一个段偏移地址,段地址取(DS),据此读出代码送入 AL 寄存器。程序如下:TABLE DB 30H, 31H, , 39HARRA
34、Y DB 1O DUP(?)MOV CL, 10MOV SI, 0MOV BX, OFFSET TABLEMOV AL, ALAGAIN: XLATMOV SI, ALINC SIINC ALLOOP AGAIN3.17 若(AX)=0001H,(BX)=0FFFFH,执行 ADD AX,BX 之后,标志位ZF、SF、CF 和 OF 各是什么?【解】: (AX)= 0001H = 0000 0000 0000 0001 B+ (BX)=0FFFFH = 1111 1111 1111 1111 B(AX)= 0001H = 1 0000 0000 0000 0000 B 则:ZF=1、SF=0、
35、CF=1、OF=03.18 写一指令序列完成将 AX 寄存器的最低 4 位置 1,最高 3 位清 0,第7、8、9 位取反,其余位不变。【解】: OR AX, 000FH (OR AX, 0000 0000 0000 1111 B)AND AX, 1FFFH (AND AX, 0001 1111 1111 1111 B)XOR AX, 01C0H (XOR AX, 0000 0001 1100 0000 B)3.19 试写出执行下列指令序列后 AX 寄存器的内容。执行 前(AX)=1234H。MOV CL,7SHL BX,CL【解】:(AX) = 1234H = 0001 0010 0011
36、0100 B执行后:(AX) = 0 0011 0100 0000 000 B = 0001 1010 0000 0000 B = 1A00H 习题 44.1 假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么? MOV BP,AL MOV WORD_OPBX+4*3DI,SP MOV WORD_OP1,WORD_OP2 MOV AX,WORD_OP1DX MOV SAVE WORD,DS MOV SP,SS:DATA_WORDBXSI MOV BXSI,2 MOV AX,WORD_OP1+WORD_OP2 MOV AX,WORD_OP1-WORD
37、_OP2+100 MOV WORD_OP1,WORD_OP1-WORD_OP2【解】: MOV BP,AL 两个操作数不匹配 MOV WORD_OPBX+4*3DI,SP MOV WORD_OP1,WORD_OP2 两个内存单元之间不能直接传送数据 MOV AX,WORD_OP1DX MOV SAVE WORD,DS MOV SP,SS:DATA_WORDBXSI 当基址为 BX 时,选取 DS 寄存20007H 56H78HSP2000AH2000AH20009HSP20008H 34H12H 34H12HSP20006H2000AH20009H20008H78H12H56H34H7器 MO
38、V BXSI,2 MOV AX,WORD_OP1+WORD_OP2 MOV AX,WORD_OP1-WORD_OP2+100 MOV WORD_OP1,WORD_OP1-WORD_OP24.2 假设 VAR1 和 VAR2 为字变量,LAB 为标号,试指出下列指令的错误之处: ADD VAR1,VAR2 SUB AL,VAR1 JMP LABSI JNZ VAR1 JMP NEAR LAB【解】: ADD VAR1,VAR2ADD 两个操作数不能同时为存储单元,MOV AX, VAR1ADD AX, VAR2 SUB AL,VAR1两个操作数不匹配SUB AX, VAR1 JMP LABSI
39、LAB 与SI不能相加JMP WORD PTR SI JNZ VAR1JNZ 后面应是标号,不应是变量JNZ LAB JMP NEAR LAB缺少 PTR 运算符JMP NEAR PTR LAB4.3 画图说明下列语句所分配的存储空间及初始化的数据值。 BYTE_VAR DB BYTE ,12,-12H,3 DUP(0,?,2 DUP(1,2),?) WORD_VAR DW 5 DUP(0,1,2),?,-5, ,BY,TE,256H【解】:(1) (2) 4.4 假设程序中的数据定义如下:PARTNO DW ?PNAME DB 16 DUP(?)COUNT DD ?PLENTH EQU $-
40、PARTNO问 PLENTH 的值为多少?它表示什么意义?【解】:PLENTH 的值为 22,它表示数据的个数。4.5 有符号定义语句如下:BUFF DB 1,2,3, 123EBUFF DB 0L EQU EBUFF-BUFF问 L 的值是多少?【解】:PLENTH 的值为 6。4.6 假设程序中的数据定义如下:LNAME DB 30 DUP(?)ADDRESS DB 30 DUP(?)CITY DB 15 DUP(?)02HFFHFBH0202H01H02H01H00H02H01H02H01H00H02H01H02H01H00HF4H0CH45H54H59H41HBYTE_VAR BYTE
41、1212H0121121201212 45H00H56H00H54H00H59H00H41H00H02H00H01H00H00H00H02H00H01H00H00HWORD_VAR 030 个字节120122BYTE5256H8CODE-LIST DB 1,7,8,3,2 用一条 MOV 指令将 LNAME 的偏移地址放入 AX。 用一条指令将 CODE_LIST 的头两个字节的内容放入 SI。 写一条伪操作使 CODE_LENGHT 的值等于 CODE_LIST 域的实际长度。【解】: 用一条 MOV 指令将 LNAME 的偏移地址放入 AX。MOV AX, OFFSET LANME 用一条
42、指令将 CODE_LIST 的头两个字节的内容放入 SI。MOV SI, WORD PTR CODE_LSIT 写一条伪操作使 CODE_LENGHT 的值等于 CODE_LIST 域的实际长度。CODE_LENGHT EQU CITY-CODE_LIST4.7 试写出一个完整的数据段 DATA_SEG,它把整数 5 赋予一个字节,并把整数-1,0,2,5 和 4 放在 10 字数组 DATA_LIST 的头 5 个单元中。然后,写出完整的代码段,其功能为:把 DATA_LIST 中头 5 个数中的最大值和最小值分别存入 MAX和 MIN 单元中。【解】:参考程序如下:DATA_SEG SEG
43、MENTDB1 DB 5DATA_LIST DB -1, 0, 2, 5, 4, 5 DUP(?)COUNT DB 5MAX DB ?MIN DB ?DATA_SEG ENDSCODE_SEG SEGMENTASSUME CS:CODE_SEG, DS:DATA_SEGSTART PROC FARPUSH DS MOV AX, 0PUSH AXMOV AX, DATA_SEGMOV DS, AXLEA BX, DATA_LISTMOV CX, COUNT-1MOV AL, BXMOV AH, BX+1LOOP1: INC BXCMP AH, ALJAE LOOP1XCHG AH, ALLOOP
44、2 INC BXCMP AH, BXJAE LISXCHG AH, BXJMP LOP2LIS: CMP AL , BXJBE LOP2XCHG AL, BXLOOP2MOV MAX, AHMOV MIN, ALRETSTART ENDPCODE_SEG ENDSEND START4.10 给出等值语句如下:ALPHA EQU 100BETA EQU 25GAMMA EQU 2下列表达式的值是多少? ALPHA*100+BETA ALPHA MOD GAMMA+BETA (ALPHA+2)*BETA-2 (BETA/3) MOD 5 (ALPHA+3)*(BETA MOD GAMMA) ALP
45、HA GE GAMMA BETA AND 7 GAMMA OR 3【解】: ALPHA*100+BETA1001002510025 ALPHA MOD GAMMA+BETA100/(252)19 (ALPHA+2)*BETA-2(100+2)*252548 9 (BETA/3) MOD 5(25/3) MOD 53 (ALPHA+3)*(BETA MOD GAMMA) (100+3)*(25 MOD 2)103 ALPHA GE GAMMA100 GZ GAMMA0FFFFH BETA AND 725 AND 71 GAMMA OR 32 OR 334.9 对于下面的数据定义,三条 MOV 指
46、令分别汇编成什么?(可用立即数方式表示)TABLEA DW 10 DUP(?)TABLEB DB 10 DUP(?)TABLEC DB 1234MOV AX,LENGTH TABLEAMOV BL,LENGTH TABLEBMOV CL,LENGTH TABLEC【解】: MOV AX,LENGTH TABLEA MOV AX, OOOAHMOV BL,LENGTH TABLEB MOV BL, 0AHMOV CL,LENGTH TABLEC MOV CL, O1H4.10 对于下面的数据定义,各条 MOV 指令单独执行后,有关寄存器的内容是什么?FLDB DB ?TABLEA DW 20 D
47、UP(?)TABLEB DB ABCD MOV AX,TYPE FLDB MOV AX,TYPE TABLEA MOV CX,LENGTH TABLEA MOV DX,SIZE TABLEA MOV CX,LENGTH TABLEB【解】:(1) MOV AX,TYPE FLDB (AX)= 1(2) MOV AX,TYPE TABLEA (AX)= 2(3) MOV CX,LENGTH TABLEA (CX)= 20(4) MOV DX,SIZE TABLEA (DX)= 40(5) MOV CX,LENGTH TABLEB (CX)= 1习题 55.1 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序用大写字母显示这三个字符。【解】:MAIN PROC FARstart:push dssub ax,axpush axinput:mov ah,7Hint 21Hcmpe:cmp al,20HJE exitcmp al,61HJL inputcmp al,7AHJG inputprint:sub al,01Hmov dl,almov ah,02Hint 21Ha