汇编语言第六章答案Word文档下载推荐.docx
《汇编语言第六章答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汇编语言第六章答案Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
(AX)
T_ADDR
0000
(DS)
1000:
0184
:
0186
0188
018A
018C
018E
SP:
题堆栈最满时各单元的地址及内容
MOVSS,AX
MOVSP,OFFSETTOS
PUSHDS
MOVAX,0
┇
PUSHT_ADDR
PUSHF
POPF
POPAX
POPT_ADDR
--------------------------------------------------------------------------
C_SEGENDS;
代码段结束
******************************************
ENDSTART;
程序结束
堆栈最满时各单元的地址及内容如右图所示:
分析下面的程序,写出堆栈最满时各单元的地址及内容。
STACKSEGMENTAT500H;
DW128DUP()
STACKENDS
CODESEGMENT;
MAINPROCFAR;
主程序部分
CODE,SS:
STACK
MOVAX,STACK
SUBAX,AX
MAINPARTOFPROGRAMGOESHERE
MOVAX,4321H
CALLHTOA
MAINENDP;
主程序部分结束
--------------------------------------------------------------------
HTOAPROCNEAR;
HTOA子程序
CMPAX,15
JLEB1
0500:
00EC
00EE
00F0
00F2
00F4
00F6
00F8
00FA
00FC
00FE
返回POPBP地址
0003H
0002H
0001H
主程序返回地址
PUSHBP
MOVBP,SP
MOVBX,[BP+2]
ANDBX,000FH
MOV[BP+2],BX
POPBP
MOVCL,4
SHRAX,CL
B1:
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,7H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
HOTAENDP;
HOTA子程序结束
CODEENDS;
堆栈最满时各单元的地址及内容如右上图所示:
下面是一个程序清单,请在下面的图中填入此程序执行过程中的堆栈变化。
*************************
0000STACKSGSEGMENT
000020[.DW32DUP()
]
0040STACKSGENDS
0000CODESGSEGMENTPARA‘CODE’
--------------------------------------
0000BEGINPROCFAR
CODESG,SS:
STACKSG
00001EPUSHDS
00012BC0SUBAX,AX
000350PUSHAX
0004E80008RCALLB10
0007CBRET
0008BEGINENDP
0008B10PROC
0008E8000CRCALLC10
000BC3RET
000CB10ENDP
000CC10PROC
000CC3RET
000DC10ENDP
000DCODESGENDS
ENDBEGIN
程序执行过程中的堆栈变化如下图所示。
(0016H)
(0018H)
(001AH)
(001CH)
(001EH)
(0020H)
SP:
0007
0020H
001EH
001CH
001AH
000B
0018H
BEGINPUSHDSPUSHAXCALLB10
偏移地址堆栈
写一段子程序SKIPLINES,完成输出空行的功能。
空出的行数在AX寄存器中。
程序如下:
CSEGSEGMENT
SKIPLINESPROCFAR
CSEG
BEGIN:
PUSHCX
PUSHDX
MOVCX,AX
DISP:
MOVDL,0DH;
显示回车换行,即输出空行
MOVAH,2;
显示一个字符的DOS调用
MOVDL,0AH
LOOPDISP
POPDX
POPCX
SKIPLINESENDP
END
设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。
试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。
DSEGSEGMENT
RECORDDW76,69,84,90,73,88,99,63,100,80
S6DW0
S7DW0
S8DW0
S9DW0
S10DW0
DSEGENDS
MAINPROCFAR
CSEG,DS:
DSEG
PUSHDS;
设置返回DOS
MOVAX,DSEG
MOVDS,AX;
给DS赋值
MOVCX,10
CALLCOUNT
┇;
后续程序
MAINENDP
COUNTPROCNEAR;
成绩统计子程序
MOVSI,0
NEXT:
MOVAX,RECORD[SI]
MOVBX,10;
以下5句是根据成绩计算相对S6的地址变化量
DIVBL;
计算公式为:
((成绩)/10-6)*2送(BX)
MOVBL,AL;
此时(BH)保持为0不变
SUBBX,6;
应为只统计60分以上成绩
SALBX,1;
(BX)*2
INCS6[BX];
S6是S6,S7,S8,S9和S10单元的首地址
ADDSI,2
LOOPNEXT
COUNTENDP;
COUNT子程序结束
CSEGENDS;
以上定义代码段
ENDSTART
编写一个有主程序和子程序结构的程序模块。
子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR。
要求在N字节数组中查找字符CHAR,并记录该字符出现的次数。
主程序则要求从键盘接收一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数。
(为简化起见,假设出现次数≤15,可以用16进制形式把它显示出来。
)
TABLEDB255DUP()
NDW255
CHARDB
CHAR_NDB0;
用于记录CHAR出现的次数
CRLFDB0DH,0AH,‘$’
DSEGENDS;
以上定义数据段
STACKSEGMENT
DW100DUP()
STACKENDS;
以上定义堆栈段
DSEG,SS:
MOVSS,AX;
给SS赋值
MOVSP,OFFSETTOS;
给SP赋值
PUSHDS;
MOVBX,0
MOVCX,255;
最多输入255个字符
INPUT:
MOVAH,1;
从键盘接收一个字符的DOS功能调用
CMPAL,0DH;
输入回车符结束输入
JZIN_N
MOVTABLE[BX],AL
INCBX
LOOPINPUT
IN_N:
MOVN,BX;
TABLE数组中的字符个数送N
CALLDISP_CRLF
IN_CHAR:
从键盘接收一个字符并回显的DOS功能调用
输入回车符结束
JZEXIT
MOVCHAR,AL;
输入的字符存入CHAR单元
CALLSEARCH;
调搜索字符子程序
MOVDL,‘:
’;
显示“:
”,在字符CHAR(输入时回显)的后面
显示一个字符
MOVDL,CHAR_N;
再显示CHAR出现的次数(次数≤15)
ANDDL,0FH
ADDDL,30H
CMPDL,39H
JBENEXT
ADDDL,07H;
是A~F
MOVAH,2;
JMPSHORTIN_CHAR
EXIT:
RET
SEARCHPROCNEAR;
搜索字符子程序
MOVCX,N
MOVCHAR_N,0
MOVAL,CHAR
ROTATE:
CMPAL,TABLE[SI]
JNZROTATE1
INCCHAR_N;
搜索到字符,则出现次数+1
ROTATE1:
INCSI
LOOPROTATE
SEARCHENDP;
SEARCH子程序结束
DISP_CRLFPROCNEAR;
显示回车换行符子程序
LEADX,CRLF
MOVAH,09H
DISP_CRLFENDP;
DISP_CRLF子程序结束
编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。
主程序TELIST:
·
显示提示符“INPUTNAME:
”;
调用子程序INPUT_NAME输入姓名;
显示提示符“INPUTATELEPHONENUMBER:
调用子程序INPHONE输入电话号码;
调用子程序PRINTLINE显示姓名及电话号码。
子程序INPUT_NAME:
调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中;
把INBUF中的姓名移入输出行OUTNAME。
子程序INPHONE:
调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中;
把INBUF中的号码移入输出行OUTPHONE。
子程序PRINTLINE:
显示姓名及电话号码,格式为:
NAMETEL.
XXXXXXXXXXX
INBUFDB12DUP(‘’);
输入缓冲区,初始值为空格
OUTNAMEDB16DUP(‘’),;
姓名输出行,初始值为空格
OUTPHONEDB12DUP(‘’),0DH,0AH,‘$’;
号码输出行,初始值为空格
MESG1DB‘INPUTNAME:
’,‘$’
MESG2DB‘INPUTATELEPHONENUMBER:
MESG3DB‘NAME’,12DUP(‘’),‘TEL.’,0DH,0AH,‘$’
TELISTPROCFAR;
主程序TELIST
DSEG,ES:
MOVES,AX;
给ES赋值
LEADX,MESG1
MOVAH,09H;
显示字符串功能调用
CALLINPUT_NAME;
输入姓名
LEADX,MESG2
CALLINPHONE;
输入电话号码
CALLPRINTLINE;
显示姓名及电话号码
TELISTENDP
INPUT_NAMEPROCNEAR;
输入姓名子程序
CALLGETCHAR;
调输入字符子程序输入姓名
LEASI,INBUF;
把INBUF中的姓名移入输出行OUTNAME
LEADI,OUTNAME
MOVCX,12
CLD
REPMOVSB
INPUT_NAMEENDP;
INPUT_NAME子程序结束
INPHONEPROCNEAR;
输入电话号码子程序
调输入字符子程序输入电话号码
把INBUF中的电话号码移入输出行OUTPHONE
LEADI,OUTPHONE
INPHONEENDP;
INPHONE子程序结束
GETCHARPROCNEAR;
键盘输入子程序
MOVAL,20H;
先将INBUF中填满空格字符
LEADI,INBUF
REPSTOSB
MOVCX,12;
向INBUF输入字符
MOVDI,0
输入回车符返回
JZQUIT
MOVINBUF[DI],AL
INCDI
QUIT:
CALLDISP_CRLF
GETCHARENDP;
GETCHAR子程序结束
PRINTLINEPROCNEAR;
显示姓名及电话号码子程序
LEADX,MESG3
LEADX,OUTNAME;
PRINTLINEENDP;
PRINTLINE子程序结束
编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。
主程序BANDO:
把整数字变量VAL1存入堆栈,并调用子程序PAIRS;
子程序PAIRS:
从堆栈中取出VAL1;
调用二进制显示程序OUTBIN显示出与其