汇编语言第六章答案.docx
- 文档编号:7740113
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:31
- 大小:20.37KB
汇编语言第六章答案.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的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。
试画出示意图说明堆栈及SP内容的变化过程。
答:
变化过程如右图所示:
分析下面的程序,画出堆栈最满时各单元的地址及内容。
;********************************************
S_SEGSEGMENTAT1000H;定义堆栈段
DW200DUP();200*2=190H
~
TOSLABELWORD
S_SEGENDS
;********************************************
C_SEGSEGMENT;定义代码段
ASSUMECS:
C_SEG,SS:
S_SEG
START:
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
┇
PUSHT_ADDR
PUSHAX
PUSHF
┇
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;主程序部分结束
;--------------------------------------------------------------------
HTOAPROCNEAR;HTOA子程序
CMPAX,15
JLEB1
!
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
0008E8000CRCALLC10
;--------------------------------------
000BC3RET
000CB10ENDP
《
;--------------------------------------
000CC10PROC
;--------------------------------------
000CC3RET
000DC10ENDP
;--------------------------------------
000DCODESGENDS
;*************************
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
001EH
001CH
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
-
S6DW0
S7DW0
S8DW0
S9DW0
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及字符CHAR。
要求在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:
STACK
START:
MOVAX,STACK
MOVSS,AX;给SS赋值
MOVSP,OFFSETTOS;给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
SEARCHENDP;SEARCH子程序结束
;--------------------------------------------------------------------------
&
DISP_CRLFPROCNEAR;显示回车换行符子程序
LEADX,CRLF
MOVAH,09H
INT21H
RET
DISP_CRLFENDP;DISP_CRLF子程序结束
;--------------------------------------------------------------------------
CSEGENDS;以上定义代码段
;******************************************
ENDSTART
^
编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。
主程序TELIST:
·显示提示符“INPUTNAME:
”;
·调用子程序INPUT_NAME输入姓名;
·显示提示符“INPUTATELEPHONENUMBER:
”;
·调用子程序INPHONE输入电话号码;
·调用子程序PRINTLINE显示姓名及电话号码。
子程序INPUT_NAME:
·调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中;
·把INBUF中的姓名移入输出行OUTNAME。
【
子程序INPHONE:
·调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中;
·把INBUF中的号码移入输出行OUTPHONE。
子程序PRINTLINE:
显示姓名及电话号码,格式为:
NAMETEL.
XXXXXXXXXXX
答:
程序如下:
DSEGSEGMENT
INBUFDB12DUP(‘’);输入缓冲区,初始值为空格
、
OUTNAMEDB16DUP(‘’),;姓名输出行,初始值为空格
OUTPHONEDB12DUP(‘’),0DH,0AH,‘$’;号码输出行,初始值为空格
MESG1DB‘INPUTNAME:
’,‘$’
MESG2DB‘INPUTATELEPHONENUMBER:
’,‘$’
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赋值
MOVSP,OFFSETTOS;给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_CRLFENDP;DISP_CRLF子程序结束
;--------------------------------------------------------------------------
CSEGENDS;以上定义代码段
;*************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 第六 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)