您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 汇编语言程序设计程学先汇编第23,4章作业参考答案
2.16编写程序段,使(AH)与(AL)中的内容互换。解1MOVBL,ALMOVAL,AH.MOVAH,BL解2XCHGAH,AL2.17编写程序段,使(BL)中高4位与低4位内容互换。解1MOVCL,4MOVBH,0SHLBX,CLADDBL,BH解2MOVCL,4ROLBL,CL2.18编写程序段,实现当(DL)是奇数时使(AL)=31H,否则使(AL)=30H。SHRDL,1MOVAL,0RCLAL,1ADDAL,30H2.20设寄存器AX中存放1234H,BX寄存器中存放1,执行DIVBL指令后,会发生什么现象?为什么?溢出,商超过8位,在AL中存放不下商。2.21设DX寄存器中存放值为0,AX中存放1234H,BX中存放1,执行DIVBX后,是否会出现与2.20相同现象?为什么?不会,因为是16位除法,商未超过16位2.22一字数据压栈时堆栈指针如何改变?弹出一字数据时堆栈指针如何改变?压栈时堆栈指针减2;弹出一字数据时堆栈指针加22.23已知(SP)=2088H,(AX)=1A89H,(BX)=90CDH。依次执行以下三条指令后,画图说明堆栈中数据情况,及SP、AX、BX中数据。PUSHAXPUSHBXPOPAX(SP)=2086H,(AX)=90CDH,(BX)=90CDH。*2.25编写程序段求8!(8的阶乘)。MOVAX,8MOVBX,7NEXT:DX,0MULBXDECBXJNZNEXT2.27假设(AX)=07EH,变量BUFFER中存放的内容为B5H,求下列各条指令单独执行后的结果。(1)ANDAX,BUFFER34H(2)XORAX,BUFFERCBH(3)ORAX,BUFFER0FFH(4)ANDAX,00(5)XORAX,OFFH81H(6)TESTAX,8000H相与结果为0时。AX为正,值不变*2.28编写程序段,判断(AL)中的有符号数是正数还是负数,正数在CL中写0,否则写1。CMPAL,0MOVCL,0JGENEXTMOVCL,1NEXT:……2.29编写程序段,对存放在(DX)、(AX)中的双字数据求补。MOVBX,0SUBBX,AXMOVAX,BXMOVBX,0SBBBX,DXMOVDX,BX2.31假设(DX)=78D5H,(CL)=5,CF=0,确定下列各条指令单独执行后(DX)中的值。(1)SHLDH,1(DX)=F0D5H(2)SALDX,CL(DX)=1AA0H(3)SHRDX,CL(DX)=03C6H(4)SARDL,1(DX)=78EAH(5)ROLDX,CL(DX)=1AAFH(6)RCRDL,1(DX)=786AH(7)RCLDH,CL(DX)=0FD5H2.32按下列要求编写指令序列。(1)清除DH中最低3位而不改变其他位,结果存入BH。ANDDH,0F8H(2)将DI中最高3位置1而不改变其他位。ORDI,0E000H(3)将AX中0~3位置1、7~9位取反、其他位清0。ORAX,0FHXORAX,380HANDAX,38FH(4)检查BX中第2、5、9位是否至少有1位是1。TESTAX,224H如果结果非0(5)检查CX中第1、6、11位是否同时为1。NOTCXTESTCX,842H如果结果为0(6)检查BX中第0、2、9、13位是否至少有1位是0。NOTBXTESTBX,2205H如果结果非0(7)检查DX中第1、4、11、14位是否同时是0。TESTDX,4812H如果结果为02.33编写指令序列分别实现下述功能。(1)右移DI3位,并将0移入最高位。MOVCL,3SHRDI,CL(2)将AL左移一位,将0移入最低位。SHLAL,1(3)DX右移6位且保持正负特性不变。MOVCL,6SARDX,CL(4)将AL中压缩BCD码变成AX中的非压缩BCD码。MOVAH,0MOVCL,4SHLAL,CLMOVCL,4SHRAL,CL2.34分析下面的程序段完成什么功能?MOVCL,4SHRAX,CLMOVBL,DLSHRDX,CLSHLBL,CLORAH,BL将双字(DX,AX)逻辑右移4位*2.35设数据段偏移地址1000H处开始存放有10个字节数据,将其求和,结果存放在AX中。MOVCX,10MOVSI,1000HMOVAX,0CLCLOOP1:ADCAX,[SI]INCSILOOPLOOP12.37从键盘输入0到9之间某数字字符,利用列表法将该数字的平方值放到AL中。SUBDB0,1,4,9,16,25,36,49,64,81MOVAH,1INT21HSUBAL,30HMOVBL,ALMOVBH,0MOVAL,SUB[BX]2.38已知X、Y、Z、P、K均为16位带符号数,求计算(1000+X*Y-Z)/P的程序段。注明结果的商与余数所存放的位置。MOVAX,XIMULY;x*yMOVCX,AXMOVBX,DXMOVAX,ZCWD;符号扩展,AX中符号扩展到DX中SUBCX,AXSBBBX,DX;x*y-zMOVAX,1000MOVDX,0SUBAX,CXSBBDX,BXMOVBX,PIDIVBX;(1000+X*Y-Z)/P4.1编制程序计算Y=5X+7,设X值在DAX字节单元,结果存入RLT字节单元。X为带符号整数。DATASEGMENTDAXDB15HRLTDB0DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAL,DAXMOVBL,5;X*5IMULBL;有符号数乘法ADDAL,7MOVRLT,ALMOVAH,4CHINT21HCODEENDSENDSTART;DAX绝对值不能超过18H(0-18H或0FFH-0E9H)。;否则,RLT得为字类型,ADDAL,7改为ADDAX,7;因为7已知为正,无需符号扩展。4.3编制程序计算X-Y。设X、Y分别在DAX、DAY单元,结果存入RESULT单元。(1)X、Y为字节数据(2)X、Y为字数据(3)X、Y为双字节数据要求:存取数据时至少使用三种不同的寻址方式。1、用直接寻址DATASEGMENTDAXDB18HDAYDB65HRESULTDB0DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAL,DAX;源操作数为直接寻址SUBAL,DAYMOVRESULT,ALMOVAH,4CHINT21HCODEENDSENDSTART2、换间接寻址与相对寻址DATASEGMENTDAXDW18HDAYDW65HRESULTDW0DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVSI,DAXMOVDI,RESULTMOVAX,[SI];源操作数为间接寻址SUBAX,[SI+2];源操作数为相对寻址MOV[DI],AXMOVAH,4CHINT21HCODEENDSENDSTART3、X、Y为双字节数据,必须分高16位与低16位分别运算方法1DATASEGMENTDAXDD2A341928HDAYDD6873BC25HRESULTDD0DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,WORDPTRDAX;减低16位SUBAX,WORDPTRDAYMOVWORDPTRRESULT,AXMOVAX,WORDPTRDAX+2;减高16位SUBAX,WORDPTRDAY+2MOVWORDPTRRESULT+2,AXMOVAH,4CHINT21HCODEENDSENDSTART;特别注意加“WORDPTR”;注意低16位与高16位各是如何表示的。;还要注意,本题要求出现三种以上寻址方式。目前解中用到了寄存器寻址、直接寻址、间接寻址与相对寻址4种方式。方法2:LEASI,DAXLEADI,DAYLEABX,RESULTMOVAX,[SI]SUBAX,[DI];减低16位MOV[BX],AXMOVAX,[SI+2]SBBAX,[DI+2];减高16位MOV[BX+2],AX4.4设内存OPCD单元存放一个16位代码,编制程序将其中15~13,12~8,7~3,2~0位的代码分别存入WCD开始的单元。每段代码的最低位与单元的第0位对齐。解法1:DATASEGMENTOPCDDW2A5CHWCDDW?,?,?,?DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,OPCDMOVCL,13;逻辑右移13位SHRAX,CLMOVWCD,AXMOVAX,OPCDANDAX,1FFFH;屏蔽高3位MOVCL,8;逻辑右移13位SHRAX,CLMOVWCD+2,AXMOVAX,OPCDANDAX,0FFHMOVCL,3SHRAX,CLMOVWCD+4,AXMOVAX,OPCDANDAX,7MOVWCD+6,AXMOVAH,4CHINT21HCODEENDSENDSTART解法2:下面一种方法是4个字生成的程序段全一样,可以类似于逻辑尺建立一个数据表,变成循环来做。MOVAX,OPCDMOVCL,3RORAX;循环右移3位MOVBX,AX;暂存AXANDAX,07H;保留低3位MOVWCD,AXMOVAX,BX;恢复AXMOVCL,5RORAX;循环右移5位MOVBX,AX;暂存AXANDAX,1FMOVWCD+2,AX;保留低5位MOVAX,BXMOVCL,5RORAXMOVBX,AXANDAX,1FMOVWCD+4,AXMOVAX,BXMOVCL,3RORAXMOVBX,AXANDAX,07HMOVWCD+6,AX4.5利用查表的方法计算S=X2+Y2,设0≤X≤15,0≤Y≤15,且分别在DAX、DAY字节单元存放,结果存入RLT单元。DATASEGMENTTABDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225;建立平方值表DAXDB11;假设X的值DAYDB13;假设Y的值RLTDW?DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAL,DAXLEABX,TAB;指向平方值表XLAT;根据X的值查表MOVAH,0MOVRLT,AXMOVAL,DAY;根据Y的值查表XLATMOVAH,0ADDRLT,AX;求S=X2+Y2MOVAH,4CHINT21HCODEENDSENDSTART4.6编程实现把键入的一个字符,用二进制形式(0/1)显示出它的ASCII代码值。MOVAH,1;键入一个字符INT21HMOVCX,8NEXT:ROLAL,1;循环左移一位MOVDL,ALANDDL,1;保留最低1位ADDDL,30H;显示一位MOVAH,2INT21HLOOPNEXT4.7编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。MOVAH,1;键入一个字符INT21HCMPAL,’a’;小于a(小A)退出JBEXITCMPAL,’z’JAEXIT;大于z(小z)退出SUBAL,20H;小写变大写MOVDL,AL;显示MO
本文标题:汇编语言程序设计程学先汇编第23,4章作业参考答案
链接地址:https://www.777doc.com/doc-2368361 .html