新版汇编语言程序设计课后答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第2章(03)2.12;指令注释执行结果CFOFSFZFPFmovsi,axsi=axsi=0008h-----shlsi,1si=2*axsi=0010h00000addsi,axsi=3*axsi=0018h00001movdx,bxdx=bxdx=0010h-----movcl,03hcl=03h-----shldx,cldx=8*bxdx=0080h0u000subdx,bxdx=7*bxdx=0070h00000adddx,sidx=7*bx+3*axdx=0088h00001注意:1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。2.移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。根据最高符号位是否改变设置OF,如改变OF=1.3.‘u’表示无定义,‘-’表示无影响。2.13;(1);不考虑进位movbl,almovcl,3shlal,claddal,bl;shlbl,1addal,bl;考虑进位xorah,ahmovbx,axmovcl,3shlax,claddax,bx;shlbx,1addax,bx(2)数字0~9的ASCII码是:30h~39h非压缩BCD码的0~9是:00h~09h方法一:andal,0fh;实现ASCII到非压缩BCD码的转换oral,30h;实现非压缩BCD码到ASCII的转换方法二:xoral,30h;求反D5D4位,其他不变;即高4位为3,则变为0;高4位为0,则变为3movcl,4again:shrdx,1;实现逻辑右移;采用“sardx,1”,则实现算术右移rcrax,1deccljnzagain2.14;(1)用sar编写moval,0f7h;-9送alsaral,1;结果:al=0fbh即-5(2)用idiv编写moval,0f7h;-9送alcbw;字节符号扩展位字movbl,2;注意除数不可为立即数idivbl;结果:商为al=fch(-4);余数为ah=ffh(-1)结论:符号数的除法用idiv准确2.19;短转移:指段内-128~127之间的转移,位移量用一个字节表示近转移:指段内±32K之间的转移,位移量用一个字表示远转移:指段间1MB范围的转移段内转移:指在同一个代码段内的转移,可以是短转移或者近转移段间转移:指转移到另外一个代码段,就是远转移8086/8088CPU的JMP、CALL和INTn指令可以实现段间转移第2章(04)2.20;8086的条件转移的转移范围:在当前指令地址的+127-----128之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。2.21;(1)JMPBx;转移的有效地址EA=BX=1256h(2)JMPtABLE[Bx];转移的有效地址EA=[ds:20a1h+1256h]=[232f7]=3280h(3)JMP[Bx][si];转移的有效地址EA=[ds:1256h+528fh]=264e5h=2450h2.22;(1)xorax,1e1ehjeequal;AX=1e1eh(异或后为0)(2)testal,10000001bjnzthere;AL的D0或D7至少有一位为1(3)cmpcx,64hjbthere;CX(无符号数)<64h2.23;movcx,0不循环,因为一进入循环就判cx=0?如cx=0就退出循环delay:loopdelay2.24;(1)若DXDI,转到above执行cmpdx,dijaabove;=jnbeabove(2)若AXSI,转到greater执行cmpax,sijggreater;=jnlegreater(3)若CX=0,转到zero执行cmpcx,0jcxzzerojzzero(4)若AX-SI产生溢出,转到overflow执行;cmpax,dijooverflow(5)若SI≤AX,转到less_eq执行;cmpsi,axcmpax,sijleless_eqjgeless_eq(6)若DI≤DX,转到below_eq执行。cmpdi,dxcmpdx,dijbebelow_eqjaebelow_eq2.25;答:将首地址为array得20个字的数组求和,并将结果存入total单元中。第2章(05)2.26;(1)movsi,0movdl,string[si];第1个字符送dl寄存器movsi,5movdh,string[si];第6个字符送dh寄存器(2)xorsi,si;si清零moval,buffer[si];第一字节incsimovah,buffer[si];第二字节movcl,4shlah,cl;BCD码移到高半字节oral,ah;组合成压缩BCD码movdl,al;存入dl寄..incsimoval,buffer[si];第三字节incsimovah,buffer[si];第四字节movcl,4shlah,cl;BCD码移到高半字节oral,ah;组合成压缩BCD码movdh,al;存入dh寄..(3)testdx,0f000hjzzeromovax,-1jmpdonezero:movax,0done:ret(4)leabx,buffer1leadx,buffer2movcx,8;8个字节xorsi,si;si=0clc;CF=0(5)movax,0b800hmovds,ax;段地址xorsi,si;地址偏移量si=0xordx,dx;和的高字dx=0movcx,99;加的次数movax,[si];第一个数again:incsi;指向下一个字单元incsiaddax,[si];加下一个数jncnoc;无进位转incdx;有进位dx=dx+1noc:deccx;次数-1jnzcx,again;非0继续加ret(6)movsi,offsetstringmovcx,8000h;32k=2^15=8000hagain:cmp[si],’$’jnznextmov[si],20h;if[si]=’$’[si]--’’next:incsiloopagain(7)xorsi,si;si--0movcx,100;循环次数again:decarray[si]deccxjnzagain(8)xorsi,si;si--0coun:cmpstring[si],’$’jedoneincsijmpcoundone:ret2..27;(1)使CF=0:clc;andax,ax;orax,ax(2)使AX=0:xorax,ax;andax,0;movax,0(3)同时使AX=0和CF=0:andax,0;xorax,ax;subax,ax2.29;压缩BCD码加法:AX←AX+BX出口参数:AX=BCD码和2.24;okmsgdb‘OK’,‘$’errmsgdb‘Error!Overflow!’,‘$’…movax,Xsubax,Yjooverflowmovdx,offsetokmsgjmpnextoverflow:movdx,errmsgnext:movah,9int21h错误:movax,Xsubax,Yjooverflowmovdx,offsetokmsgokmsgdb‘OK’,‘$’movdx,errmsg;错误1:数据定义在代码中movah,9int21hoverflow:errmsgdb‘Error!Overflow!’,‘$’movdx,errmsg;错误2:缺少JMP指令movah,9int21h2.37;;xt237.asm.modelsmall.stack.dataarraydb255db0array1db255dup('$')array2db0dh,0ah,'$'.code.startupmovah,0ah;键盘输入字符串movdx,offsetarrayint21hmovdx,offsetarray2;回车换行movah,09hint21hmovbx,offsetarray1again:moval,[bx]cmpal,'$'jzdonecmpal,'a';小于a和大于z的字符不是小写字母jbnextcmpal,'z'janextsubal,20h;在a和z之间的字符才是小写字母,转换为大写mov[bx],al;保存到原位置next:incbxjmpagaindone:movdx,offsetarray1movah,09hint21h.exit0end第三章(01)3.1;硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。3.2;3.5;⒈编辑文本编辑程序汇编语言源程序.asm⒉汇编汇编程序目标模块文件.obj⒊连接连接程序可执行文件.exe或.com⒋调试调试程序应用程序3.6;;xt236.asm简化段定义格式.modelsmall;定义程序的存储模式(小模式).stack;定义堆栈段(默认1024个字节).data;定义数据段str1ab’InputNumber:0~9:’,0dh,0ah,’$’str2ab’Error!’,0dh,0ah,’$’.cade;定义代码段.startup;说明程序的起始点,建立ds,ss的内容。movah,09h;显示str1字符串movdx,offsetstr1int21hgtekey:movah,1;调用BIOS判断按键功能int16hjzgetkey;如zf=0,无键按下,等待cmpal,‘0’;有键按下,键值与‘0’比较jberror;如‘0’,出错处理cmpal,‘9’;有键按下,键值与‘9’比较jaerror;如〉‘9’,出错处理movah,02h;调用DOS显示字符功能,显示该数字movdl,alint21h.exit0;终止程序执行,返回DOSerror:movah,09h;出错,调用DOS功能显示str2字符串movdx,offsetstr2int21hjmpgetkey;等待按键end;汇编结束3.7;;xt307.asmstacksegmentdw512dup(?)stackendsdatasegmentarraydb255db0array1db255dup('$')array2db0dh,0ah,'$'dataendscodesegment'code'assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovah,0ah;键盘输入字符串movdx,offsetarrayint21hmovdx,offsetarray2;回车换行movah,09hint21hmovbx,offsetarray1again:moval,[bx]cmpal,'$'jzdonecmpal,'a';小于a和大于z的字符不是小写字母jbnextcmpal,'z'janextsubal,20h;在a和z之间的字符才是小写字母,转换为大写mov[bx],al;保存到原位置next:incbxjmpagaindone:movdx,offsetarray1movah,09hint21hmovax,4c00hint21hcodeendsendstart3.9;(1)movbyteptr[bx],1000;1000超出了一个字节范围(2)movbx,offsetmyword[si];寄存器的值只有程序执行时才能确定,;而offset是汇编过程计算偏移地址,故无法确定;可以改为leabx,myword[si](3)cmpmybyte1,mybyte2;两个都是存储单元,指令不允许(4)moval,mybyte1+mybyte2;变量值只有执行时才确定,汇编过程不能计算(5)subal,myword;字节量AL与字量myword,类型不匹配(6)jnzmyword;Jcc指令只有相对寻址方式,不支持间接寻址方式3.10;前者为“与”操作硬指令助记符,可汇编成机器代码。后者为逻辑运算符,在汇编时进行“与”运算,产生具体

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功