汇编语言第六章答案.docx
- 文档编号:28576564
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:31
- 大小:21.86KB
汇编语言第六章答案.docx
《汇编语言第六章答案.docx》由会员分享,可在线阅读,更多相关《汇编语言第六章答案.docx(31页珍藏版)》请在冰豆网上搜索。
汇编语言第六章答案
下面的程序段有错吗若有,请指出错误。
CRAYPROC
PUSHAX
ADDAX,BX
RET
ENDPCRAY
答:
程序有错。
改正如下:
CRAYPROC
ADDAX,BX
RET
CRAYENDP;CRAY是过程名,应放在ENDP的前面
9BH
F7H
57H
80H
F0A0:
00B0H
先PUSH,SP-2
再PUSH,SP-2
POP,SP+2
题堆栈及SP内容的变化过程
已知堆栈寄存器SS的内容是OFOAOH,堆栈指示器SP的内容是OOBOH,先执行两条把8057H和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。
试画出示意图说明堆栈及SP内容的变化过程。
答:
变化过程如右图所示:
分析下面的程序,画出堆栈最满时各单元的地址及内容。
.********************************************
;
S_SEGSEGMENTAT1000H定义堆栈段
DW200DUP();200*2=190H
TOSLABELWORD
S_SEGENDS
.********************************************
C_SEGSEGMENT定义代码段
ASSUMECS:
C_SEG,SS:
S_SEGSTART:
MOVAX,S_SEG
(FLAGS)
(AX)
T_ADDR
0000
(DS)1000:
0184
:
0186
:
0188
:
018A
:
018C
:
018E
SP:
0186
题堆栈最满时各单元的地址及内容
MOVSS,AX
MOVSP,OFFSETTOS
PUSHDS
MOVAX,0
PUSHAX
I
I
I
PUSHT_ADDR
PUSHAX
PUSHF
I
I
I
POPF
POPAX
POPT_ADDR
RET
C_SEGENDS;代码段结束
.******************************************
;
ENDSTART;程序结束
答:
堆栈最满时各单元的地址及内容如右图所示:
分析下面的程序,写出堆栈最满时各单元的地址及内容。
.********************************************
;
STACKSEGMENTAT500H定义堆栈段
DW128DUP()
TOSLABELWORD
STACKENDS
.********************************************
CODESEGMENT;定义代码段
MAINPROCFAR;主程序部分
ASSUMECS:
CODE,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOS
PUSHDS
SUBAX,AX
PUSHAX
;MAINPARTOFPROGRAMGOESHERE
MOVAX,4321H
CALLHTOA
RET
MAINENDP;主程序部分结束
HTOAPROCNEARHTOA子程序
CMPAX,15JLEB1
PUSHAX
0500:
00EC
:
00EE
:
00F0
:
00F2
:
00F4
:
00F6
:
00F8
:
00FA
:
00FC
:
00FE
SP:
00EE
返回POPBP地址
0003H
返回POPBP地址
0002H
返回POPBP地址
0001H主程序返回地址
0000
(DS)
题堆栈最满时各单元的地址及内容
PUSHBP
MOVBP,SP
MOVBX,[BP+2]
ANDBX,000FH
MOV[BP+2],BX
POPBP
MOVCL,4
SHRAX,CL
CALLHTOA
POPBP
B1:
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,7H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
RET
HOTAENDP;HOTA子程序结束
;
CODEENDS;代码段结束
.******************************************
;
ENDSTART;程序结束答:
堆栈最满时各单元的地址及内容如右上图所示:
下面是一个程序清单,请在下面的图中填入此程序执行过程中的堆栈变化。
.*************************
;
0000STACKSGSEGMENT
000020[.DW32DUP()
]
0040STACKSGENDS
.*************************
;
0000CODESGSEGMENTPARA‘CODE'
;
0000BEGINPROCFAR
ASSUMECS:
CODESG,SS:
STACKSG
00001EPUSHDS
00012BC0SUBAX,AX
000350PUSHAX
0004E80008RCALLB10
;
0007CBRET
0008BEGINENDP
;
0008B10PROC
0008E8000CRCALLC10000BC3RET
000CB10ENDP000CC10PROC000CC3RET
000DC10ENDP000DCODESGENDS
.*************************
ENDBEGIN答:
程序执行过程中的堆栈变化如下图所示。
(0016H)
(0018H)
(001AH)
(001CH)
(001EH)
(0020H)
SP:
(DS)
(0016H)
(0018H)
(001AH)
(001CH)
(001EH)
(0020H)
0000
(DS)
(0016H)
(0018H)
(001AH)
(001CH)
(001EH)
(0020H)
0007
0000
(DS)0020H
001EH001CH
001AH(0016H)
(0018H)
(001AH)
(001CH)
(001EH)(0020H)
000B
0007
0000(DS)(0016H)
(0018H)
(001AH)
(001CH)
(001EH)(0020H)SP:
000B
0007
0000(DS)(0016H)
(0018H)
(001AH)
(001CH)
(001EH)
(0020H)
000B
0007
0000(DS)(0016H)
(0018H)
(001AH)
(001CH)
(001EH)(0020H)
000B
0007
0000
(DS)
0018H
001AH
001CH
0020H
(0016H)
(0018H)
(001AH)
(001CH)
(001EH)
(0020H)
BEGINPUSHDSPUSHAXCALLB10
偏移地址堆栈
写一段子程序SKIPLINES完成输出空行的功能。
空出的行数在AX寄存器中。
答:
程序如下:
CSEGSEGMENT
SKIPLINESPROCFAR
ASSUMECS:
CSEG
BEGIN:
PUSHCX
PUSHDX
MOVCX,AX
DISP:
MOVDL,0DH;显示回车换行,即输出空行
MOVAH,2;显示一个字符的DOS调用
INT21H
MOVDL,0AH
MOVAH,2;显示一个字符的DOS调用
INT21H
LOOPDISP
POPDX
POPCX
RET
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
56DW0
57DW0
58DW0
59DW0
S10DW0
DSEGENDS
.******************************************
;
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG,DS:
DSEG
START:
PUSHDS设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:
MOVCX,10
CALLCOUNT
:
;后续程序
RET
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
RET
COUNTENDP;COUNT子程序结束
CSEGENDS;以上定义代码段
.******************************************
;
ENDSTART
编写一个有主程序和子程序结构的程序模块。
子程序的参数是一个N字节数组的首地址
TABLE数N及字符CHAF。
要求在N字节数组中查找字符CHAR,并记录该字符出现的次数。
主程序则要求从键盘接收一串字符以建立字节数组TABLE并逐个显示从键盘输入的每个字
符CHAR以及它在TABLE数组中出现的次数。
(为简化起见,假设出现次数<15可以用16进制形式把它显示出来。
)答:
程序如下:
DSEGSEGMENT
TABLEDB255DUP()
NDW255
CHARDB
CHAR_NDB0;用于记录CHAR出现的次数CRLFDB0DH,0AH,‘$'
DSEGENDS;以上定义数据段
.******************************************
;
STACKSEGMENT
DW100DUP()
TOSLABELWORD
STACKENDS以上定义堆栈段
.******************************************
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG,DS:
DSEG,SS:
STACKSTART:
MOVAX,STACK
MOVSS,AX;给SS赋值
MOVSROFFSETTOS给SP赋值
PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:
MOVBX,0
MOVCX,255;最多输入255个字符
INPUT:
MOVAH,1;从键盘接收一个字符的DOS功能调用
INT21H
CMPAL,0DH;输入回车符结束输入
JZIN_N
MOVTABLE[BX],AL
INCBX
LOOPINPUT
IN_N:
MOVN,BX;TABLE数组中的字符个数送N
CALLDISP_CRLF
IN_CHAR:
MOVAH,1;从键盘接收一个字符并回显的DOS功能调用
INT21H
CMPAL,0DH;输入回车符结束
JZEXIT
MOVCHAR,AL;输入的字符存入CHAR单元
CALLSEARCH调搜索字符子程序
MOVDL,显示“,在字符CHAR输入时回显)的后面
MOVAH,2;显示一个字符
INT21H
MOVDL,CHAR_N;再显示CHAR出现的次数(次数<15)
ANDDL,0FH
ADDDL,30H
CMPDL,39H
JBENEXT
ADDDL,07H;是A~F
NEXT:
MOVAH,2;显示一个字符
INT21H
CALLDISP_CRLF
JMPSHORTIN_CHAR
EXIT:
RET
MAINENDP
SEARCHPROCNEAR搜索字符子程序
MOVSI,0
MOVCX,N
MOVCHAR_N,0
MOVAL,CHAR
ROTATE:
CMPAL,TABLE[SI]
JNZROTATE1
INCCHAR_N;搜索到字符,则出现次数+1
ROTATE1:
INCSI
LOOPROTATE
RET
SEARCHENDPSEARCH子程序结束
DISP_CRLFPROCNEAR显示回车换行符子程序LEADX,CRLF
MOVAH,09H
INT21H
RET
DISP_CRLFENDPDISP_CRL子程序结束
CSEGENDS;以上定义代码段
.******************************************
ENDSTART
并以一
编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,定的格式显示出来。
主程序TELIST:
•显示提示符“INPUTNAME”;
•调用子程序INPUT_NAME输入姓名;
•显示提示符“INPUTATELEPHONENUMBER;
•调用子程序INPHONE输入电话号码;
•调用子程序PRINTLINE显示姓名及电话号码。
子程序INPUT_NAMEE
•调用键盘输入子程序GETCHAR把输入的姓名存放在INBUF缓冲区中;
•把INBUF中的姓名移入输出行OUTNAMEo
子程序INPHONEE
•调用键盘输入子程序GETCHAR把输入的8位电话号码存放在INBUF缓冲区中;
•把INBUF中的号码移入输出行OUTPHONE
子程序PRINTLINEE
显示姓名及电话号码,格式为:
NAMETEL.
XXXXXXXXXXX
答:
程序如下:
DSEGSEGMENT
INBUFDB12DUP(‘;输'入)缓冲区,初始值为空格
OUTNAMEDB16DUP(‘;'姓)名,输出行,初始值为空格
OUTPHONEDB12DUP(‘'),0DH,0AH号码输出行,初始值为空格
MESG1DB‘INPUTNAM:
E',‘$'
MESG2DB‘INPUTATELEPHONENUM:
BE'R,‘$'
MESG3DB‘NAME',12DUP(‘'),‘TEL.',0DH,0AH,‘$'
CRLFDB0DH,0AH,‘$'
DSEGENDS;以上定义数据段
.******************************************
;
STACKSEGMENT
DW100DUP()
TOSLABELWORD
STACKENDS以上定义堆栈段
.******************************************
>
CSEGSEGMENT
TELISTPROCFAR主程序TELIST
ASSUMECS:
CSEG,DS:
DSEG,ES:
DSEG,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX;给SS赋值
MOVSROFFSETTOS给SP赋值
PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
MOVES,AX;给ES赋值
BEGIN:
LEADX,MESG1
MOVAH,09H;显示字符串功能调用
INT21H
CALLINPUT_NAME;输入姓名
LEADX,MESG2
MOVAH,09H;显示字符串功能调用
INT21H
CALLINPHONE;输入电话号码
CALLPRINTLINE;显示姓名及电话号码
RET
TELISTENDP
INPUT_NAMEPROCNEAR;输入姓名子程序
CALLGETCHAR;调输入字符子程序输入姓名
LEASI,INBUF;把INBUF中的姓名移入输出行OUTNAME
LEADI,OUTNAME
MOVCX,12
CLD
REPMOVSB
RET
INPUT_NAMEENDP;INPUT_NAME子程序结束
INPHONEPROCNEAR输入电话号码子程序
CALLGETCHAR;调输入字符子程序输入电话号码
LEASI,INBUF;把INBUF中的电话号码移入输出行OUTPHONE
LEADI,OUTPHONE
MOVCX,12
CLD
REPMOVSB
RET
INPHONEENDP;INPHONE子程序结束
GETCHARPROCNEAR键盘输入子程序
MOVAL,20H;先将INBUF中填满空格字符
MOVCX,12
LEADI,INBUF
CLD
REPSTOSB
MOVCX,12;向INBUF输入字符
MOVDI,0
INPUT:
MOVAH,1;从键盘接收一个字符并回显的DOS功能调用
INT21H
CMPAL,0DH;输入回车符返回
JZQUIT
MOVINBUF[DI],AL
INCDI
LOOPINPUT
QUIT:
CALLDISP_CRLF
RET
GETCHARENDP;GETCHAR子程序结束
PRINTLINEPROCNEAR显示姓名及电话号码子程序
LEADX,MESG3
MOVAH,09H;显示字符串功能调用
INT21H
LEADX,OUTNAME;显示姓名及电话号码
MOVAH,09H;显示字符串功能调用
INT21H
RET
PRINTLINEENDP;PRINTLINE子程序结束
DISP_CRLFPROCNEAR显示回车换行符子程序LEADX,CRLF
MOVAH,09H
INT21H
RET
DISP_CRLFENDPDISP_CRL子程序结束
CSEGENDS;以上定义代码段
.******************************************
;
ENDSTART编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。
主程序BANDO:
把整数字变量VAL1存入堆栈,并调用子程序PAIRS
子程序PAIRS从堆栈中取出VAL1;调用二进制显示程序OUTBIN显示出与其等效的二进制数;输出8个空格;调用八进制显示程序OUTOCT显示出与其等效的八进制数;调用输出回
车及换行符子程序。
答:
程序如下:
DSEGSEGMENT
VAL1DW
CRLFDB0DH,0AH,‘$'
DSEGENDS;以上定义数据段
.******************************************
CSEGSEGMENT
BANDOPROCFAR主程序BANDO
ASSUMECS:
CSEG,DS:
DSEG
START:
PUSHDS设置返回DOS
SUBAX,AXPUSHAXMOVAX,DSEG
MOVDS,AX;给DS赋值
PUSHVAL1
CALLPAIRS
RET
BANDOENDP
PAIRSPROCNEARPAIRS子程序
PUSHBP
MOVBP,SP
PUSHBX
MOVBX,[BP+4];从堆栈中取出VAL1CALLOUTBIN;调用二进制显示子程序
MOVCX,8;显示8个空格符
SPACE:
MOVDL,‘'
MOVAH,2
INT21H
LOOPSPACE
CALLOUTOCT;调用八进制显示子程序
CALLDISP_CRLF
POPBX
POPBP
RET2
PAIRSENDP;PAIRS?
程序结束
OUTBINPROCNEAR;二进制显示子程序
PUSHBX
MOVCX,16
ONEBIT:
ROLBX,1
MOVDX,BX
ANDDX,1
ORDL,30H;转换为ASCII码
MOVAH,2
INT21H
LOOPONEBIT
POPBX
RET
OUTBINENDP;OUTBIN子程序结束
OUTOCTPROCNEAR八进制显示子程序
ROLBX,1;16位二进制数包含6位八进制数,最高位仅1位MOVDX,BX
ANDDX,1
ORDL,30H;转换为ASCII码
MOVAH,2
INT21H
MOVCX,5;余下还有5位八进制数
NEXT:
PUSHCX
MOVCL,3;1位八进制数包含3位二进制数
ROLBX,CL
MOVDX,BX
ANDDX,07H
ORDL,30H;转换为ASCII码
MOVAH,2
INT21H
POPCX
LOOPNEXT
RET
OUTOCTENDP;OUTOCT子程序结束
DISP_CRLFPROCNEAR显示回车换行符子程序LEADX,CRLF
MOVAH,09H
INT21H
RET
DISP_CRLFENDPDISP_CRL子程序结束
CSEGENDS;以上定义代码段
***********************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 第六 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)