资源描述
中国地质大学(北京)继续教育学院 2012年09课程考试
《汇编语言程序设计》模拟题
一.单项选择题
1.段寄存器( B )给定了当前可使用附加数据段的段首址。
A.DS B.ES C.SS D.CS
2.在语句"MOV AX,5[BX+SI]"中, 源操作采用的是( D )寻址方式。
A. 直接 B. 寄存器间接 C. 变址 D. 基址加变址
3.SBB指令的功能为( B )。
A. (OPD)-(OPS)→OPD B. (OPD)-(OPS)-CF→OPD
C. (OPS)-CF→OPD D. (OPD)-CF→OPD
4.若有符号数运算结果溢出,则( A )位置1。
A.OF B.CF C.ZF D.SF
5.使用串操作指令时,目的串一定要放在当前( C )中。
A.代码段 B.数据段 C.附加数据段 D.堆栈段
二.填空题
1、 LOOP指令的转移范围是 0-255个字节 。
2、 如果END伪指令后面带有符号地址,这个符号地址即为该程序运行时的 启动地址 。
3、 如果在当前堆栈段中用SI作指针,则应该用 SS: 进行说明
4、 在使用OUT指令时,如外设端口地址大于255,则应先把该地址送入 DX 寄存器中。
5、已知(AX)、(BX)均为无符号数,在“CMP AX,BX”之后使用转移指令JBE L _可使(AX)£(BX)时转L处执行
三.改错题
1.SAL AX,2 SAL AX,1
2. LEA POINT,BUF LEA SI,BUF
3.IDIV AX,10 MOV BX,10
IDIV BX
4.POP BL POP BX
5.ADD [BX],[SI] ADD BX,[SI]
6. CWD AX,DX CWD
7.MOV DX,5[SI+DI] MOV DX,5[BX+DI]
8. OUT DX,‘A’ MOV AL,‘A’
OUT DX,AL
9.STACK SEGMENT PARA PUBLIC ‘STACK ;定义堆栈段
STACK SEGMENT PARA STACK ‘STACK’
10.TEST AX,01H ;测试AX最高位 TEST AX,8000H
11.DEC [DI] DEC [DI]
DEC WORD PTR [DI]
12.CWD AX, DX CWD AX, DX
CWD
13.OUT DL, ‘$’ OUT DL, ‘$’
MOV AL, ‘$’
OUT DX,AL
14. MOV SI,AL MOV SI,AL
MOV SI,AX
15. MOV CX, [BX+BP] MOV CX, [BX+BP]
MOV CX, [BX+SI]
16. MOV DS, DATA MOV DS, DATA
MOV AX, DATA
17. SHL AX,3 SHL AX,3
SHL AX,CL
18. AND AX,[CX] AND AX,[CX]
AND AX,[BX]
19. 执行DOS10号功能调用往BUF缓冲区输入字符串后,输入串首址应在BUF+1中。
BUF+2
20. 若无符号数相加结果溢出,则OF位置1。
CF
四.简答题
1.简述宏指令与子程序的区别。
答: 定义的方式不一样;
执行的时间不一样,子程序是在运行.EXE文件时被执行的,而宏指令是在汇编期间被执行的;
参数传递的方式不同。
2.已知(AX)=0FBADH,执行以下语句序列后,(AX)=?
XCHG AH,AL
OR AX,0FF00H
答:(AX)=0FFFBH
3.如何计算待取出指令的物理地址?
答:(IP)左移四位+(CS)
4.已知AX和BX中均为无符号数且需(AX)>(BX)时转NEXT处执行:
CMP AX,BX
( ) NEXT
可在括号内填入哪几种转移指令?
答: JA或JEA
5.已知两数补码分别为:[X1]补=00010101B, [X2]补=10100110B, 计算[X1]补+[X2]补后, ZF和SF各为多少?
答:ZF=0, SF=1
6. 已知(DX)=7AF8H,执行“OR DX,0F0F0H”后(DX)=?
答:0FAF8H
7.已知(SS)=2000H,(SP)=1000H,栈顶的物理地址为多少?
答:21000H
8. 如果需要往STR缓冲区输入字符串,在下列程序段的空白处应填入什么指令?
TT MACRO A,B
LEA DX,A
MOV AH,B
INT 21H
ENDM
┇
STR DB 80,0,80 DUP(0)
┇
__________
答:TT STR, 10
五.编写程序段
1. 已知数据段如下:
DATA SEGMENT
DATA1 DW -7935,12BCH,0
DATA2 DB -12,25H
STR0 DB ‘DWCMLWOM $CM ┅’
COUNT EQU $-STR0
DATA ENDS
请根据题目要求编写程序段。
1) DATA2中的全部数据压入堆栈中。
2) 算(DATA1)×(DATA1+2)+DATA1→DATA1+2、DATA+4中。
3) 请用串操作指令在STR0串中查找字符‘W’出现的次数 →DL。
4) 请写出将STR0字符串在显示器上当前光标位置输出的程序段。
5) 判断DATA1中的第15位与第7位是否同时为0,为0转ZERO处执行,否则返回DOS。
2)MOV AX,DATA1
IMUL DATA1+2
MOV BX,AX
MOV CX,DX
MOV AX,DATA1
CWD
ADD AX,BX
ADC DX,CX
MOV DATA1+4,DX
MOV DATA1+2,AX
3)LEA DI,STR0
MOV CX,COUNT
MOV AL,’W’
MOV DL,0
P0: REPNE SCASB
CMP CX,0
JE END0
INC DL
JMP P0
END0:……
1)MOV AL,DATA2
CBW
PUSH AX
MOV AL,DATA2+1
MOV AH,0
PUSH AX
5)MOV AX,DATA1
AND AX,8080H
JE ZERO
MOV AH,4CH
INT 21H
ZERO: ……
4)LEA DI,STR0
MOV CX,COUNT
A: MOV DL,[DI]
INC DI
MOV AH,2
INT 21H
LOOP A
2. 已知D盘MASM子目录下有一存在的文件WAN. ASM,编写打开该文件的程序段,打开成功0→AX,否则,-1→AX,最后返回操作系统。
答:┇
F DB ‘D:\MASM\WAN.ASM’,0
┇
LEA DX,F
MOV AH,3DH
MOV AL,2
INT 21H
JC ERR
MOV AX,0
JMP ROS
ERR: MOV AX,-1
ROS: MOV AH,4CH
INT 21H
3. 已知数据段中有语句“A DW -160,0”,请分别用乘法指令和移位指令实现(A)*16 → A和A+2中(注:不考虑溢出)。
答:① MOV AX,A
MOV CX,16
IMUL CX
MOV A,AX
MOV A+2,DX
② MOV CL,4
SAL A,CL
4.请写出分别将AX、BH中的有符号数和CL中的无符号数顺序压入系统堆栈的程序段。
答:PUSH AX
MOV AL,BH
CBW
PUSH AX
MOV CH,0
PUSH CX
七.阅读程序并回答问题
1.该程序的功能是什么?
2.请写出子程序SUBP的入口参数和出口参数。
3.若在子程序SUBP中漏写了“POP BX”,该子程序能正确返回吗?为什么?
DATA SEGMENT
OUTF DB 0AH,0DH,0,0,’H’,0AH,0DH,’$’
DATA ENDS
┆
REP: MOV AH,1
INT 21H
CMP AL,’0’
JB EXIT
CMP AL,’9’
JA EXIT
LEA SI,OUTF+2
CALL SUBP
LEA DX,OUTF
MOV AH,9
INT 21H
JMP REP
EXIT: MOV AH,4CH
INT 21H
SUBP PROC
PUSH BX
MOV AH,0
MOV BL,16
DIV BL
ADD AL,30H
MOV [SI],AL
INC SI
ADD AH,30H
MOV [SI],AH
POP BX
RET
SUBP ENDP
┆
答:1. 功能:等待从键盘输入一个字符,如为数字字符,则在下一行输出其十六进制的ASCII
码,再等待输入下一字符;如为其它字符,则转结束。
2. 入口参数: AL:存放从键盘输入的一个字符
AH:被除数高位
BL:要转换的进制(除数)
SI:存放转换后的两位ASCII码指针
出口参数: 无
3. 不能返回,因为此时栈顶的内容是(BX),而不是返回主程序的偏移地址
八.编程题
1. 往BUF1和BUF2两缓冲区中分别输入字符串,请使用串操作指令比较这两个串是否相等,如相等则在下一行显示“The two stringe are equal!”;如不相等则在下一行显示“The two stringe are not equal!”
说明:① 画出主程序的流程图。
② 写出寄存器的使用分配情况。
③ 写出关键语句的注释。
寄存器使用分配:
SI:取原串字符指针
DI:取目的串字符指针
BL:存放BUF2串长度
CX:存放BUF1串长度
DX:DOS中断调用
答:IO MACRO A,B
LEA DX,A
MOV AH,B
INT 21H
ENDM
DATA SEGMENT
BUF1 DB 80,0,80 DUP(0)
BUF2 DB 80,0,80 DUP(0)
T1 DB 0AH,0DH,’the two stringe equal !’
T2 DB 0AH,0DH,’the two stringe not equal !’
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CODE:CS,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX 送数据段首址
MOV ES,AX
IO BUF1,10 输入两个字符串
IO BUF2,10
MOV CL,BUF1+1
MOV BL,BUF2+1 比较两串长度是否相等
CMP CL,BL
JNE NO_EQU ; 不等转NO_EQU
LEA SI,BUF1
LEA DI,BUF2
MOV CH,0 长度相等,则比较两串字符是否相等
REPZ CMPSB
JNE NO_EQU ; 不等转NO_EQU
IO T1,9 ; 显示两串相等
JMP EXIT
NO_EQU: IO T2,9 ; 显示两串不相等
EXIT: MOV AH,41H ; 返回DOS
INT 21H
CODE ENDS
END START
2. 在以ARR为首址的数组中存放着若干个十六位无符号非0数,最后以0作结束标志。统计该组数中奇数的个数送ODD单元、偶数的个数送EVEN0单元中。试编其程序。
要求:1. 画程序框图
2. 编写源程序
3. 写出寄存器的使用分配情况
4. 写出关键语句的注释。
答:DATA SEGMENT
ARR DW 1,2,3,4,5,6,7,8,9,0;已知数组
ODD DW 0 ;奇数个数单元
EVEN0 DW 0 ;偶数个数单元
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
LEA SI,ARR
MOV CX,0 ;偶数计数器
MOV DX,0 ;奇数计数器
NEXT: MOV AX,[SI];取一待判断的数送AX
ADD SI,2
CMP AX,0
JE PP ;如该数为0转结束处理
AND AX,1 ;如不为0,判断最后一位是否为0
JE EVEN1 ;为0,转偶数计数
INC DX ;不为0,奇数计数器加1
JMP NEXT ;转取下一数
EVEN1:INC CX ;偶数计数器加1
JMP NEXT ;转取下一数
PP: MOV ODD,DX ;保存奇数计数
MOV EVEN0,CX;保存偶数计数
MOV AH,4CH
INT 21H
CODE ENDS
END START
寄存器使用分配:
SI: 取数指针
AX: 中间寄存器
CX: 偶数计数器
DX: 奇数计数器
开始
取一数→AX
(AX)=0?
(DX)+1→DX
N
Y
结束
ARR→SI,0→CX,0→DX
(AX)为偶数否?
(CX)+1→CX
Y
DX→ODD,CX→EVEN0
N
程序框图
第8页(共8页)
展开阅读全文