资源描述
第3章 自测练习
一、选择题(四选一)
1.表示一条处理器指令所在存储单元的符号地址是 C 。
A 变量 B 常量 C 标号 D 偏移量
2.汇编语言中的变量有多种类型属性,但错误的类型是 B 。
A 字节型byte B 字符型char
C 字型word D 双字型dword
3.执行mov bx,seg var指令,BX得到变量var的 B 。
A 物理地址 B 段地址 C 偏移地址 D 内容
4.MASM语句中,采用 C 分隔标号和指令。
A 逗号 B 分号 C 冒号 D 空格
5.欲设定从偏移地址100H开始安排程序,可使用 A 伪指令。
A org 100h B start=100h
C start db 100h D start equ 100h
6.与“mov bx,offset var”指令等效的指令是 D 。
A mov bx,var B 1ds bx,var
C les bx,var D 1ea bx,var.
7.下条语句
buf db l0 dup(3 dup(?,10),3,10)
汇编后,变量buf占有的存储单元字节数是 B 。
A 100 B 80 C 40 D 20
8.数据定义语句“numl dw(12 or 6 and 2) ge 0eh”,定义的num1单元的内容是 B 。
A 0 B 0FFFFH C 1 D 0FFH
9.要求将A、B两个字符的ASCII码41H和42H顺序存放在连续两个字节存储单元中,可选用的语句是 A 。
A db`AB' B dw `AB' C db 0ABH D dw 0ABH
10.在汇编语言程序中,对END语句叙述正确的是 C 。
A END语句是一可执行语句
B END语句表示程序执行到此结束
C END语句表示源程序到此结束
D END语句在汇编后要产生机器码
11.下面的数据传送指令中,错误的操作是 D 。
A mov ss:[bx+di],byte ptr 10h B mov dx,l000h
C mov word ptr[bx],1000h D mov ds,2000h
12.下面指令执行后,变量dab中的内容是 C 。
daw dw 2A05h
dab db 0Fah
…
mov al,byte ptr daw
sub dab,al
A 0DAH B 0FAH C 0F5H D 0D0H
13.根据下面的语句序列,AX寄存器的内容是 C 。
tab db 1,2,3,4,5,6
entry equ 3
…
mov bx,offset tab
add bx,entry
mov ax,[bx]
A 0405H B 0304H C 0504H D 0403H
14.假设V1和V2是用DW定义的变量,下列指令中正确的是 A 。
A mov V1,20h B mov V1,V2
C mov al,V1 D mov 2000h,V2
15.若定义xyz dw`A',则xyz字存储单元中存放的数据是 A 。
A 0041H B 4100H C 0061H D 6100H
16.使用伪指令定义:
val db 2 dup (1,2,3dup(3),2dup(1,0),1)
则在val存储区内前10个字节单元的数据是 D 。
A 1,2,3,3,2,1,0,1,2,3 B 1,2,3,3,3,3,2,1,0,1
C 2,1,2,3,3,2,1,0,2,1 D 1,2,3,3,3,1,0,1,0,1
二、填空题
1.用汇编语言编写的程序称为 汇编语言源程序 ,它必须由__汇编_______程序将它转换成二进制的机器语言程序,这种机器语言程序被称为_____目标代码程序_____ ,而转换的过程称为__汇编__________。它还必须用__连接________程序连接,才能生成可执行的程序.
2.汇编语言源程序的扩展名是_ASM __,目标程序的扩展名是_OBJ_______,通常产生的可执行程序的扩展名是__EXE_______·
3.汇编语言语句中,源操作数和目的操作数采用 ,(逗号) 分隔。
4.指令“cmp ax,80h”中源操作数的寻址方式是 立即寻址方式 。
5.若定义“datavar db 0a5h,5bh”,填空指令“mov bx,__word ptr datavar”,使该指令无语法错误。
6.若操作结果为零转向标号goon,应使用的语句为_jz goon (或je goon)_________。
7.与指令“loop again”功能等效的两条指令依次是_dec cx_ 和__jnz again_。
8.用“dw 1234h”语句定义的一个字,如果改用db定义时,语句应为
_db 34h,12h_____________。
9.定义wdata dw l020h,则执行mov al,byte wdata指令后,AL=_20h____。
10.如下数据定义:
V1 db 4dup(2),2
count equ 10
V2 dd count dup(?)
为变量V1分配 5 个字节存储;为变量V2分配 40 个字节存储.
11.现有变量定义如下:
ary dw 10 dup(?)
试填写执行如下指令的结果:
mov ax,type ary ;AX=_2_________
mov bx,length ary ;BX=__10_________
mov cx,size ary ;CX=___20________
12.已知数据段如下:
org 0100h
ary dw 3,$+4,5,6
cnt equ $-ary
db 1,2,cnt,3
则执行如下指令后,AX=_0106h____,BX=_0308h_____。
mov ax,ary+2
mov bx,ary+10
MASM的操作符“$”表示当前偏移地址,所以ary定义的$+4=102h+4=106h。同理,cnt=$-ary=108h-100h=8
13.程序段如下:
blk db 46h,84h,34h,-5,20h,22h,73h
…
mov cx,7
lea si,blk
next: mov al,[si]
inc si
test al,81h
loopz next
mov bl,[si]
该程序段运行后,AL=_84h_____、BL=__34h_______。
第一次顺序执行到test指令时,al=84h. 84h和81h相逻辑与的结果是80h,将使zf=0。随后执行loopz指令,因为zf≠1而终止循环;此时al=84h,因为si已经加1指向后一个数据,所以bl=34h。
14.如下源程序
;数据段
avar dw 0
bvar dw 0
cvar dw 10,20,30
;代码段
lea bx,cvar
mov ax,[bx]
mov bvar,ax
mov ax,[bx+2]
add ax,bvar
mov avar,ax
执行后,avar= 30 。
三、问答题
1.汇编语言中,伪指令语句与硬指令语句的本质区别是什么?
硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;
伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。
2.汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
①编辑:用纯文本编辑程序源程序,产生ASM源程序。
②汇编:用汇编程序汇编源程序,产生OBJ目标程序。
③连接:用连接程序将目标程序转换为EXE可执行程序。
④调试:用调试程序调试可执行程序。
3.源程序中如何指明程序执行的起始点?
通常在起始指令设置一个标号(例如START),然后用“END START”伪指令说明该标号的指令为起始点。
4.标号有哪三个属性?其含义是什么?
段地址:表示标号所在代码段的段地址。
偏移地址:表示标号所在代码段的段内偏移地址。
类型:引用该标号时,表示它所在同一个段——NEAR类型,还是另外一个段——FAR类型。
5.说明如下两条语句的区别:
①xyz1 db 75
②xyz2 equ 75
①“xyz1 db 75”语句定义了一个字节变量xyz1,在主存存放了一个75的数据。
②“xyz2 equ 75”语句说明了一个常量xyz2,它代表75,它在主存中并没有存放任何内容。
6.下列语句在存储器中分别为变量数据区分配多少个字节单元?
①var5 dd 10 分配4个字节单元
②var6 dw 4 dup(?),2 分配10个字节单元
四、程序阅读题
1.下述程序段运行后,从Bxyz单元开始依次存放的数据是什么?
Axyz db 0F8h
Bxyz db 3dup(?)
…
lea di,Bxyz
mov cx,3
mov al,Axyz
lop: sar al,1
mov [di],al
inc di
loop lop
从Bxyz单元开始依次存放0FCH、0FEH、0FFH
2.现有源程序如下:
;数据段
org 100h
block dw l,2,3,4,5,6,7,8,9
count equ ($-block)/2
result dw count,?
;代码段
lea bx,block-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字存储单元的内容是什么?
result+2字存储单元的内容是9(最大值)
②BX等于多少?
BX等于110H
③程序循环了多少次?
程序循环了9次
3.现有下列数据段:
string db`ABCDEFGHIJKL'
count equ $-string
buffer db count dup(0)
下面程序段是实现把string中所有字符逆向传送到buffer缓冲区(即将string中第一个字符送到buffer的最后一个单元,sting中最后一字符送到buffer的第一个单元,……)。请把程序中所空缺的指令填上。
mov si,offset buffer-1
mov di,offset buffer
mov cx,count
cld
again: movsb
__sub si, 2____
loop again
本题中目的存储区用DI指示首地址,源存储区用SI指示尾地址,以便实现逆向传送。如果串传送指令MOVSB采用增量方式(CLD指令)则DI和SI都自动加1,而实际上SI需要的是减1,所以第二个空缺位置应该填上“SUB SI,2”。
4.说明如下程序段完成什么功能
dxyz1 db 300 dup(?)
dxyz2 db l00 dup(?)
…
mov cx,100
mov bx,200
mov si,0
mov di,si
next: mov al,dxyz1[bx][si]
mov dxyz2[di],al
inc si
inc di
loop next
将dxyz1 后100个数据传送到dxyz2缓冲区。
五、程序设计题
1.分别用一个说明性语句完成如下要求:
①将数据56h、78、0b3h、100依次存放在字节变量onebyte中;
onebyte db 56h、78、0b3h、100
②字变量twoword依次存放数据3721h、l0h、100、4936h;
twoword dw 3721h、l0h、100、4936h;
③将字符串“How are you!”存入变量fourmsg;
fourmsg db ‘How are you!’
④以fivemulti为首地址,连续存放字节数据,2个23h,5个`A',10个1和2,25个预留单元。
fivemulti db 2 dup (23h), 5 dup (`A'), 10 dup (1,2) , 25 dup (?)
2.分别用一个执行性语句完成如下要求:
①栈顶内容弹出送字变量stkw;
pop stkw
②双字变量memd存放的地址指针送ES和SI;
les si, memd
③变量vars类型属性送AX;
mov ax, type vars
④取字符串变量msg00的首地址送BX;
mov bx , offset msg00
3.按照给定的条件为程序定义一个数据段:
①datal是字符串THIS IS A DATA_SEGMENT;
②data2是字节变量,初值为23、4BH、126、D3H;
③data3是16位数据变量,初值为100、255、3、5、3、5、3、5;
④data4是16位数据变量,但只知需要占有100个存储单元;
⑤data5变量存放data4变量的数据个数.
dataseg segment
data1 db ‘THIS IS A DATA_SEGMENT’
data2 db 23, 4BH, 126, 0D3H
data3 dw 100, 255, 3dup(3、5)
data4 dw 50 dup(?)
data5 dw length data4
dataseg ends
4.假设有一个数据段:
buf1 db l00dup(`z')
buf2 dw 1234h,5678,0abh
buf3 db 20 dup (?)
buf4 db 9,8,7,6,5
请分别用一条语句完成如下操作:
①将buf1的偏移地址送入BX;
mov offset buf1
②将buf2的第4个字节数据送DH;
mov dh ,byte ptr buf2[4]
③将数据9fh送入buf3的第10个存储单元;
mov buf3[10] , 9fh
④将buf4中最后一个单元内容加1,但不能改变标志CF的状态;
inc buf4+4
⑤计算buf1和buf3两者所占存储单元字节个数送CX。
Mov cx,size buf1+size buf3
5.现要将具有20个字符的string1字符串移到同一个数据段的string2中,请定义数据段,编写代码段.
String1 db ‘ abcdefghijklmnopqrst’ ; 假设一个字符串
String2 db 20 dup (?)
; 代码段(也可以用串传送指令)
mov cx, 20
mov si ,offset string1
mov di ,offset string2
mov ds, ax
mov es, ax
cld
rep movsb
6.从键盘输入一个字符串(不超过255个),将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示。
;数据段
maxnum equ 255
kbuffer db maxnum, 0, maxnum dup (0)
;代码段
mov dx, offset kbuffer
mov ah, 0ah
int 21h ;键盘输入字符串
mov bx, offset kbuffer+1
mov cl,[bx] ;取字符
mov ch, 0
again: inc bx
mov al,[bx] ;取一个字符
cmp al,’a’ ;小于“a”不转换
jb next
cmp al,’z’ ;大于“z”不转换
ja next
sub al,20h ;是小写字母则转换为大写字母
next: mov dl,al
mov ah,02h
int 21h ;显示输出
loop again
从键盘输入一个字符串需要利用DOS功能调用0AH号,该调用的关键是设置数据缓冲区。第一个字节单元填入最大可能输入的字符数(255);第二个单元任意,留作功能调用中填入实际输入的字符的字符数;后面用做填入字符的ASCII码。
注意:0AH号功能调用后,最后一个单元总是填入回车ENTER字符(ASCII码为0DH),所以实际能够输入的字符数比最大字符数少1。
利用一个循环程序段处理将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示,显示功能利用DOS功能调用02H号。循环指令LOOP利用CX作为计数器,但字符数单元是一个字节量,所以只能传送到CL,而CH应该为0。
8
展开阅读全文