汇编语言第六章答案.docx
- 文档编号:3658978
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:28
- 大小:20KB
汇编语言第六章答案.docx
《汇编语言第六章答案.docx》由会员分享,可在线阅读,更多相关《汇编语言第六章答案.docx(28页珍藏版)》请在冰豆网上搜索。
汇编语言第六章答案
下面的程序段有错吗若有,请指出错误。
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;以上定义代码段
;******************************************
ENDSTART
编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。
主程序BANDO:
把整数字变量VAL1存入堆栈,并调用子程序PAIRS;
子程序PAIRS:
从堆栈中取出VAL1;调用二进制显示程序OUTBIN显示出与其
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 第六 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)