汇编语言题目答案4.docx
《汇编语言题目答案4.docx》由会员分享,可在线阅读,更多相关《汇编语言题目答案4.docx(11页珍藏版)》请在冰豆网上搜索。
汇编语言题目答案4
第4章自测练习
一、选择题(四选一)
1.设计子程序应该采用的一对伪指令是__C_________。
Asegment/endsBstart/endstart
Cproc/endpDmacro/endm
2.主程序将它的参数带给子程序,这个参数被称为A。
A入口参数B出口参数
C寄存器参数D存储器参数
3.对应主程序CALL指令调用子程序,子程序结束通常采用__D_______指令返回主程序。
AjmpBiretChltDret
4.下面程序段条件转移语句发生跳转的条件是AL=___D_____。
cmpal,0fbh
jnlnext
A80hB8fhC0f0hD0ffh
5.如下程序段中的“deccx”指令执行了_C________次。
movcx,4
jcxznext
again:
deccx
jnzagain
next:
...
A0B1C4D5
二、填空题
1.程序的基本结构有顺序、分支、循环和子程序四种。
2.子程序可以通过__寄存器_、存储单元、(地址表)、_堆栈_等传递参数。
3.循环结构的程序通常由初始部分、循环体和循环控制三部分组成。
4.如果主程序调用与它处在同一个代码段的子程序,这是段内调用。
5.下面程序段完成将存储单元abcd1中一个压缩型BCD码拆成两个非压缩型BCD码,高位BCD码存放在abcd3单元,低位BCD码存放在abcd2单元,再分别转换为对应的ASCⅡ码。
请将程序补充完整:
moval,abcdl
movcl,4
shral,cl
Oral,30h
movabcd3,al
moval,abcdl
andal,0fh
orlal,30h
movabcd2,al
6.在下述程序段的每一空框内填入一个语句,以实现如下功能:
字节变量string中存放着一个字符串,以0DH为结束标志,求串长度并送字变量count中。
leasi,string
moval,0dh
xorcx,cx
goon:
cmpal,[si]
jznext
inccx
_incsi_________
jmpgoon
next:
movcont,cx
7.下述程序段运行后,AL=__88h_______、CL=__80h____。
moval,38h
movbl,49h
callsub0
incal
deccl
…
sub0proc
addal,bl
movcl,al
daa
ret
sub0endp
daa:
加法的十进制调整指令
(AL)←把AL的和调整到压缩的BCD格式
这条指令执行前必须执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。
本指令的调整方法:
若AF标志(辅助进位位)为1,或AL寄存器的低4位是16进制的A~F,则AL寄存器内容加06H,且将AF位置1。
若CF标志为1,或AL寄存器的高4位是16进制的A~F,则AL寄存器内容加60H,且将CF位置1。
DAA指令对OF标志无定义,但影响所有其他条件标志。
8.阅读如下子程序,说明它的功能:
sumaryproc
xorax,ax
xordx,dx;执行后,DX=0。
again:
addax,[bx]
adcdx,0;执行的操作是DX=DX+0+CF。
incbx
incbx
loopagain;发生转移的条件是:
cx≠0。
ret
sumaryendp
子程序的入口参数:
DS:
BX=_16数组首地址、CX=_数据个数。
子程序的出口参数:
AX=_求和结果低16位、DX=_求和结果高16位。
子程序功能为:
_将CX个16位无符号数求和。
三、问答题
1.什么是多重循环?
循环体中存在循环结构就形成多重循环。
2.于程序中为什么需要现场保护和恢复?
如何实现?
主程序和子程序可能都要使用某个现场数据,例如,寄存器内容。
如果子程序不进行保护,就会改变原来的内容,返回主程序后将使主程序产生错误的执行结果。
所以,通常子程序开始保护现场数据,返回之前恢复原来的数据。
现场保护和恢复通常借用堆栈区实现,也可以采用特定区的方法。
也就是把现成数据暂存入堆栈区域或特定存储区实现保护。
实现恢复则是从堆栈或存储区取出被保护的数据。
3.试述过程定义的一般格式。
过程定义采用proc和endp一对伪指令实现,有一个用户定义的过程名(subname),可以选择是近(near)调用还是远(far)调用。
这对伪指令中间是过程体,有任意合法的汇编语言语句组成,如下所示:
subnameproc[near/far];过程定义
.......;过程体
subnameendp;过程结束
4.什么是子程序嵌套和子程序递归?
子程序中又调用子程序就形成子程序嵌套。
子程序中直接或间接调用该子程序本身就形成子程序递归。
5.说明子程序参数传递的三种主要方法。
寄存器、共享变量(公共存储单元)、堆栈
四、程序阅读题
1.dal数据区中有50个字节数据,下面程序段将每个数据的低四位变反,高四位不变,并依次存人da2数据区中。
请将程序补充完整。
movcx,50
leasi,dal
leadi,da2
K1:
moval,[si]
xoral,0fh
mov[di],al
incsi
incdi
deccx
_____jnzk1_____________
2.下面是一个用地址表方法实现多分支的程序段。
它根据xyz单元中的数据,找到地址表中的对应地址实现转移,请将程序补充完整:
xyztbldwaddr0
dwaddrl
dwaddr2
dwaddr3
…
xyzdb2
…
leasi,xyztbl
movax,xyz
_addax,ax(或shlax,1)
addsi,ax
_movbx,[si]_
jmpbx
3.下述程序段运行后,nums开始的10个字节存储单元内容依次是什么?
numsdb0,1,2,3,4,5,6,7,8,9
…
leasi,nums
leadi,nums+l
movcx,5
again:
moval,[si]
xchgal,[di]
mov[si],al
addsi,2
adddi,2
loopagain
nums开始的字节存储单元内容依次是1、0、3、2、5、4、7、6、9、8。
本程序依次将两个数据相互交换了一下位置。
4.下段程序的功能是什么?
程序执行后BL=_7____、DL=__9__、AX=___0__
将AX逐位左移,计算其中“1”和“0”的个数。
movax,4bd5h
movbl,0
movdl,bl
movcx,16
k1:
shlax,1
jck2
incbl
jmpk3
k2:
incdl
k3:
loopkl
5.如下源程序的功能是,从键盘读入一字符串(长度小于40),再将该串反转后,输出显示。
请在空格中添入正确的语句。
maxnoequ41
ssegsegmentstack
dw100dup(?
)
ssegends
dsegsegment
mesg1db'Inputastring:
$'
mesg2db'Itsreverseis:
$'
bufdbmaxno,?
maxnodup(?
)
dsegends
csegsegment
assumecs:
cseg,ds:
dseg,ss:
sseg
start:
_movax,dseg_;设置数据段ds地址
movds,ax
movdx,offsetmesg1
movah,9
int21h
movdx,offsetbuf
movah,0ah;利用DOS功能0AH从键盘输入一串字符
int21h
xorax,ax
_moval,buf+1___;取实际读人字符个数
1eadi,buf+2;第一个字符有效地址送DI
movsi,di
addsi,ax
movbyteptr[si],'$'
;字符串结尾填入“$”,以便用DOS功能调用9号实现显示
decsi
cont:
cmpdi,si
_jaedone;当di≥si时结束___
;如果字符串长度是奇数,则会出现si和di相等的情况
;如果字符串长度是偶数,则会出现di大于si的情况
moval,[si]
xchgal,[di]
mov[si],al;前后两个字符相互交换,实现反转
decsi
incdi;调整DI
jmpcont
done:
leadx,buf+2;反转后,字符串显示
movah,9;9号功能调用需要“$”结尾字符串
int21h
movax,4c00h
int21h
csegends
endstart
五、程序设计题
1.从键盘接受一个小写字母,然后找出它的前导字符和后续字符,并按顺序输出这3个字符.
movah,1;输入一个小写字母
int21h
pushax;暂时保存到堆栈
pushax;因显示功能调用回破坏AX内容
movdl,al
decdl;输出前导字符
movah,2
int21h
popax;取出输入的字符
movdl,al;输出该字符
movah,2
int21h
popax
movdl,al;输出后继字符
incdl
movah,2
int21h
(本题目也可以采用一个循环程序段实现)
2.假设给字节变量char预留了26个单元的空间,试编写程序段,将字母A~Z依次存放进去。
;数据段
chardb26dup(?
)
;代码段
moval,’a’
movbx,offsetchar
movcx,26
again:
mov[bx],al
incal
incbx
loopagain
提示:
还可以采用串存储指令实现
3.编写计算100个16位正整数之和的程序。
如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示“overflow”。
;数据段
parraydw23,98,75……;假设有100个数据
wordsumdw0
msgdb‘overflow’,’$’
;代码段
movcx,100
movax,0
movbx,offsetparray
again:
addax,[bx]
jncnext
movdx,offsetmsg
movah,9
int21h;显示溢出信息
jmpdone;然后跳出循环体