汇编语言习题答案.docx
《汇编语言习题答案.docx》由会员分享,可在线阅读,更多相关《汇编语言习题答案.docx(11页珍藏版)》请在冰豆网上搜索。
汇编语言习题答案
第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.说明子程序参数传递的三种要紧方式。
寄放器、共享变量(公共存储单元)、堆栈
四、程序阅读题
数据区中有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开始的字节存储单元内容依次是一、0、3、二、五、4、7、六、九、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;然后跳出循环体
next:
addbx,2
loopagain
movwordsum,ax
done:
…
4.编写一个完整的程序,要求如下:
①采纳简化段(或完整段)概念格式;
②提示输入字符串“Inputstring:
”;
③从键盘输入一个字符串(不超过255);
④别离统计其中的大写字母和小写字母的个数(采纳于程序形式);
⑤将大、小写字母个数别离寄存在ucase和lcase单元中。
stacksegmentstack;概念堆栈段
db1024dup(0)
stackends
datasegment;概念数据段
msgdb‘Inputstring:
’0dh,0ah,’$’
stringdb255
db?
db255dup(?
)
lcasedb0
ucasedb0
dataends
codesegment;概念代码段
assumecs:
code,ds:
data,ss:
stack
start:
movax,data;程序开始点
movds,ax
movah,9;提示输入字符串
movdx,offsetmsg
int21h
movah,0ah;从键盘同意字符串
movdx,offsetstring
int21h
movbx,offsetstring+2;设置入口参数
movcl,[bx-1];DS:
BX指向字符串首地址
xorch,ch;CX等于字符串长度
callslength;挪用子程序,统计大小写字母的个数
movlcase,al;处置出口参数:
AL=小写字母个数
movucase,ah;AH=大写字母个数
movax,4c00h
int21h;程序终止,返回DOS
;子程序:
采纳寄放器传递入口参数和出口参数
slengthproc
pushdx
xorax,ax
slen1:
movdl,[bx];掏出一个字符
cmpdl,’A’;判定是不是为大写字母
jbslen3;小于“A”,不是字母
cmpdl,’Z’
jaslen2;不是大写字母,可能是小写字母
incah;是大写字母,那么大写字母个数加1
jmpslen3
slen2:
cmpdl,’a’;判定是不是为小写字母
jbslen3
cmpdl,’z’
jaslen3
incal;是小写字母,那么小写字母个数加1
slen3:
incbx
loopslen1
popdx
ret
slengthendp
codeends
endstart