汇编第六章答案文档格式.docx
《汇编第六章答案文档格式.docx》由会员分享,可在线阅读,更多相关《汇编第六章答案文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
的功能,写出堆栈最满时各单元的地址及内容.
6.4题的程序
====================================
STACKSEGMENTAT500H
DW128DUP(?
STACKENDS
CODESEGMENT;
MAINPROCFAR;
MAINPARTOFPROGRAM
CODE,SS:
STACK
START:
;
STARTINGEXECUTIONADDRESS
MOVAX,STACK
SUBAX,AX
MAINPARTOFPROGRAMGOESHERE
MOVAX,4321H
CALLHTOA
RET
RETURNTODOS
MAINENDP;
ENDOFMAINPARTOFPROGRAM
HTOAPROCNEAR;
DEFINESUBPROCEDUREHTOA
CMPAX,15
JLEB1
PUSHBP
MOVBP,SP
MOVBX,[BP+2]
ANDBX,000FH
MOV[BP+2],BX
POPBP
MOVCL,4
SHRAX,CL
B1:
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,07H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
HTOAENDP;
ENDOFSUBPROCEDURE
CODEENDS;
ENDSTART;
5.下面是6.5题的程序清单,请在清单中填入此程序执行过程中的堆栈变化.
0000
STACKSGSEGMENT
000020[.DW32DUP(?
?
0040
]
STACKSGENDS
CODESGSEGMENTPARA'
CODE'
BEGINPROCFAR
ASSUMECS:
CODESG,SS:
STACKSG
00001E
PUSHDS
00012BC0SUBAX,AX
000350
PUSHAX
0004E80008RCALLP10
0007CB
RET
0008
BEGINENDP
B10PROC
0008E8000CRCALLC10
000BC3
000C
B10ENDP
C10PROC
000CC3
000D
C10ENDP
CODESGENDS
ENDBEGIN
6.写一段子程序SKIPLINES,完成输出空行的功能.空行的行数在AX寄存器中.
SKIPLINESPROCNEAR
PUSHCX
PUSHDX
MOVCX,AX
NEXT:
MOVAH,2
MOVDL,0AH
INT21H
MOVAH,2
MOVDL,0DH
LOOPNEXT
POPDX
POPCX
RET
SKIPLINESENDP
7.设有10个学生的成绩分别是76,69,81,90,73,88,99,63,100和80分.试编制一个子程序统计60-69,70-79,80-89,90-99和100分的人数并分别存放到S6,S7,S8,S9和S10单元中.
DSEGSEGMENT
NUMDW76,69,84,90,73,88,99,63,100,80
NDW10
S6DW0
S7DW0
S8DW0
S9DW0
S10DW0
DSEGENDS
CODESEGMENT
MAINPROCFAR
CODE,DS:
DSEG
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX
CALLSUB1
MAINENDP
SUB1PROCNEAR
PUSHBX
PUSHSI
MOVSI,0
MOVCX,N
NEXT:
MOVAX,NUM[SI]
MOVBX,10
DIVBL
MOVBL,AL
CBW
SUBBX,6
SALBX,1
INCS6[BX]
ADDSI,2
POPSI
POPBX
POPAX
SUB1ENDP
CODEENDS
ENDSTART
(解法二)
datasgsegment
grade
db76,69,84,90,73,88,99,63,100,80
s6
db0
s7
s8
s9
s10
mess6db'
60~69:
$'
mess7db'
70~79:
mess8db'
80~89:
mess9db'
90~99:
mess10db'
100:
datasgends
codesgsegment
main
procfar
assumecs:
codesg,ds:
datasg
start:
pushds
subax,ax
pushax
movax,datasg
movds,ax
callsub1
leadx,mess6
calldispstr
movdl,s6
calldispscore
callcrlf
leadx,mess7
movdl,s7
calldispscore
leadx,mess8
movdl,s8
leadx,mess9
movdl,s9
calldispscore
leadx,mess10
movdl,s10
ret
endp
sub1
procnear
movcx,10
movsi,0
loop1:
moval,grade[si]
cmpal,60
jl
next5
cmpal,70
jgenext1
incs6
jmpshortnext5
next1:
cmpal,80
jgenext2
incs7
next2:
cmpal,90
jgenext3
incs8
next3:
cmpal,100
jgnext5
jenext4
incs9
next4:
incs10
next5:
incsi
looploop1
dispstrprocnear
movah,9
int21h
dispstrendp
dispscoreprocnear
adddl,30h
movah,2
dispscoreendp
crlfprocnear
movdl,0dh
movdl,0ah
crlfendp
codesgends
endstart
8.编写一个有主程序和子程序结构的程序模块.子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR.要求在N字节数组中查找字符CHAR,并记录该字符的出现次数.;
主程序则要求从键盘接收一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数.(为简化起见,假设出现次数<
=15,可以用十六进制形式显示出来)
DATASEGMENT
MAXLENDB40
NDB?
TABLEDB40DUP(?
)
CHARDB'
A'
查找字符'
EVEN
_ADDRDW3DUP(?
DATAENDS
DATA
MOVAX,0
MOVAX,DATA
LEADX,MAXLEN
MOVAH,0AH
INT21H
从键盘接收字符串
MOV_ADDR,OFFSETTABLE
MOV_ADDR+2,OFFSETN
MOV_ADDR+4,OFFSETCHAR
MOVBX,OFFSET_ADDR;
通过地址表传送变量地址
CALLCOUNT
计算CHAR的出现次数
CALLDISPLAY;
显示
MAINENDP
COUNTPROCNEAR;
COUNT子程序
PUSHDI
MOVDI,[BX]
MOVSI,[BX+2]
MOVCL,BYTEPTR[SI]
MOVCH,0
MOVSI,[BX+4]
MOVAL,BYTEPTR[SI]
MOVBX,0
AGAIN:
CMPAL,BYTEPTR[DI]
JNEL1
INCBX
L1:
INCDI
LOOPAGAIN
POPDI
COUNTENDP
DISPLAYPROCNEAR;
DISPLAY子程序
CALLCRLF
显示回车和换行
MOVDL,CHAR
MOVAH,2
MOVDL,20H
MOVAL,BL
ANDAL,0FH
ADDAL,30H
CMPAL,3AH
JLPRINT
ADDAL,7
PRINT:
MOVDL,AL
CALLCRLF
DISPLAYENDP
CRLFPROCNEAR;
CRLF子程序
MOVDL,0DH
MOVDL,0AH
CRLFENDP
ENDSTART
9.编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来.
主程序TELIST:
(1)显示提示符INPUTNAME:
(2)调用子程序INPUT_NAME输入姓名:
(3)显示提示符INPUTATELEPHONENUMBER:
(4)调用子程序INPHONE输入电话号码;
(5)调用子程序PRINTLINE显示姓名及电话号码;
子程序INPUT_NAME:
(1)调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中;
(2)把INBUF中的姓名移入输出行OUTNAME;
子程序INPHONE:
(1)调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中;
(2)把INBUF中的号码移入输出行OUTPHONE.
子程序PRINTLINE:
显示姓名及电话号码,格式为:
NAME
TEL
****
********
==========================================
编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来
(解法一)
datasegment
No_of_namedb20
No_of_phonedb8
inbufdb20dup(?
outnamedb20dup(?
),'
outphonedb8dup(?
message1db'
pleaseinputname:
'
'
message2db'
pleaseinputatelephonenumber:
message3db'
NAME'
16dup(20h),'
TEL.'
13,10,'
errormessage1db'
youshouldinput8numbers!
errormessage2db'
youinputawrongnumber!
flagdb?
dataends
progsegment
mainprocfar
prog,ds:
data
movax,data
movflag,0
leadx,message1
movah,09
callinput_name
leadx,message2
callinphone
cmpflag,1
je
exit
callprintline
exit:
mainendp
input_nameprocnear
pushdx
pushcx
movcx,0
movcl,No_of_name
callgetchar
movax,0
moval,No_of_name
subax,cx
movcx,ax
moval,inbuf[si]
movoutname[si],al
loopnext1
popcx
popdx
popax
input_nameendp
inphoneprocnear
movcl,No_of_phone
cmpcx,0
jnzerror1
movcl,No_of_phone
cmpal,30h
error2
cmpal,39h
ja
movoutphone[si],al
loopnext2
jmpexit2
error1:
leadx,errormessage1
movflag,1
error2:
leadx,errormessage2
exit2:
inphoneendp
getcharprocnear
movdi,0
rotate:
movah,01
cmpal,0dh
exit1
movinbuf[di],al
incdi
looprotate
exit1:
getcharendp
printlineprocnear
leadx,message3
leadx,outname
movah,09
int21h
leadx,outphone
printlineendp
progends
endmain
从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来
datareasegment
inbuf
label
byte
nameparameterlist:
maxnlen
db