汇编语言程序设计期末考试题Word格式.docx
《汇编语言程序设计期末考试题Word格式.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计期末考试题Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
13.REPZCMPSW指令,重复执行的终止条件是(A)
A.CX=0或ZF=0 B.CX=0且ZF=0
C.CX=0或ZF=1 D.CX=0且ZF=1
14.下面程序段执行后,AL中的内容是( B)
MOVAX,8833H
ADDAL,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处,那么在“CMPAL,BL”指令后应跟的分支指令是(C)
A.JNCLOP1 B.JALOP1C.JCLOP1 D.JGELOP1
17.在下列串操作指令中,同时使用源串和目的串地址指针的指令是(D)
A.STOSW B.LODSW C.SCASW D.CMPSW
18.设AL=0AH,下列指令执行后能使AL=05H的是(C)
A.NOTALB.ANDAL,0FH C.XORAL,0FH D.ORAL,0FH
19.DA1DW‘AB’,‘CD’,‘EF’,‘GH’(D)
┇
MOVAX,DA1+3
指令执行后AX中的内容是
A.‘EF’ B.‘CD’ C.‘BC’ D.‘FC’
20.使用DOS系统功能调用时,使用的软中断指令是(B)
A.INT21 B.INT10H C.NT16H D.INT21H
二、简答题(每题10分,共30分)
1.简述循环程序常用的控制方法。
解:
技术控制:
适用于循环次数已知,包括正计数与倒计数两种。
采用循环指令LOOP和JCXZ实现,将最大循环次数置入CX,最后用LOOP对CX减1并判断是否为0。
条件控制:
用于循环次数未知。
需要用转移指令判断循环条件,转移指令可以指定目的标号来改变程序运行顺序目的标号指向一个重复执行的语句开始或结束,就构成了循环控制结构,循环体为标号语句至转移指令。
混合控制:
包括开关控制和逻辑尺控制,前者适用于循环内部有一定规律分支,循环前预置开关走向,结束前设置下一个开关方向。
逻辑尺控制适用于内部分支不规律,用位来控制每次循环的操作。
计数控制:
循环次数已知,每循环一次+、-1:
;
常用LOOP指令实现
条件控制:
循环次数未知,须根据条件控制循环;
用条件转移指令实现
状态控制:
根据事先设置或实时检测的状态来控制循环
2.比较参数传递的三种方法,并分析递归调用时为什么不能采用约定存储单元法来传递数据?
寄存器:
将入口参数和出口参数放在与约定的寄存器,数据传递速度快,编程方便,节约内存单元,但是寄存器数量有限,适用较少的子程序约定存储单元:
不占用寄存器、参数个数任意,数据都有独立的存储单元,但定义变量有难度。
堆栈:
不占用寄存器和存储单元,参数放在公共堆栈区,处理后恢复,注意参数的位置断点保存和恢复。
参数传递的方法主要有约定寄存器法、约定存储器法与堆栈法三种。
1.约定寄存器法
约定寄存器法直接利用CPU内部寄存器传送参数。
在转向子程序之前,主程序将入口参数送入指定寄存器中;
调用子程序后,子程序从指定寄存器引用这些参数。
经加工处理的结果也放入指定的寄存器中,这样从子程序返回主程序后可以从指定的寄存器中获得处理结果。
这种方法最简单,但由于寄存器资源有限,故仅适用传递参数较少的情况。
2.约定存储器法
约定存储器法是在存储器中专门指定一些单元存放入口参数和出口参数。
在转子程序之
前,主程序用数据传送指令将入口参数存入入口参数的存储单元中。
调用子程序后,子程序按照约定从入口参数存储单元中取出这些参数进行处理。
子程序完成处理,将处理结果送入指定的出口参数存储单元中,返回后主程序可从这些特定存储单元中获取需要的处理结果。
约定存储器法传送速度比约定寄存器法要慢些,适合于传递参数较多的情况。
3.堆栈法
堆栈法使用堆栈来完成数据传递。
在调用子程序之前将参数压入堆栈,转入子程序后通过
sP指针获得压入堆栈的参数地址,从而将其取出。
子程序的处理结果亦送入堆栈保存。
返回主程序后再通过出栈指令取出结果。
使用该方法时应明了堆栈的变化情况,特别注意参数入栈与出栈顺序。
堆栈法适合于参数较多且子程序有嵌套、递归调用的场合。
3.简述外部中断和软件中断的中断过程。
中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。
外部中断:
当中断源向CPU发出中断请求,CPU接受请求在一定条件下暂停执行原程序进行中断处理,执行完中断服务程序后再返回断点继续执行原程序。
软件中断:
是一条CPU指令,用以自陷一个中断。
由于软中断指令通常要运行一个切换CPU至内核态的子例程,它常被用作实现系统调用.
4.简述循环程序结构的一般组成。
初始化部分:
在循环程序的开头,先执行。
设置地址指针的初值、计数器的初值及程序中用到的某些寄存器和某些内存单元的初值,只执行一遍。
工作部分:
从初始化部分设置的初值开始,动态地反复执行相同的操作,实现循环程序的功能。
修改部分:
对参加运算的数据或地址指针和记过单元地址指针修改控制部分:
按预定循环次数的执行和正常退出循环。
5.简述多分支程序实现的一般步骤与常用处理方法。
使用条件转移JCC指令和无条件专题JMP指令实现分支程序结构。
获得条件变量-->
对应转换为地址表入口偏移-->
BX=BX+入口偏移JMP[BX]跳转到相应位置。
常用地址表的方法。
无法使用地址表,只能通过多条条件转移指令实现。
6.简述完整子程序结构所包含的内容。
子程序也是一段程序,由文字说明和子程序本身构成。
一般由子程序名、子程序的功能。
子程序选用的寄存器名和存储单元分配、子程序入口参数、子程序出口参数。
三.编写程序,计算两个64位数的和,不考虑和的进位。
(20分)
由于64位数占用的寄存器比较多,故适合于用约定存储单元法来进行处理。
程序中将64位加数mMl和M.M2存放在两个双字单元内。
由于不考虑和的进位,所以
和也可用两个双字单元来存放。
程序如下:
DATASEGMENT
NUMlDD1234H,12345678H:
M7Ml为123456781234H
MM2DD432lH,8765432lH:
NIM2为87654321432lH
SUMDD?
,?
DATAENDS
STACKSEGMENTPARASTACK’STACK’
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK,DS:
DATA,ES:
DArA
MAINPAR:
主程序
BEGIN:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,D』uA
MOVDS,AX
MOVES,AX
CALLADD64;
调用子程序ADD64
RET
MAINENDP
:
子程序名称:
ADD64
子程序功能:
两个64位数的相加
输入参数:
MUMl一被加数的地址
NUM2一加数地址
输出参数:
SUM一和数地址
ADD64PROC
PUSHF
PUSHAX:
保护现场
PUSHBX
PUSHCX
LEABX,Mmll:
Bx指向被加数单元
MOVCX,4
CLC
AGAIN:
MOVAx,[Bx】;
取被加数的相应字一Ax
ADcAx,[Bx+8】;
与加数相应字相加
MOV【Bx+lOH】,Ax;
保存和
INCBX
LOOPAGAIN
POPCx:
恢复现场
POPBX
POPAX
POPF
ADD64ENDP
CODEENDS
ENDBEGIN
四.编写程序,将一个十六位二进制数转换为ASCLL码,并以十进制数形式在屏幕上输出。
DATASEGMENT
BINARYDW0110110000001100B
BUFDW9DUP
DATAENDS
STACKISEGMENTPARASTACK‘STACK’
DB100HDUP
ASSUMECS:
CODE,DS:
DATA
STARTPROCFAR;
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,BINARY;
CX
CAALLCONV;
CALLDISPLAY;
RET
STARTENDP
;
CONV
将CX中十六位二进制数转换为十进制数
入口参数:
CX
调用子程序:
CHANGE
CONVPROCNEAR
PUSHBX
PUSHDX
PUSHSI
LEABX,BUF
MOVAL,0AH
MOV[BX],AL;
INCBX
MOVAL,CH;
ORAL,AL
JNSPLUS;
NEGCX;
MOVAL;
’-’
JMPGOON
PLUS:
MOVAL,‘+’
GOON:
MOVSI,10000;
CALLCHANGE
MOVSI,1000;
MOVSI,100;
CALLCHANGE
MOVSI,10;
MOVAL,CL;
ADDAL,30H
MOV[BX],AL
INCBX
MOVAL,‘$’;
POPSI
POPDX
POPBX
POPAX
CONVENDP
子程序名称;
CHANGE
子程序功能;
统计CX中所包含权(在SI中)的个数
并把个数转换为ASCH码,存入缓冲区中
CONVPROCNEAR
PUSHAX;
PUSHSI
LEABX,BUF
MOVAL,0DH
MOV[BX],AL;
MOVAL,CH;
ORAL,AL
JNSPLUS;
NEGCX;
MOVAL,‘-‘
JMPGOON
MOVAL,‘+’
CHANGEENDP
DISPLAY
输出以$结尾的一个字符串
系统09号功能
DISPLAYPROCNEAR
MOVDX,OFFSETBUF
MOVAH,9
INT21H
DISPLAYENDP
CODEENDS
ENDSTART
五.编写程序,将输入的大写字母转换为小写字母。
DATASSEGMENT
adb"
input"
0dh,0ah,"
$"
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
movax,DATAS
movds,ax
movdx,offseta;
定义数据段
movah,9h
int21h;
输出“input”,并且让下一位所要显示的显示在下一行
movah,1
输入
movdl,al;
转存输入
subdl,20h
movah,2
输出此时的DL中的数值(为ASCII码)
movax,4c00h
int21h
CODESENDS
ENDSTART
六.对两个整数变量A和B,编写程序完成下列功能:
1、若两个数中有一个是奇数,则将奇数送入A单元中,偶数送入B单元中。
2、若两个数均为奇数,则两个数分别加1,并存入原变量中。
3、若两个数均为偶数,则两变量不变。
dsegsegment
adw?
bdw?
dsegends
csegsegment
mainprocfar
assumecs:
cseg,ds:
dseg
start:
pushds
subax,ax
pushax
movax,dseg
movds,ax
begin:
movax,a
movbx,b
xorax,bx
testax,0001
jzclass
testbx,0001
jzexit
xchgbx,a
movb,bx
jmpexit
class:
testbx,0001
incb
inca
exit:
ret
mainendp
csegends
endstart