《IBMPC汇编语言程序设计》作业答案.docx
《《IBMPC汇编语言程序设计》作业答案.docx》由会员分享,可在线阅读,更多相关《《IBMPC汇编语言程序设计》作业答案.docx(33页珍藏版)》请在冰豆网上搜索。
《IBMPC汇编语言程序设计》作业答案
《IBM—PC汇编语言程序设计》作业参考答案目录
第一次2
第二次2
第三次2
第四次2
第五次3
第六次4
第七次4
第八次5
第九次7
第十次7
第十一次12
第十二次13
第十三次13
第十四次13
第十五次14
第十六次15
第一次
1.1、答:
(3)4095=111111111111B=FFFH
1.2、答:
(1)101101B=2DH=45
1.3、答:
(4)1234H=1001000110100B=4660
1.4、答:
(3)ABCD-FEH=AACFH=43727
1.5、答:
(6)-85-(-76)=10101011B-10110100B=10101011B+01001100B=11110111B=0F7H;CF=0;OF=0
1.6、答:
(1)D8H表示的带符号数为-40,D8H表示的无符号数为216
第二次
2.2、答:
存储器里的存放情况如右上图所示。
2.3、答:
30022H字节单元的内容为ABH;30024H字节单元的内容为EFH。
30021H字单元的内容为AB34H;30022H字单元的内容为CDABH。
2.4、答:
3017:
000A、3015:
002A和3010:
007A的存储单元的物理地址都是3017AH。
2.5、答:
该程序的第一个字的物理地址是0AAA40H。
2.8、答:
BX、BP、SI、DI、堆栈操作时的SP、对应的段地址、386及其后继机型的Exx。
第三次
3.1、答:
(1)操作数在指令中,即立即数;
(2)EA=D=7237H;
(3)无EA,操作数为(BX)=637DH;
(4)EA=(BX)=637DH;
(5)EA=(BX)+D=0D5B4H;
(6)EA=(BX)+(SI)=8E18H;
(7)EA=(BX)+(SI)+D=1004FH;超过段的边界,最高进位丢失,因此EA=004FH。
3.4、答:
(1)(AX)=1200H
(2)(AX)=0100H
(3)(AX)=4C2AH
(4)(AX)=3412H
(5)(AX)=4C2AH
(6)(AX)=7856H
(7)(AX)=65B7H
3.5、答:
(1)JMPNEARPTR5119H;(IP)=5119H+((IP)+03H)=7CDCH,物理地址PA=09CDCH
(IP)+03H是JMPNEARPTR5119H指令的下一条指令的首地址。
(2)JMPWORDPTR[BX];(IP)=((DS)*10H+(BX))=0600H,PA=02600H
(3)JMPD[BX];(IP)=((DS)*10H+(BX)+D)=098AH,PA=0298AH
第四次
3.10、答:
MOVAX,TABLE是将TABLE单元的内容送到AX,(AX)=1234H
LEAAX,TABLE是将TABLE单元的有效地址送到AX,(AX)=0032H
3.11、答:
(AX)=1E00H
3.17、答:
以下程序都未考虑带符号数的溢出
(1)Z←W+(Z-X)
MOVAX,Z
SUBAX,X
ADDAX,W
MOVZ,AX
(2)Z←W-(X+6)-(R+9)
MOVBX,X
ADDBX,6
MOVCX,R
ADDCR,9
MOVAX,W
SUBAX,BX
SUBAX,CX
MOVZ,AX
(3)Z←(W*X)/(Y+6),R←余数
ADDY,6
MOVAX,W
IMULX
IDIVY
MOVZ,AX
MOVR,DX
(4)Z←((W-X)/5*Y)*2
MOVAX,W
SUBAX,X
CWD
MOVBX,5
IDIVBX
IMULY
SHLAX,1;((DX),(AX))*2
RCLDX,1
3.19、下列程序段中的每条指令执行完后,AX寄存器及CF、SF、ZF和OF的内容是什么?
MOVAX,0;(AX)=0,标志位不变
DECAX;(AX)=0FFFFH,CF不变,SF=1,ZF=0,OF=0
ADDAX,7FFFH;(AX)=7FFEH,CF=1,SF=0,ZF=0,OF=0
ADDAX,2;(AX)=8000H,CF=0,SF=1,ZF=0,OF=1
NOTAX;(AX)=7FFFH,标志位不变
SUBAX,0FFFFH;(AX)=8000H,CF=1,SF=1,ZF=0,OF=1
ADDAX,8000H;(AX)=0,CF=1,SF=0,ZF=1,OF=1
SUBAX,1;(AX)=0FFFFH,CF=1,SF=1,ZF=0,OF=0
ANDAX,58D1H;(AX)=58D1H,CF=0,SF=0,ZF=0,OF=0
SALAX,1;(AX)=0B1A2H,CF=0,SF=1,ZF=0,OF=1
SARAX,1;(AX)=0D8D1H,CF=0,SF=1,ZF=0,OF=0
NEGAX;(AX)=272FH,CF=1,SF=0,ZF=0,OF=0
RORAX,1;(AX)=9397H,CF=1,SF和ZF不变,OF=1
答:
见注释。
第五次
3.26、答:
本程序段将((DX),(AX))的双字同时左移4位,即将此双字乘以10H(16)。
3.27、答:
见注释。
(1)SHRDX,1;(DX)=05CH
(2)SARDX,CL;(DX)=17H
(3)SHLDX,CL;(DX)=5C8H
(4)SHLDL,1;(DX)=72H
(5)RORDX,CL;(DX)=2017H
(6)ROLDL,CL;(DX)=0CDH
(7)SALDH,1;(DX)=0B9H
(8)RCLDX,CL;(DX)=2CCH
(4)RCRDL,1;(DX)=0DCH
3.30、答:
程序段如下:
MOVCX,18
MOVAL,‘&’
CLD
MOVDI,SEGSTRING
MOVES,DI
LEADI,STRING
REPNESCASB
JNENEXT
DECDI
MOVES:
BYTEPTR[DI],‘’;送空格
NEXT:
┇
第六次
3.34、答:
(1)转向L1
(2)转向L1
(3)转向L2
(4)转向L5;因为加法指令后AX中已经是6FF3H
(5)转向L5;因为加法指令后AX中已经是4A14H
3.35、答:
(1)JNB、JBE、JNL、JLE
(2)JNB、JBE、JNL、JLE
(3)JNB、JNBE、JL、JLE
(4)JNB、JNBE、JNL、JNLE
(5)JNB、JNBE、JL、JLE
(6)JB、JBE、JL、JLE
(7)JB、JBE、JNL、JNLE
(8)JNB、JNBE、JL、JLE
3.38、答:
(1)(AX)=5H,(BX)=10H,(CX)=0H,(DX)=0H
(2)(AX)=2H,(BX)=4H,(CX)=3H,(DX)=1H
(3)(AX)=3H,(BX)=7H,(CX)=2H,(DX)=0H
3.51、答:
JMPBEGIN
UPDB0
DOWNDB0
TABLEDB100HDUP(?
)
BEGIN:
MOVCX,100H
MOVBX,-1
MOVSI,0
MOVDI,0
L1:
INCBX
CMPTABLE[BX],42H
JAL2
JBL3
JMPL4
L2:
INCSI
JMPL4
L3:
INCDI
L4:
LOOPL1
MOVUP,SI
MOVDOWN,DI
第七次
4.3、假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列哪些指令是非法的?
它们的错误是什么?
(1)MOVBP,AL;错,寄存器类型不匹配
(2)MOVWORD_OP[BX+4*3][DI],SP
(3)MOVWORD_OP1,WORD_OP2;错,不能都是存储器操作数
(4)MOVAX,WORD_OP1[DX];错,DX不能用于存储器寻址
(5)MOVSAVE_WORD,DS
(6)MOVSP,SS:
DATA_WORD[BX][SI]
(7)MOV[BX][SI],2;错,[BX][SI]未指出数据类型
(8)MOVAX,WORD_OP1+WORD_OP2
(9)MOVAX,WORD_OP1-WORD_OP2+100
(10)MOVWORD_OP1,WORD_OP1-WORD_OP2
答:
见注释。
4.12、给出等值语句如下:
ALPHAEQU100
BETAEQU25
GAMMAEQU2
下列表达式的值是多少?
(1)ALPHA*100+BETA;=2729H
(2)ALPHAMODGAMMA+BETA;=19H
(3)(ALPHA+2)*BETA–2;=9F4H
(4)(BETA/3)MOD5;=3H
(5)(ALPHA+3)*(BETAMODGAMMA);=67H
(6)ALPHAGEGAMMA;=0FFFFH
(7)BETAAND7;=01H
(8)GAMMAOR3;=03H
答:
见注释。
4.14、对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?
FLDBDB?
TABLEADW20DUP(?
)
TABLEBDB‘ABCD’
(1)MOVAX,TYPEFLDB;(AX)=0001H
(2)MOVAX,TYPETABLEA;(AX)=0002H
(3)MOVCX,LENGTHTABLEA;(CX)=0014H
(4)MOVDX,SIZETABLEA;(DX)=0028H
(5)MOVCX,LENGTHTABLEB;(CX)=0001H
答:
见注释。
4.17、答:
程序如下:
D_SEGSEGMENT
AUGWLABELWORD
AUGENDDD99251
SUMDD?
D_SEGENDS;以上定义数据段
;----------------------------------------------------------------
E_SEGSEGMENT
ADDWLABELWORD
ADDENDDD-15962
E_SEGENDS;以上定义附加段
;----------------------------------------------------------------
C_SEGSEGMENT
MAINPROCFAR
ASSUMECS:
C_SEG,DS:
D_SEG,ES:
E_SEG
START:
PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,D_SEG
MOVDS,AX;给DS赋值
MOVAX,E_SEG
MOVES,AX;给ES赋值
MOVAX,AUGW;以下6条指令进行加法计算
MOVBX,AUGW+2
ADDAX,ES:
ADDW
ADCBX,ES:
ADDW+2;不考虑有符号数溢出
MOVWORDPTRSUM,AX
MOVWORDPTR[SUM+2],BX
RET
MAINENDP
C_SEGENDS;以上定义代码段
;----------------------------------------------------------------
ENDSTART
第八次
5.1、答:
程序段如下:
BEGIN:
MOVAH,1;从键盘输入一个字符
INT21H
CMPAL,‘a’;输入字符<‘a’吗?
JBSTOP
CMPAL,‘z’;输入字符>‘z’吗?
JASTOP
SUBAL,20H;转换为大写字母,
;用ANDAL,11011111B也可
MOVDL,AL;显示一个字符
MOVAH,2
INT21H
JMPBEGIN
STOP:
RET
5.3、答:
程序段如下:
DSEGSEGMENT
STOREDB4DUP(?
)
DSEGENDS
┇
BEGIN:
MOVCL,4;右移四次
MOVCH,4;循环四次
LEABX,STORE
A10:
MOVDX,AX
ANDDX,0FH;取AX的低四位
MOV[BX],DL;低四位存入STORE中
INCBX
SHRAX,CL;右移四次
DECCH
JNZA10;循环四次完了码?
B10:
MOVDL,STORE;四组数分别放在AL、BL、CL和DL中
MOVCL,STORE+1
MOVBL,STORE+2
MOVAL,STORE+3
STOP:
RET
5.9、答:
程序段如下:
BEGIN:
MOVBX,0;用于存放四位的16进制数
MOVCH,4
MOVCL,4
INPUT:
SHLBX,CL;将前面输入的数左移4位
MOVAH,1;从键盘取数
INT21H
CMPAL,30H;<0吗?
JBINPUT;不是‘0~F’的数重新输入
CMPAL,39H;是‘0~9’吗?
JAAF;不是,转‘A~F’的处理
ANDAL,0FH;转换为:
0000B~1001B
JMPBINARY
AF:
ANDAL,11011111B;转换为大写字母
CMPAL,41H;又JBINPUT;不是‘A~F’的数重新输入
CMPAL,46H;>F吗?
JAINPUT;不是‘A~F’的数重新输入
ANDAL,0FH;转换为:
1010B~1111B
ADDAL,9
BINARY:
ORBL,AL;将键盘输入的数进行组合
DELCH
JNZINPUT
DISPN:
MOVCX,16;将16位二进制数一位位地转换成ASCII码显示
DISP:
MOVDL,0
ROLBX,1
RCLDL,1
ORDL,30H
MOVAH,2;进行显示
INT21H
LOOPDISP
STOP:
RET
第九次
6.3、答:
堆栈最满时各单元的地址及内容如右图所示:
6.5、答:
程序执行过程中的堆栈变化如下图所示。
第十次
6.9、答:
程序如下:
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
6.15、答:
(1)主程序和COMPUTE在同一代码段中的程序如下:
TITLEADDITION;主程序
;--------------------------------------------------------------
D_SEGSEGMENTPARA‘DATA’
COUNTEQU10H
XDWCOUNTDUP(?
)
YDWCOUNTDUP(?
)
D_SEGENDS
;--------------------------------------------------------------
E_SEGSEGMENTPARA‘DATA’
RDWCOUNTDUP(?
)
E_SEGENDS
;--------------------------------------------------------------
C_SEGSEGMENTPARA‘CODE’
ADDITIONPROCFAR
ASSUMECS:
C_SEG,DS:
D_SEG,ES:
E_SEG
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,D_SEG
MOVDS,AX
MOVAX,E_SEG
MOVES,AX
CALLCOMPUTE;调用求和子程序
RET
ADDITIONENDP
;*******