微计算机原理(第2版)第四章课后习题答案--潘名莲-马争-丁庆生-编著.docx
第四章 汇编语言程序设计4-1汇编语言程序设计的几个步骤是:解:编写汇编语言程序的过程根本上与编写高级语言程序的过程是相同的。(1)从实际问题抽象出数学模型;(2)确定解决该数学模型的方法,选择最正确算法;(3)画出流程图,根据算法把解决问题的思路和方法用图形表示出来;(4)分配内存工作单元和存放器;(5)根据流程图编制程序;(6)上机调试,检测和排错。4-2计算以下表达式的值(A1=5OH, B 1=20, Gl=2)。(1) A1*JOO+B1 (2) Al MODG1+B1 (3) (Al+2) *Bl-2 4) B1/3MOD5(2) (5) (AI+3 ) * (Bl MODGl) (6) Al GTGl (7) Bl AND7(8) BlSHL2+G1SHR 1解:(1) 5020 20 (3) 1038 (4) 1(5) 0 (6) OFFFFH (7) 04H(8) 51H 4-3数据段定义如下,设该段从03000H开始。DSEG SEGMENTARRAYl DB 2 DUP (0, I, ?)ARRAY2 DW 100 DUP (?)FHZ EQU 20HARRAY3 DB 10 DUP (0, 1, 4 DUP(2), 5)DSEG ENDS试用分析运算符 OFFSET、SEGLENGTH. TYPE、SIZE 求出 ARRY1、ARRY2. ARRY3 的段、偏 移量和类型,以及它们的LENGTH SIZE解:变量名OFFSETSEGTYPELENGTHSIZEARRYl00300H122(2×1)ARRY206H0300H2100200( 100× 2)ARRY3206=0CEH0300H1IO10(10×l)4-4 (略)4-5以下语句汇编后,变量CON1, CoN2和CoN3的内容分别是多少?Nl = IOCONl00CON2FF00CON3FFN2=5N3=3CONl DB (NI AND N2 OR N3) GE OFHC0N2 DW (N2 AND N1 XOR N3) LE OFHC0N3 DB (NI MOD N3) LT (N2 SHR1) 解:如下图4-6设有一个已定义的数据段如下:DATA SEGMENTVARlDB9 9VAR2DB9 9, ADRDWVARI,VAR2DATAENDS假设要使ADR+2的字单元中存放内容为“0022H”,上述空白处应填入什么语句?解:ORG 0020H4-7下述程序段执行后,存放器CX, Sl的内容是多少?ARRY DW 20 DUP (5)XOR AX, AXMOV CX, LENGTH ARRYMOV SI, SIZE ARRY-TYPE解: (CX) =14H (SI) =26H4-8试定义一个结构,它应包括一个学生的以下信息:姓名、学号、及3门课程的成绩。然后给出3 条机构预置语句,将3个学生的情况送入3个结构变量中。解:STUD STRUC;定义一个结构,结构名为STUDNAMEl DB ";姓名字段NUM DB?;学号字段SCOR DB 3 DUP (?);三门课程成绩字段STUD ENDSDATA SEGMENT;在数据段中通过三个结构变量引用,并赋值STUDl STUD <,ZHU MEING 3, 88, 79,91>;结构变量名 STUDlSTUD2 STUD <,ZHANG XING, 15,78, 83, 77> ;结构变量名 STUD2STUD3 STUD <,WANG YAN 12, 91,92,93>;结构变量名 STUD3DATA ENDS4-9试定义一条宏指令,它可以实现任一数据块的传送假设无地址重叠),其源地址、目的地址和块 长度作为参数处理。解:根据要求,子程序的入口参数有:源数据区和目的数据区的首址以及数据块的大小(包含的字节数)。 假设参数传递采用固定内存单元传递方式。SADR源数据区首地址;DADR目的数据区首地址;SLENG一一数据块长度。程序如下:SMOVE MACRO SADR, DADR, SLENG ASSUME CS; CODE LDS SLSADR LES DL DADR MOV CX, SLENG CLDCMP SI, DI JA MOVE STDADD SL CX DEC SIADD DI, CXDEC DIMOVE: MOVSB LOOP MOVE RET ENDM4-10设VARl和VAR2为字变量,LAB为标号,试判断以下指令的正误,并改正:(I)ADD VARl VA2(2)JNZ VARl(3)SUB AL, VARl(4)JMP NEAR LAB(5)JMP LABSI(6)MOV AL, VAR2解:(1)错,ADD的两个操作数不能同时为存储单元。改:MOV AX, VARlADD AX, VAR2错,JCC后面应该是标号,不应该是变量改:JNZ LAB错,两个操作数不匹配改:SUB AX, VARl(4)错,缺少PTR运算符改:JMP NEAR PTR LAB(5)错,LAB与SI不能相加改:JMP FARPTRLAB 或者 JMP WORD PTR SI(6)错,操作数类型不匹配改:MOV AX, VAR24-11数据定义如下,问LI和L298等于多少?Bl DB 1, 2, 3, '123'B2 DBOLl EQU $BlL2 EQU B2Bl解:Ll=$B 1=70=7,L2=B2-Bl=6-0=64-12对于以下数据定义,指出以下指令的错误。Al DB ?A2 DB 10Kl EQU 1024(I)MOV Kl, AX(2) MOV Al, AX(3) MOV BX, AlMOV BX, 1000(4) CMP Al, A2(5) Kl EQU 2048解:(I)KI为名称,表示一立即数,不能做为目的操作数。(2) Al为字节型,类型不匹配(3)类型不匹配(4)源和目的操作数不能同为存储器操作数(5)对己经被EQU定义的Kl,在本程序段不能二次定义4-13试编程计算Z=5X+3Y+10.X, Y均放在数据段,其值由编程者自定。结果Z仍放在数据段。 解:DATASEGMENTXDB10YDB5ZDW?DATA ENDSSTACK SEGMENT PARA STACK 'STACK'STACKCODEDW 20H DUP (0)ENDSSEGMENTASSUME CS:CODE, DS:DATA, SS: STACKMAINPROC FARPUSHDSMOVAX,0PUSHAXSTART: MOVAX, DATAMOVDS, AXMOVAL, XMOVBL, YMULBL;X*5MOVDX, AX;转存至DXMOVAL, YMOVBL, 3MULBL;Y*3,积在AX中ADDAL, OAHADDAX, DXMOVZ,AX;结果仍放数据段RETMAIN ENDPCODE ENDSEND START 4-14 (略)4-15用查表法将存放于数据段中一个有序的十六进制数串(范围:OFH)翻译成ASSil码表仍放于数据段中.解:DATA SEGMENTTAB DB 30H,31H, 32H,36H, 37H DB 38H,39H, 41H, ,45H, 46HHEX DB 6ASC DB ?DATA ENDSSTACKl SEGMENT PARA tATACK, DW 2OH DUP (O)STACKl ENDS CODE SEGMENTASSUME CSiCODE, DSiDATA, SS: STACKlBEGIN: MOVAX, DATAMOVDS, AXMOVBX, OFFSETTAB ;设置ASCll码表的基地址在BX中XORAX, AXMOVAL, HEX;要查找的一位十六进制数在AL中ADDBX, AX;基址+偏移置即可计算出该十六进制数ASCII码存放地址MOVAU BX;该地址单元的内容即为要查找的ASCn码MOVASC, AL;存放ASCn码至ASC字节单元MOVAH, 4CHINT 21HCODE ENDSENDBEGIN4-16试编写一程序,把X和Y中的大者存入BIG单元。假设X=Y,那么把其中之一存入BIG单元。 解: DATA SEGMENT X DW 1028 Y DW 1446 BIG DW ? DATA ENDS CODE SEGMENTASSUME CS: CODE, DS: DATA START: MOV AX, DATAMOV DS, AX MOV AX, X MOV BX, Y CMP AX, BXJGE STORE;取字数据X至AX ;取字数据丫至BX;比拟(AX)和;假设(AX) ;假设(AX) <(BX)(BX),那么转STc)RE处执行XCHGAX, BX(BX),那么(AX)(BX)STORE: MOV BIG, AXMOV AH, 4CHINT 21H;存结果至BlG字单元CODE ENDSEND START4-17试编制一程序,比拟STRlNGI和STRlNG2所含字符是否完全相同,假设相同显示“MATCH", 反之,那么显示“NO MATCH"。试编写该程序。解:DATASTRlSTR2 MYES DATA CODESEGMENTDB 'COMPUT'DB 'CONPUT'DB tMATCH, ODH, OAH, $ENDSSEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXMOV CX, 6Mov si Offsetstri ;设置字符串STRl的地址指针SlMOV DI, OFFSET STR2 ;设置字符串STR2的地址指针DlCLDREPE CMPSB ;字符串一致时,重复比拟,在两字串中找不相同字符JNE NO_SAME ;假设有不相同字符,那么转至NO_SAME处执行,否那么顺序执行SAME: MOV DX, OFFSET MYESMOV AH,09H;显示字符串 “MATCH"INT 21HJMP ENDONO_SAME: MOV DX,OFFSET MNOENDO:MOV AH, 09H;显示字符串 “NO MATCH”INT