第4章 汇编语言程序设计
一、选择题
1用高级语言编写的程序( )。[华中科技大学研]
A.只能在基本计算机上运行
B.无须经过编译或解释,即可被计算机直接执行
C.具有通用性和可移植性
D.几乎不占用内存空间
【答案】C
【解析】高级语言编写的程序的特点就是具有通用性和可移植性,但是程序本身也是要经过编译或解释的,并且一定会占用一定的内存空间。
28086/8088汇编语言中的逻辑运算符的功能是( )完成的。[四川大学研]
A.在汇编时由汇编语言
B.由CPU
C.“在汇编时由汇编语言”和“由CPU”
D.根据程序决定是“在汇编时由汇编语言”还是“由CPU”
【答案】A
【解析】8086/8088汇编语言的表达式由运算对象及运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数去使用,因此逻辑运算符的功能是在汇编中完成的,而逻辑指令是在程序执行时完成逻辑操作的。
3当字符$独立出现在表达式中时,它的值为程序下一个所能分配的存储单元的偏移地址,分析下面的程序
则变量C的值为( )。[四川大学研]
A.00H
B.01H
C.02H
D.03H
【答案】D
【解析】A1的偏移地址为0000H,$是当前位置计数器的当前值,$=03H,C变量的表达式为$-A1=03H。分配示意图如图4-1所示。
图4-1 分配示意图
二、填空题
18086的汇编语言程序是由______语句和______语句组成。[北京航空航天大学研]
【答案】指令性;伪指令
【解析】汇编语言可使用的语句分为两类,它们是指令性语句和伪指令语句。
2设ARRAY DW 64H DUP[100H],那么LENGTH ARRAY的值是______;TYPE ARRAY的值是______;SIZE ARRAY的值是______。[哈尔滨工业大学研]
【答案】64H;2;0C8H
【解析】①LENGTH运算符返回的值是指数组变量的元素个数。如果变量是用重复数据操作符DUP说明的,则返回外层DUP给定的值,因此LENGTH ARRAY的值是64H。
②TYPE运算符的运算结果是返回反映变量一个数值。ARRAY变量是字变量DW,因此TYPE ARRAY的值为2。
③SIZE运算符的运算结果是返回数组变量所占的总字节数,也就是等于LENGTH和TYPE两个运算符返同值的乘积。
因此SIZE ARRAY的值为2×64H=0C8H。
3已知数据段中有如下语句:
则指令MOV BUF,S1 GT S2汇编后的语句为______。[武汉大学研]
【答案】MOV WORD PTR[1000H],0
【解析】BUF变量的偏移地址为1000H,S1=5,S2=-2,5大于-2成立,BUF被定义为字变量,因此源操作数为0FFFFH。
4已知
执行指令MOV AX,WORD PTR M3后,AX=______。
执行指令MOV BX,LENGTH M1 EQ M3后,BX=______。
执行指令MOV CX,M4后,CX=______。[中山大学研]
【答案】3232H;0;0064H
【解析】因ORG为0,说明该段的变量M1的偏移地址从0开始,M2使用返回定义伪指令EQU,因此不申请分配内存。变量在存储单元的分配图如图4-2所示。
图4-2 变量在存储单元的分配图
①MOV AX,WORD PTR M3
PTR将它左边的字类型指定给右边的地址表达式M3,这个新的地址操作数具有和M3有一样的段基址和偏移地址,它们指向同一存储单元,但类型不同。执行指令后,AX=3232H。
②MOV BX,LENGTH M1 EQ M3
LENGTH M1返回的值是指数组变量的运算个数,返回值是50,即32H。M1变量的偏移地址为0,因此M2=0。LENGTH M1 EQ M3关系不成立,因此运算结果为0。执行指令后,BX=0。
③MOV CX,M4
M4的值是M3的偏移地址0064H,执行指令后,CX=0064H。
5若定义DAT DW‘1234’,则(DAT+1)和(DAT+2)两个相连的内存中存放的数据是______。[华东理工大学研]
【答案】31H,34H或32H,33H
【解析】伪指令DW定义字变量,每个变量占两个字节的存储单元,且遵循“数据的低位部分在低位,高位部分在高地址”的存放规则。本题是将指定操作数的ASCII码存入以DAT开始的存储单元中。
6在BUF开始有一个字节型数组,共有100个元素,以下程序段用于计算这个数组中非零元素的个数,并将结果存入内存COUNT单元,在所给程序段的划线处填入适当指令或指令的一部分,使其完成指定功能。[北京大学研]
【答案】①BUF;②100;③COUNT;④CON
【解析】程序的目的是为完成计数功能。
7在内存BUF为首地址的数据区中,有50个字节的无符号数。用8086指令编写程序找出数据块中的最大者,并把它送至MAX单元中。所编的程序中有4处空白,请填上适当的语句,并对3处错误进行改正。[北京邮电大学研]
源程序如下:
【答案】①$ - BUF;②OFFSET BUF;③LOP2;④AL
【解析】因为题中要求有50个字节的无符号数,所以在行号5中定义的应该是字节变量,将DW改为DB;行号11应将CL改为CX,因为在后续的指令中使用了LOOP指令,每执行依次LOOP指令先将CX的内容减1后再判断是否为0;行号15中的JG应改为JA,因为题中要求的是无符号数,无符号数的判断大于的指令应该为JA指令,而JG是有符号数的判断。
8以下程序实现的功能是冒泡排序算法,对起始地址为VAR的字型数组进行排序,请根据要求在所给程序段的画线处填空。[北京理工大学研]
程序执行结束后,起始地址为VAR字型数组中数据元素大小的排列顺序为:______。
【答案】①100;②DESG;③TYPE VAR;④AH;⑤由小到大
【解析】首先用冒泡法排序,相邻两单元的数依次两两比较,若上面的数大则不交换;若下面的数大,则两数交换位置。第一轮共进行n-1次比较,最小的数排到最后面。第二轮在前n-1个数中比较交换,共进行n-2次比较,次小的数排到了倒数第二位。如此进行,经过n-1轮比较,就排好了次序。
三、判断题
1如果在定义汇编语青程序段时末声明其定位类型,则该段在内存中的起始存放地址为×××00H(×表示任意十六进制数)。( )[北京航空航天大学研]
【答案】错误
【解析】汇编语言程序段的定位方式有4种,如下:
①PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低8位必须是0。
②PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低4位必须是0。
③WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低1位必须是0。
④BYTE:表示本段起始地址可以从任一地址处开始存放。
若定位类型为默认,则默认值为PARA,即段起始地址最低4位必须是0。
2在汇编语言源程序通常有几个段组成,有的源程序可以没有数据段,没有堆栈段,但不能没有代码段。( )[重庆大学研]
【答案】正确
【解析】一个汇编语言源程序由3个程序段组成,即代码段、数据段和堆栈段,它们均以伪指令SEGMENT开始定义某段,又以伪指令ENDS结束该段,有的源程序不需要数据段或堆栈段,若不需要则可省略,代码段中写入的是程序的代码,是程序主要的段,是不能没有的。
四、解答题
1已知一段数据段中的数据:
段的起始地址为02000H,请画出该数据段数据存储的形式。[重庆大学研]
答:EQU伪指令不分配存储器空间。
地址表达式只适用于DW和DD两条伪指令,如果该地址表达式为变量名,DW取其偏移地址来初始化变量;DD取指逻辑地址来初始化。因此,A的值就是M变量的偏移地址000CH,D的值是BUF变量的逻辑地址0200H:0002H,高字部分存放是段基址0200H,低字部分存放是偏移地址0002H。
内存分配示意图如图4-3所示。
图4-3 内存分配示意图
2请问下列伪指令在存储器中分别为各变量分配多少字节?[天津工业大学研]
答:VR1变量是字变量,只有一个值,占两个字节空间。
VR1变量是字变量,有6个值,占6×2=12个字节空间。
VR3变量是双字变量,有10个值,占10×4=40个字节空间。
VR4变量是字节变量,有(8+1)×2=18个字节,占18个字节空间。
VR5变量定义了一个字符串,共有15字节变量,占15个字节空间。
3对于给定的数据定义。变量R1的值是多少?它表示什么意义?[哈尔滨工业大学研]
答:变量在存储单元的分配如图4-4所示,当前位置计数器值为0016H,K1的偏移地址为0000H,因此R1的值为0016H,它表示这些变量共有16H个字节单元。
图4-4 变量在存储单元的分配
五、编程题
1用查表的方法将AL寄存器中的一压缩BCD码转换成它相应的ASCII码,并存放到存储单元RESULT中。[四川大学研]
答:既然结果存放在存储单元中,那么要在数据段中预留2个字节的存储单元存放结果。指定用查表的方法,首先要建立一个表ASCIITAB。源程序编制如下。
2阅读下面的程序,指明在该程序执行完后,M1、M2、M3中存放的是什么?[中山大学研]
答:这是一个循环分支程序。JG、JGE可以判断TABLE存放的是有符号数。在程序中,TABLE表中的数据依次和0比较,如果JGE(表示大于等于0)则转向G2,G2再判断是否大于0,大于则转向G3,G3标号处的指令功能是将M3变量加1。依次可知这是统计从TABLE存放的10个字节的有符号数的正数、负数和0的个数。M1存放的是0的个数,M2存放的是负数的个数,M3存放的是正数的个数。
3以下程序实现将多位压缩BCD码乘以8的运算。分析其中有否错误,将错误改正后写出完整的程序。(在改正前后的程序中,有改动的地方请加上下画线。)[北京航天航空大学研]
答:程序中使用了串操作指令STOSB,该指令的功能是将AL中的内容存放在ES:DI所指向的存储单元中,程序中使用了ES,因此要给ES装载初值。DI和SI存放的是指针,不是数值,因此要将BCDBUF和RESULT的偏移地址传送到SI和DI中。程序中是压缩BCD码的运算,要对其结构进行调整使用的指令应该是DAA。BCDBUF和RESULT定义的是字节数据,指令ADD AX,[DI]会有程序类型不明确的错误。正确的源程序如下。
4从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。[四川大学研]
答:从键盘输入字符串,使用的是0AH号系统功能调用,要求事先定义应该输入缓冲区,DX中存放的是它的起始地址,第一个字节给定该缓冲区中能存放的字节个数,第二字节留给系统填写实际键入的字符个数,从第三个字节开始用来存放键入的字符串,最后键入回车键来表示字符串的结束。
输出字符串使用的9号系统功能,其功能是将指定的内存缓冲区的字符串从屏幕显示输出,缓冲区的字符串以‘$’字符作为结束标志,内存缓冲区的首地址还是存放在DX寄存器中。
建立两个指针指向输入的字符串,应该指向串首地址,另一个指向串尾地址。将两个指针指向的字符交换,字符交换的操作要进行到字符串首指针的值大于等于字符串尾指针的值为止,即可将字符串的次序颠倒。编写的源程序如下。
5试设计3个子程序,当从键盘输入1、2、3时,在屏幕上对应显示字母A、B、C。[厦门大学研]
答:程序要设计3个子程序,调用哪个子程序是根据输入的1~3中的任意值,因键入的值是随机的,故CALL。指令后不能确定调用子程序的地址。这里用了间接的方法,将3个子程序的地址放入表中,每个地址占两个字节(因主程序、子程序同段,故仅是偏移地址)。程序将键入值作为表格地址偏移量,并用变址(SI)寻址方式正确转移到对应的子程序中。
6在内存AGE开始的单元中存放15个人的年龄,编程取出其中最大的年龄,送入OLD单元中。[西北工业大学研]
答:先将第一个年龄放入寄存器AL中,下面与其比较,如果比AL中的大,则将其放入AL中,循环下去,最后AL中的即为最大的年龄。
完整程序如下。