资源描述:
《汇编语言程序设计ch4练习参考答案》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第四章汇编语言程序格式练习参考答案1.指令下列指令的错误(1)MOVAH,BX(源操作数为字数据,目的操作数为字节数据)(2)MOV[BX],[SI](两操作数都是存储器操作数)(3)MOVAX,[SI][DI](基址变址寻址方式中,必须有一个是基址寄存器而另一个是变址寄存器)(4)MOVMYDAT[BX][SI],ES:AX(寄存器寻址不存在段超越)(5)MOVBYTEPTR[BX],1000(目的操作数为字节类型,1000超出字节数表示范围)(6)MOVBX,OFFSETMYDAT[SI](OFFSET只能作用于简单变量,这里可以将MOV换为LEA)(7)MOVCS,AX
2、(MOV指令的目的操作数不允许是CS寄存器)(8)MOVECX,AX(源操作数为字数据,目的操作数为双字数据)2.(1)非法,目的操作数不能是立即数(2)合法(3)非法两个操作数不能同时为内存操作数(4)非法两操作数的类型不匹配(源操作数为字节数据,目的操作数为字数据)3.(1)非法,操作数类型不同(源操作数为字节数据,目的操作数为字数据)(2)合法。(3)非法,两操作数都是存储器操作数(4)非法,寄存器相对寻址中的16位寄存器只允许BX、BP、SI、DI(5)合法。(6)合法。(7)非法,由立即数,故目的操作数必须说明操作数类型,因此在作数为必须说明存储器的类型(8)非法,
3、两个内存单元地址相加没有意义(9)合法。(10)合法。4.(1)错误之处:两操作数都是存储器操作数(2)错误之处:两操作数类型不同(源操作数为字数据,目的操作数为字节数据)(3)一般来说,直接用标号LAB作为转移指令的操作数就行了。如果想以内存LAB[SI]作相对寻址,实现间接转移,那在LAB[SI]前面应加上WORDPTR(或DWORDPTR),以表明段内间接转移或段间间接转移,但汇编中常把缺省情况认为是WORDPTR,因此,在很多的MASM版本中,这条指令都认为是正确的指令。尽管就指令本身来说是正确的,但以这种间接转移的结果很让人匪夷所思。(4)条件转移指令后面只能是标号
4、。(5)格式不对,指令中的NEAR应改为NEARPTR5.(1)图4.1(a)(2)图4.1(b)5(a)(b)图4.16.(1)XDW5150H(2)XDB50H,51H(3)XLABELWORDDF5150H(4)XLABELWORDDQ5150H(5)XLABELWORDDT5150H如果采用指令,将有很多方法将5150H送给字存储单元X7.DATASGSEGMENTFLD1BDB'personalcomputer'FLD2BDB32FLD3BDB20HFLD4BDBBFLD5BDB'32654'FLD6BDB10DUP(0)FLD7BDB'PART1',DW20DB'
5、PART2'DW50DB'PART3',DW14FLD1WDW0FFF0H5FLD2WDWBFLD3WDWFLD7BFLD4WDW5,6,7,8,9FLD5WDW5DUP(0)FLD6WDWFLD1W–FLD7BDATASGENDS8.PLENTH的值为22,它表示分配给三变量PARTNO、PNAME和COUNT的存储单元的总字节数。9.L为EBUFF也BUFF两变量的地址差,即分配给BUFF变量的存储单元字节数,L=610.(1)MOVAX,OFFSETLNAME(2)MOVSI,WORDPTRCODE_LIST(3)CODE_LENGHTEQU$-CODE_LIST11.
6、DATA_SEGSEGMENTDB5DATA_LISTDW-1,0,2,5,4,5DUP(?)MAXDW?MINDW?DATA_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGMOVAX,DATA_SEGMOVDS,AXMOVCX,5MOVBX,0MOVAX,[BX]MOVDX,[BX]LOP:CMPAX,[BX]JLL1CMPDX,[BX]JGJMPNEXTL1:MOVAX,[BX]JMPNEXTL2:MOVDX,[BX]NEXT:INCBXINCBXLOOPLOPMOVMAX,AXMOVMIN,DXCODE_SEGEN
7、DS512.(1)100*100+25=10025(2)(100MOD2)+25=25(3)(100+2)*25-2=2548(4)(25/3)MOD5=8MOD5=3(5)(100+3)*(25MOD2)=103*1=103(6)0FFFFH(7)1(8)313.MOVAX,0AHMOVBL,0AHMOVCL,114.(1)(AX)=1(2)(AX)=2(3)(CX)=20(4)(DX)=40(5)(CX)=115.(1)操作符错误,改为:DATA_SEGSEGMENT(2)缺少段名,在前面加个段名,