汇编语言复习题与答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言程序设计复习题
一、选择题
1.用户为了解决自己的问题,用汇编语言所编写的程序,称为(B )
A.目标程序
B.源程序
C.可执行程序
D.汇编程序
2.某系列微机对存储器的分段,如果每一个段最多的字节存储单元是64K,那么表示段内字节单元偏移地址的二进制位数应是( B )
A.20位
B.16位
C.15位
D.12位
3.设SP初值为2000H,执行指令“PUSH AX”后,SP的值是( D )
A.1FFFH
B.1998H
C.2002H
D.1FFEH
4.循环指令LOOP产生循环的条件是( C )
A.CX-1=1
B.CX-1=0
C.CX-1≠0
D.CF=1和ZF=0
5.汇编语言源程序中,每个语句可由四项组成,其中名字项是一个符号,下面列出的有效名字是( A )
A. Variable
B. First & ld
C.0FFFFH
D. ‘Memphis’
6. 要求将A,B两个字符的ASCⅡ码41H,42H顺序存放在连续两个字存储单元中,可选用的语句是( A )
A. DA1 DB ‘AB’
B.DA1 DW‘AB’
C. DA1 DB 0ABH
D.DA1 DW ‘ABH
7.某程序装入内存后,DS=1200H,CS=1400H,则程序中数据段中的数据最多是( C )字节。

A.2K
B.4K
C.8K
D.16K
8.有语句:COUNT EQU 256下列四种叙述中,正确的是( C )。

A.COUNT是变量
B.COUNT占用一个字节存储单元
C.COUNT是符号常数
D.COUNT占用二个字节存储单元
9.下面指令中,源操作数的寻址方式为立即寻址的是( C )。

A.MOV AX,OFFSET A
B.MOV AX,A
C.MOV AX,1
D.MOV AX,A〔BX〕
10.下列指令执行后,不改变AL寄存器内容的指令是( B )。

A.AND AL,1
B.CMP AL,DL
C.XOR AL,AL
D.SUB AL,DL
11.执行1号DOS系统功能调用,从键盘输入的字符值存放在( A )寄存器中。

A.AL
B.BL
C.CL
D.DL
12.将CX寄存器低4位清零的正确指令是( B )。

A. AND CX,0F0H
B.AND CX,0FFF0H
C.AND CX,1110H
D.MOV CX,0
13.微机中,有符号数是用( B )表示的
A.原码B.补码C.反码D.BCD码
14.把汇编源程序变成目标代码程序的过程是( B )
A.编译B.汇编C.编辑D.链接
二、填空题
1.ZF标志位是标志结果是否为零的,若结果为零,ZF为(1 ),否则ZF为(0 )。

当ZF为1时,SF为(0 )
2.从80386开始,Intel的CPU具有3种运行模式:实模式、保护模式和虚拟8086模式。

3. 16位无符号整数的表示范围为0--65535,写成16进制形式为(0H--FFFFH),16位有符号整数的表示范围为-32768--+32767,写成16进制形式为(8000H—7FFFH )
4.寻址方式指的是指令按什么方式给出操作数或与其有关的地址信息,80386以上的微处理器指令寻址方式有八种:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式、相对基址变址寻址方式、比例变址寻址方式。

5.循环程序通常由(循环准备)(循环体)(循环的控制与修改)和循环结果处理四部分构成。

6. 宏指令定义必须由伪指令(MACRO )开始,伪指令(ENOM )结束,两者之间的语句称为(宏定义体)
7.调用程序与子程序之间的参数传递方法有四种,即堆栈法、(约定寄存器,)(约定存储单元法,)(向量传递法)
8.分别用一条语句实现下述指明的功能
(1)栈顶内容弹出送字变量AYW(POP AYW )
(2)双字变量AYD存放的地址指针送ES和SI(LES SI,AYD )
(3)变量AY2类型属性送AH(MOV AH,TYPE AY2 )
(4)不允许中断即关中断(CLI )
(5)将字符串‘HOW ARE YOU!’存入变量AYB(AYB DB ‘HOW ARE YOU!’)(6)子程序返回调用程序(RET )
(7)地址表达式AYY[4]的偏移地址送字变量ADDR(MOV ADDR,OFFSET AYY[4] )(8)AX的内容加1,要求不影响CF(INC AX )
(9)BX的内容加1,要求影响所有标志位(ADD BX,1 )
(10)若操作结果为零转向标号GOON(JZ GOON )
(11)BX寄存器低4位置1(OR BX,000FH )
(12)AL寄存器最低位置0(AND AL ,0FEH )
(13)AX与BX的值互换(XCHG AX , BX )
(14)变量ARRAY 的地址送DI 寄存器(LEA DI, ARRAY
或MOV DI , OFFSET ARRAY )
三. 排错题:每小题列出了一条指令,判断该指令有无语法错误,如果存在语法错误,请指出具体的错误原因。

1.PUSH 5588H ;push的源操作数不能是立即数
2.MOV DS,1720H ;给段寄存器赋值不能给立即数
3.ADD AX,CL ;AX是16位的,CL是8位的,不能相加
4.AND AX,[DX] ;DX不是基址寄存器
5. MOV CS, AX ;MOV 指令不能给CS段寄存器传送数据
6. MOV M1 , M2 ;MOV指令不能给两个存储单元之间直接传送数据
7. LEA BX , OFFSET VAR ;多了OFFSET 项
四、简答题
1.试述CMP AX,BX和SUB AX,BX两条语句的异同点?
相同点:都执行AX-BX操作,影响所有标志位且对档志位的影响相同不同点:CMP执行后AX,BX内容不改变,而SUB执行后,AX内为AX-BX之差,即内容变化了。

2.标号有哪三个属性?其含义是什么?
段属性指定义该标号的段地址;
偏移属性:指该标号的偏移地址
类型属性:指标号是在定义它的段内引用还是在其它段引用
3.子程序和中断处理子程序在调用方法及返回指令上有何区别?
子程序调用是由CALL 指令调用的,而中断分为内中断和外中断,内中断是通过INT n指令调用中断处理子程序的,外中断是来自于CPU外部的中断,它的产生是不可预测的,当这些中断产生时由系统自动完成中断处理子程序的调用。

子程序返回执行RET 指令,而中断处理子程序的返回执行IRET。

4.简述宏指令与子程序的区别。

采用宏和子程序均能达到代码共享、简化源程序的目的,但它们的区别也是显而易见的。

区别主要有以下几点:
(1)工作方式的区别
宏调用是在汇编时由汇编程序进行宏扩展的,而子程序是在程序执行期间由调用程序调用的。

因此使用宏指令占用较大的空间但速度较快,而使用子程序占用较小的空间但执行时间较长。

(2)参数传递的方便性
宏指令定义时可以带有形式参数,宏调用时可以直接在宏指令名后带有实参数以替换形式参数,参数传递十分方便。

而子程序参数的传递是通过寄存器、堆栈等方法实现的,实现起来不是很方便。

(3)参数的多样性及灵活性:宏指令的实参数可以是常数、寄存器、内存变量、操作码或操作码的一部分等,这是子程序所不能比拟的。

5.简述子程序设计注意事项。

(1).子程序说明:为了便于引用,子程序就在开头对其功能、调用参数各返回参数等予以说明,例如参数的类型、格式及存放位置等。

(2).寄存器的保存与恢复:设计良好的子程序在其开头应保存它将用到的寄存器的内容,而在返回前再恢复它们,以保证调用程序的寄存器内容不被破坏。

(3).密切注意堆栈状态:在含有子程序的汇编语言程序设计中,要密切注意堆栈的变化,这包括要注意一切与堆栈有关的操作。

当执行RET指令时,从堆栈弹出的数据应该正好是由相应的CALL 指令压入的值,否则后果不可预测。

6.简述完整段定义和简化段定义的汇编语言程序的一般结构。

完整段定义汇编语言程序一般格式如下:
STSG SEGMENT STACK ‘S’
DW 32 DUP(?) ;堆栈段定义
STSG ENDS
DATA SEGMENT。

;数据段定义
DATA ENDS
CODE SEGMENT ;代码段定义
MAIN PROC ;主程序开始
ASSUME C S:CODE , DS:DATA,SS:STSG
MOV AX , DATA ;设置DS段的值
MOV DS , AX。


MOV AX ,4C00H ;程序结束返回DOS
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
简化段定义汇编语言程序的一般结构:
(1)使用16位指令模式的一般格式
.MODEL SMALL ;存储模式
.586 ;指令集
.STACK 64 ;堆栈段定义
.DATA ;数据段定义。

.CODE ;代码段定义
.STARTUP ;主程序起始。

.EXIT ;程序结束返回DOS
END
(2)使用32位指令模式的一般格式
.model flat, stdcall ;存储模式
option casemap:none
.586 ;指令集
includelib msvcrt.lib ;函数库包含。

.stack 64 ;堆栈段定义
.data ;数据段定义。

.code ;代码段定义
start: ;主程序起始。

ret ;程序结束
end start
五.程序分析题:每小题列出了一段小的程序片段和相关存储单元的初始值,请按题目的要求分析各程序片段的运行结果或按功能要求填写指令。

(寄存器中的内容请使用十六进制形式给出)
1.阅读如下程序片段
MOV AL,0F3H
MOV DL,0C4H
ADD AL,DL
AND AL,0FH
执行上述程序片段后,(AL)= 7 H ,
AF= 0 ,CF= 0 ,OF= 0 ,PF= 1 .
2.阅读如下程序片段
MOV AL,7EH
MOV CL,04H
ROL AL,CL
执行上述程序片段后,(AL)= e7 H ,(CL)= 4 ,
CF= 1 , OF= 0 .
3.阅读如下程序片段
MOV AX,0632H
MOV BX,0C202H
SUB AX,BX
INC AX
执行上述程序片段后,(AX)= 4431H ,
CF= 1 ,OF= 0 .
4.阅读如下程序片段,假设(SP)=0064H
MOV AX,0001H
MOV BX,0002H
PUSH AX
PUSH BX
POP AX
POP BX
执行上述程序片段后,(AX)= 0002H ,(BX)= 0001H ,
(SP)= 0064H ,
5 .阅读如下程序段,回答所提出的问题,假定X1,X2,...XN为无符号数。

ORG 100H
BLOK DW X1,X2, (X)
COUNT EQU ($-BLOK)/2
RESULT DW COUNT , ?
... .......
LEA BX, BLOK-2
MOV CX, RESULT
XOR AX,AX
GOON:ADD BX,2
CMP AX,[BX]
JAE NEXT
MOV AX,[BX]
NEXT:LOOP GOON
MOV RESULT+2,AX
程序段执行完,回答下述问题
RESULT+2字存储单元的内容=(X1,X2,...XN中的最大值)
BX=(BLOK+ (COUNT-1)*2 即XN 的地址)
程序循环次数=(COUNT )
6 . 在下述程序段的每一空框内填入一个语句(不得修改其它语句),以实现如下功能:字节变量STR中存放着一个字符串,以0DH为结束标志,试求串长度并送字变量COUNT 中。

LEA SI ,STR
( MOV AL,ODH )
XOR CX, CX
GOON: CMP AL,[SI]
(JE NEXT或JZ NEXT )
INC CX
(INC SI )
JMP GOON
NEXT:MOV COUNT,CX
六.程序设计题。

1.BUF字型数组有50 个有符号数,编程分别统计其中正数、负数和0的个数,并显示输出统计结果。

;程序清单:
.386
.model flat,stdcall
option casemap:none
includelib msvcrt.lib
printf PROTO C :dword,:vararg
.data
buf dword 20, 15, 70, -1,30,-30,0, 32, 89, 12,-56,-9 ,……………………; (50个有符号数) count equ ($-buf)/4 ; 数组中元素的个数
sum1 dword 0
sum2 dword 0
sum3 dword 0
szFmt byte 'sum1,sum2,sum3 =%d,%d,%d', 0ah, 0 ; 输出结果格式字符串
.code
start:
mov ecx, count
lea esi, buf
lab0:
mov ebx, [esi]
cmp ebx, 0
jge lab1
inc sum2
jmp lab3
lab1: je lab2
inc sum1
jmp lab3
lab2: inc sum3
lab3:
add esi,4
loop lab0
invoke printf, offset szFmt, sum1,sum2,sum3
ret
end start
2.试用调用子程序的方法计算Y=( A2+ B2), 要求计算X2 用累加的方法实现并定义成子程序的形式,
;程序清单:
.386
.model flat,stdcall
includelib msvcrt.lib
printf PROTO C :dword,:vararg
scanf PROTO C :dword,:vararg
.data
szOut byte ' y = %d', 0ah, 0
szinputfmstr byte '%d,%d'
szoutputfmtstr byte 'a,b =',0ah,0
a dword ?
b dword ?
y dword ?
.code
founc proc C x:dword
mov ecx, x
xor eax, eax
goon: add eax, x
loop goon
ret
founc endp
start proc
invoke printf, offset szoutputfmtstr
invoke scanf, offset szinputfmstr,offset a, offset b
invoke founc, a ; EAX = A2
mov y, eax
invoke founc, b ; EAX = B2
add y,eax
invoke printf, offset szOut, y
ret
start endp
end start
3.编写一递归子程序,计算N ! 。

要求N 在主程序中用键盘输入。

;程序清单:
.386
.model flat,stdcall
includelib msvcrt.lib
printf PROTO C :dword,:vararg
scanf PROTO C :dword,:vararg
.data
szOut byte ' %d ! = %d', 0ah, 0
szinputfmstr byte '%d'
szoutputfmtstr byte 'n=',0ah,0
m dword ?
.code
power proc C n:dword
cmp n, 0
jle exitrecurse
mov ebx, n ; EBX = n
dec ebx ; EBX = n-1
invoke power , EBX ; EAX = (n-1)!
imul n ; EAX = EAX * n
ret
exitrecurse:
mov eax, 1 ; n = 0时, n! = 1
ret
power endp
start proc
invoke printf, offset szoutputfmtstr
invoke scanf, offset szinputfmstr,offset m
invoke power, m
mov p, eax ; EAX = n!
invoke printf, offset szOut, m, p
ret
start endp
end start
4.编写一个Windows汇编程序,显示一个消息框,消息框中标题为“关于汇编”正文内容为“欢迎进入Windows汇编世界”。

并说明在命令提示符下编译这个程序所用的ML命令的格式。

;proc4.asm程序清单:
.586
.model flat,stdcall
Option casemap:none
includelib user32.lib
MessageBoxA PROTO: DWORD,:DWORD,: DWORD,:DWORD
NULL equ 0
MB_OK equ 0
.data
Tiltle byte '关于汇编',0
string byte '欢迎进入Windows汇编世界'
.code
start:
invoke MessageBoxA,NULL, offset string,offset Tiltle,MB_OK
ret
在命令提示符下编译这个程序所用的ML命令的格式:
ml /coff proc4.asm /link /subsystem:windows
(注:可编辑下载,若有不当之处,请指正,谢谢!)。

相关文档
最新文档