2012~2013年,汇编语言,试卷与答案
一、单项选择题(本大题共10小题,每小题3分,共30分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。
1.CPU要访问的某一存储单元的实际地址称(C)
A. 段地址 B. 偏移地址 C. 物理地址 D. 逻辑地址
2.某存储单元的物理地址是12345H,可以作为它的段地址有(D)
A. 2345H B. 12345H C. 12340H D. 1234H
3.执行后使BX=0的同时也使CF=0,OF=0的指令是(A)
A. XOR BX,BX B. OR BX,BX C. AND BX,BX D. CMP BX,BX
4.循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是(B)
A. CX≠0且ZF=1 B. CX≠0且ZF=0 C. CX≠0或ZF=1 D. CX≠0或ZF=0
5.在执行DAA指令,当高四位BCD码校正时产生进位,如要把此进位值送入AH中,对这进位值的操作应是(C)
A. DAA校正指令的功能已自动加在AH中
B. 进位值在AF中,校正后根据AF内容再加在AH中
C. 进位值在CF中,校正后根据CF内容再加在AH中
D. 进位值在AL最高位上,校正后根据AL最高位内容再加在AH中 6. AND,OR,XOR,NOT为四条逻辑运算指令,下面的解释正确的是(C)
A. 指令XOR AX,AX执行后,AX内容不变,但设置了标志位
B. 指令OR DX,1000H执行后,将DX最高位置1,其余各位置0
C. 指令AND AX,OFH执行后,分离出AL低四位
D. NOT AX,执行后,将AX清0
2012~2013年,汇编语言,试卷与答案
7. 在执行下列指令时,需要使用段寄存器DS的指令是(D) A. STOSW B. ADD AL,CL C. NEG BX D. INC DA[BX]
8. 无论BH中原有的数是奇数或偶数,若要使BH中的数一定为奇数,应执行的指令是(B)
A. ADD BH,01H B. OR BH,01H C. XOR BH,01H D. TEST BH,01H 9. 比较两个带符号的数A、B,当A=B时程序转移,测试的条件为(A)
A. ZF=1 B. ZF=0 C. SF=1 D. SF=0
10.下面各传送指令中,正确的是(C)
A. MOV [DI],[SI] B. MOV[DX+DI],AL
C. MOV WORD PTR [BX],0100H D. MOV AL,BX 11. 汇编语言语句格式中对名字项的规定如下,请找出其中错误的说法(B)
A. 名字的第一个字符可以是大写英文字母及小写英文字母
B. 名字的第一个字符可以是字母、数字及、@、_
C. 名字的有效长度≤31个字符
D. 在名字中不允许出现$
12. 要实现使BETA的值为56,应采用语句为( C )
A .BETA DB 56 B. BETA DB 56H C. BETA EQU 56 D. BETA EQU 56H
13. REPZ CMPSW指令,重复执行的终止条件是( A )
A. CX=0或ZF=0 B. CX=0且ZF=0
C. CX=0或ZF=1 D. CX=0且ZF=1
2012~2013年,汇编语言,试卷与答案
14. 下面程序段执行后,AL中的内容是( B )
MOV AX,8833H
ADD AL,AH
DAA
A. 21 B .21H C. 0C1H D. 0DDH
15. 比较两个带符号的数A、B,当A=B时程序转移,测试的条件为(A)
A. ZF=1 B. ZF=0 C. SF=1 D. SF=0
16. 检查二个无符号数的关系,若要实现AL≥BL时分支去LOP1处,那么在“CMP AL,BL”指令后应跟的分支指令是( C )
A. JNC LOP1 B. JA LOP1 C. JC LOP1 D. JGE LOP1 17. 在下列串操作指令中,同时使用源串和目的串地址指针的指令是( D )
A. STOSW B. LODSW C. SCASW D. CMPSW
18. 设AL=0AH,下列指令执行后能使AL=05H的是( C )
A. NOT AL B. AND AL,0FH C. XOR AL,0FH D. OR AL,0FH 19. DA1 DW AB , CD , EF , GH ( D )
┇
MOV AX,DA1+3
指令执行后AX中的内容是
A. EF B. CD C. BC D. FC
20. 使用DOS系统功能调用时,使用的软中断指令是(B)
A. INT 21 B. INT 10H C. NT 16H D. INT 21H
2012~2013年,汇编语言,试卷与答案
二、简答题(每题10分,共30分)
1.简述循环程序常用的控制方法。
解: 技术控制:适用于循环次数已知,包括正计数与倒计数两种。采用循环指令LOOP和JCXZ实现,将最大循环次数置入CX,最后用LOOP对CX减1并判断是否为0。 条件控制:用于循环次数未知。需要用转移指令判断循环条件,转移指令可以指定目的标号来改变程序运行顺序目的标号指向一个重复执行的语句开始或结束,就构成了循环控制结构,循环体为标号语句至转移指令。 混合控制:包括开关控制和逻辑尺控制,前者适用于循环内部有一定规律分支,循环前预置开关走向,结束前设置下一个开关方向。逻辑尺控制适用于内部分支不规律,用位来控制每次循环的操作。
计数控制:循环次数已知,每循环一次+、-1:;常用LOOP指令实现 条件控制:循环次数未知,须根据条件控制循环;用条件转移指令实现 状态控制:根据事先设置或实时检测的状态来控制循环
2.比较参数传递的三种方法,并分析递归调用时为什么不能采用约定存储单元法来传递数据?
寄存器:将入口参数和出口参数放在与约定的寄存器,数据传递速度快,编程方便,节约内存单元,但是寄存器数量有限,适用较少的子程序 约定存储单元:不占用寄存器、参数个数任意,数据都有独立的存储单元,但定义变量有难度。 堆栈:不占用寄存器和存储单元,参数放在公共堆栈区,处理后恢复,注意参数的位置断点保存和恢复。 参数传递的方法主要有约定寄存器法、约定存储器法与堆栈法三种。
1.约定寄存器法
约定寄存器法直接利用CPU内部寄存器传送参数。在转向子程序之前,主程序将入口参数送入指定寄存器中;调用子程序后,子程序从指定寄存器引用这些参数。经加工处理的结果也放入指定的寄存器中,这样从子程序返回主程序后可以从指定的寄存器中获得处理结果。这种方法最简单,但由于寄存器资源有限,故仅适用传递参数较少的情况。
2.约定存储器法
约定存储器法是在存储器中专门指定一些单元存放入口参数和出口参数。在转子程序之 前,主程序用数据传送指令将入口参数存入入口参数的存储单元中。调用子程序后,子程序按照约定从入口参数存储单元中取出这些参数进行处理。子程序完成处理,将处理结果送入指定的出口参数存储单元中,返回后主程序可从这些特定存储单元中获取需要的处理结果。 约定存储器法传送速度比约定寄存器法要慢些,适合于传递参数较多的情况。
3.堆栈法
堆栈法使用堆栈来完成数据传递。在调用子程序之前将参数压入堆栈,转入子程序后通过 sP指针获得压入堆栈的参数地址,从而将其取出。子程序的处理结果亦送入堆栈保存。返回主程序后再通过出栈指令取出结果。使用该方法时应明了堆栈的变化情况,特别注意参
2012~2013年,汇编语言,试卷与答案
数入栈与出栈顺序。
堆栈法适合于参数较多且子程序有嵌套、递归调用的场合。
3.简述外部中断和软件中断的中断过程。
中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。外部中断:当中断源向CPU发出中断请求,CPU接受请求在一定条件下暂停执行原程序进行中断处理,执行完中断服务程序后再返回断点继续执行原程序。软件中断:是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态的子例程,它常被用作实现系统调用.
4.简述循环程序结构的一般组成。
初始化部分:在循环程序的开头,先执行。设置地址指针的初值、计数器的初值及程序中用到的某些寄存器和某些内存单元的初值,只执行一遍。 工作部分:从初始化部分设置的初值开始,动态地反复执行相同的操作,实现循环程序的功能。修改部分:对参加运算的数据或地址指针和记过单元地址指针修改 控制部分:按预定循环次数的执行和正常退出循环。
5.简述多分支程序实现的一般步骤与常用处理方法。
使用条件转移JCC指令和无条件专题JMP指令实现分支程序结构。获得条件变量-->对应转换为地址表入口偏移-->BX=BX+入口偏移JMP[BX]跳转到相应位置。常用地址表的方法。无法使用地址表,只能通过多条条件转移指令实现。
6.简述完整子程序结构所包含的内容。
子程序也是一段程序,由文字说明和子程序本身构成。一般由子程序名、子程序的功能。子程序选用的寄存器名和存储单元分配、子程序入口参数、子程序出口参数。
2012~2013年,汇编语言,试卷与答案
三.编写程序,计算两个64位数的和,不考虑和的进位。(20分) 由于64位数占用的寄存器比较多,故适合于用约定存储单元法来进行处理。
程序中将64位加数mMl和M.M2存放在两个双字单元内。由于不考虑和的进位,所以 和也可用两个双字单元来存放。
程序如下:
DATA SEGMENT
NUMl DD 1234H,12345678H:M7Ml为123456781234H
MM2 DD 432lH,8765432lH:NIM2为87654321432lH
SUM DD?,?
DATA ENDS
STACK SEGMENT PARA STACK STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DArA
MAIN PAR:主程序
BEGIN:PUSH DS
MOV AX,0
PUSH AX
MOV AX,D』uA
MOV DS,AX
MOV ES,AX
CALL ADD64;调用子程序ADD64
RET
MAIN ENDP
:子程序名称:ADD64
;子程序功能:两个64位数的相加
;输入参数:MUMl一被加数的地址
; NUM2一加数地址
:输出参数:SUM一和数地址
ADD64 PROC
PUSHF
PUSH AX:保护现场
PUSH BX
PUSH CX
LEA BX,Mmll:Bx指向被加数单元
MOV CX,4
2012~2013年,汇编语言,试卷与答案
CLC
AGAIN: MOV Ax,[Bx】;取被加数的相应字一Ax
ADc Ax,[Bx+8】;与加数相应字相加
MOV 【Bx+lOH】,Ax;保存和
INC BX
INC BX
LOOP AGAIN
POP Cx:恢复现场
POP BX
POP AX
POPF
RET
ADD64 ENDP
CODE ENDS
END BEGIN
四.编写程序,将一个十六位二进制数转换为ASCLL码,并以十进制数形式在屏幕上输出。(20分)
DATA SEGMENT
BINARY DW 0110110000001100B
BUF DW 9 DUP
DATA ENDS
STACKI SEGMENT PARA STACK STACK
DB 100H DUP
STACK ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START PROC FAR;
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV CX, BINARY ;CX
CAALL CONV ;
CALL DISPLAY ;
RET
START ENDP
;子程序名称: CONV
;子程序功能: 将CX中十六位二进制数转换为十进制数
2012~2013年,汇编语言,试卷与答案
;入口参数: CX
;调用子程序: CHANGE
CONV PROC NEAR
PUSH AX
PUSH BX
PUSH DX
PUSH SI
LEA BX, BUF
MOV AL , 0AH
MOV [BX] , AL ;
INC BX
MOV AL , CH;
OR AL , AL
JNS PLUS ;
NEG CX ;
MOV AL ; -
MOV [BX] , AL ;
JMP GOON
PLUS: MOV AL , +
MOV [BX] , AL ;
GOON: INC BX
MOV SI , 10000 ;
CALL CHANGE
MOV SI , 1000 ;
CALL CHANGE
MOV SI , 100;
CALL CHANGE
MOV SI, 10;
CALL CHANGE
MOV AL , CL ;
ADD AL , 30H
MOV [BX] , AL
INC BX
MOV AL , $ ;
MOV [BX] , AL
POP SI
POP DX
POP BX
POP AX
2012~2013年,汇编语言,试卷与答案
RET
CONV ENDP
;子程序名称; CHANGE
;子程序功能; 统计CX中所包含权(在SI中)的个数
; 并把个数转换为ASCH码 ,存入缓冲区中
;入口参数: CX
;调用子程序: CHANGE
CONV PROC NEAR
PUSH AX;
PUSH BX
PUSH DX
PUSH SI
LEA BX , BUF
MOV AL , 0DH
MOV [BX], AL;
INC BX
MOV AL, CH;
OR AL, AL
JNS PLUS;
NEG CX;
MOV AL, -
MOV [BX], AL;
JMP GOON
PLUS: MOV AL, +
MOV [BX], AL;
CHANGE ENDP
;子程序名称:DISPLAY
;子程序功能: 输出以$结尾的一个字符串
;调用子程序: 系统09号功能
DISPLAY PROC NEAR
PUSH AX
MOV DX,OFFSET BUF
MOV AH,9
INT 21H
POP AX
RET
DISPLAY ENDP
CODE ENDS
END START
2012~2013年,汇编语言,试卷与答案
五.编写程序,将输入的大写字母转换为小写字母。(20分) DATAS SEGMENT
a db "input",0dh,0ah,"$"
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
mov ax,DATAS
mov ds,ax
mov dx,offset a ;定义数据段
mov ah,9h
int 21h ;输出“input”,并且让下一位所要显示的显示在下一行
mov ah,1
int 21h ;输入
mov dl,al ;转存输入
sub dl,20h
mov ah,2
int 21h ;输出此时的DL中的数值(为ASCII码)
mov ax,4c00h
int 21h
CODES ENDS
END START
六.对两个整数变量A和B,编写程序完成下列功能:
1、若两个数中有一个是奇数,则将奇数送入A单元中,偶数送入B单元中。
2、若两个数均为奇数,则两个数分别加1,并存入原变量中。
3、若两个数均为偶数,则两变量不变。(20分)
dseg segment
a b dw ? dw ?
dseg ends
2012~2013年,汇编语言,试卷与答案
cseg segment mainproc far
assume cs:cseg,ds:dseg start:push ds
sub ax,ax push ax
mov ax,dseg mov ds,ax begin: mov ax,a mov bx,b xor ax,bx test ax,0001 jz class test bx,0001 jz exit xchg bx,a mov b,bx jmp exit class: test bx,0001 jz exit inc b inc a exit: ret
mainendp
cseg ends
end start