汇编语言课后习题答案

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

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

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

资源描述

2.1已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行完后AX寄存器的内容。(1)movax,1200h(2)movax,bx(3)movax,[1200h](4)movax,[bx](5)movax,[bx+1100h](6)movax,[bx+si](7)movax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH;偏移地址=bx=0100h(4)AX=3412H;偏移地址=bx=0100h(5)AX=4C2AH;偏移地址=bx+1100h=1200h(6)AX=7856H;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)movcx,dl(2)movip,ax(3)moves,1234h(4)moves,ds(5)moval,300(6)mov[sp],ax(7)movax,bx+di(8)mov20h,ah〔解答〕(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[SI](7)源操作数应为[BX+DI](8)立即数不能作目的操作数〔习题2.5〕已知SS=2200H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?movax,8057hpushaxmovax,0f79hpushaxpopbxpop[bx]〔解答〕movax,8057hpushaxmovax,0f79hpushaxpopbx;bx=0f79hpop[bx];DS:[0f79h]=8057h〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:moval,89haddal,aladdal,9dhcmpal,0bchsubal,aldecalincal〔解答〕moval,89h;AL=89hCFZFSFOFPFaddal,al;AL=12h10011;10001001+10001001100010010addal,9dh;AL=0afh00101;00010010+1001110110101111cmpal,0bch;AL=0afh10101;10101111-10111100*01000011subal,al;AL=00h01001decal;AL=0ffh00101;00000000-00000001*11111111incal;AL=00h01001;11111111+00000001*11111111必考:〔习题2.10〕指出下列指令的错误:(1)xchg[si],30h(2)popcs(3)sub[si],[di](4)pushah(5)adcax,ds(6)add[si],80h(7)inal,3fch(8)outdx,ah〔解答〕(1)xchg的操作数不能是立即数(2)不应对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数〔习题2.11〕给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。movax,1470handax,axorax,axxorax,axnotaxtestax,0f0f0h〔解答〕movax,1470h;AX=1470HCFZFSFOFPFandax,ax;AX=1470H00000;0001010001110000orax,ax;AX=1470H00000xorax,ax;AX=0000H01001notax;AX=FFFFH01001testax,0f0f0h;AX=FFFFH00101注意:MOV和NOT指令不影响标志位;其他逻辑指令使CF=OF=0,根据结果影响其他标志位。〔习题2.26〕按照下列要求,编写相应的程序段:(1)起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。movsi,0movdl,string[si];第1个字符送dl寄存器movsi,5movdh,string[si];第6个字符送dh寄存器(2)从主存buffer开始的4个字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将它们合并到DX中。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)编写一个程序段,在DX高4位全为0时,使AX=0;否则使AX=-1。tesdx,0f000hjzzeromovax,-1jmpdonezero:movax,0done:ret〔习题2.34〕补充例2.40,当有溢出时显示“Error!Overflow!”,无溢出时显示“OK”。〔解答〕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,9int21h必考:习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?〔解答〕伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。必考:〔习题3.9〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。(1)movbyteptr[bx],1000(2)movbx,offsetmyword[si](3)cmpmybyte1,mybyte2(4)moval,mybyte1+mybyte2(5)subal,myword(6)jnzmyword〔解答〕(1)1000超出了一个字节范围(2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为leabx,myword[si](3)两个都是存储单元,指令不允许(4)变量值只有执行时才确定,汇编过程不能计算(5)字节量AL与字量myword,类型不匹配(6)Jcc指令只有相对寻址方式,不支持间接寻址方式〔习题3.11〕给出下列语句中,指令立即数(数值表达式)的值:(1)moval,23hAND45hOR67h(2)movax,1234h/16+10h(3)movax,NOT(65535XOR1234h)(4)moval,LOW1234hORHIGH5678h(5)movax,23hSHL4(6)movax,1234hSHR6(7)moval,’a’AND(NOT(’a’-’A’))(8)moval,’H’OR00100000b(9)movax,(76543LT32768)XOR7654h〔解答〕注:对于逻辑运算,有关操作数可化为二进制数。(1)67h(2)133h(3)1234h(4)76h(5)0234h(6)0048h(7)41h(8)68h(9)7654h必考〔习题3.15〕请设置一个数据段mydataseg,按照如下要求定义变量:(1)my1b为字符串变量:PersonalComputer(2)my2b为用十进制数表示的字节变量:20(3)my3b为用十六进制数表示的字节变量:20(4)my4b为用二进制数表示的字节变量:20(5)my5w为20个未赋值的字变量(6)my6c为100的常量(7)my7c表示字符串:PersonalComputer〔解答〕mydatasegsegmentmy1bdb‘PersonalComputer’my2bdb20my3bdb14h;20hmy4bdb00010100bmy5wdw20dup(?)my6cequ100;my6c=100my7cequPersonalComputermydatasegends〔习题3.25〕按下面要求写一个简化段定义格式的源程序(1)定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。〔解答〕.modelsmall.stack.datanumequ5datalistdw-1,0,2,5,4,?.code.startupmovbx,offsetdatalistmovcx,numxorax,axagain:addax,[bx]incbxincbxloopagainmov[bx],ax.exit0end〔习题4.19〕编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。〔解答〕.modelsmall.stack.datanumequ100wlistdwnumdup(?)wordsumdw?errordb'overflow.$'.code.startupmovbx,offsetwlistmovcx,numxorax,axagain:addax,[bx]jcnextincbxincbxloopagainmov[bx],axjmpdonenext:movdx,offseterrormovah,9int21hdone:.exit0end〔习题4.23〕子程序的参数传递有哪些方法,请简单比较。〔解答〕寄存器、共享变量(公共存储单元)、堆栈用寄存器传递参数是把参数存于约定的寄存器中,这种方法简单易行,经常采用;用变量传递参数是主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量,调用程序与被调用程序不在同一个源文件中,必须利用public/extern进行声明,才能用变量传递参数,利用变量传递参数,过程的通用性比较差,然而,在多个程序段间,尤其在不同程序的模块间,利用全局变量共享数据也是一种常见的参数传递方法;用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口压入堆栈,主程序弹出堆栈取得它们。〔习题4.24〕采用堆栈传递参数的一般方法是什么,为什么应该特别注意堆栈平衡问题。〔解答〕采用堆栈传递参数的一般方法是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。因为堆栈采用“先进后出”原则存取,而且返回地址和保护的寄存器等也要存于堆栈,

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

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

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

×
保存成功