- 41.44 KB
- 31页
- 1、本文档共5页,可阅读全部内容。
- 2、本文档由网友投稿或网络整理,如有侵权请及时联系我们处理。
'第一章1.1(如果十六进制数的最高位是字母(如:A,B),则应在其前面加0(零),如本题(3))(1) 369D=101110001B=171H(2) 10000D=10011100010000B=2710H(3) 4095D=111111111111B=0FFFH(4) 32767D=111111111111111B=7FFFH1.2(1) 101101B=2DH=45D(2) 10000000B=80H=128D(3) 1111111111111111B=0FFFFH=65535D(4) 11111111B=0FFH=255D1.3(1) 0FAH=11111010B=250D(2) 5BH=1011011B=91D(3) 0FFFEH=1111111111111110B=65534D(4) 1234H=1001000110100B=4660D1.4(1)3AH+0B7H=0F1H(2)1234H+0AFH=12E3H(3)0ABCDH-0FEH=0AACFH(5) 7AB×6FH=35325H1.5(1)(-85D)+76D=10101011B+01001100B=11110111B=0F7H(2)85D+(-76D)=01010101B+10110100B=00001001B=09H(3)85D-76D=01010101B+10110100B=00001001B=09H(4)85D-(-76D)=01010101B+01001100B=10100001B=0A1H(5)(-85D)-76D=10101010B+10110100B=01011111B=5FH(6) -85D-(-76D)=10101011B+01001100B=11110111B=0F7H1.6(1) 0D8H如果它被看作带符号数,则它表示-40D;如果它被看作无符号数,则它216D。(2) 0FFH如果它被看作带符号数,则它表示-1D;如果它被看作无符号数,则它255D。1.7(1) 4FH,79D,’O’(2) 2BH,43D,‘+’(3) 73H,115D,‘s’(4) 59H,89D,‘Y’1.8(1) Forexample,46H6FH72H20H65H78H61H6DH70H6CH65H2CH(2) Thisisanumber3692.
54H68H69H73H20H69H73H20H61H20H6EH75H6DH62H65H72H20H33H36H39H32H2EH第二章2.1256个2.2E5H000B0H1EH000B1H000B2H3CH000B3H2AH000B4H2.330022H和30024H字节单元的内容分别为(30022H)=0ABH(30024H)=0EFH30021H和30022H字单元的内容分别为(30021H)=0AB34H(30022H)=0CDABH2.4逻辑地址为3017:000A的存储单元的物理地址为3017AH。逻辑地址为3015:002A的存储单元的物理地址为3017AH。逻辑地址为3010:007A的存储单元的物理地址为3017AH。2.50AAA40H2.7(1) AX,BX,CX,DX,SI,DI(2) CX(3) AX,BX,CX,DX,SI,DI(4) CS,DS,SS,ES(5) FLAGS(6) CS,IP(7) SS,SP,BP2.8指示存储器地址的寄存器如下所示段偏移CSIPSSSP,BPDSBX,DI,SIESDI2.91.(M)2.(C)3.(D)4.(B)5.(A)6.(L)7.(K)8.(J)9.(F)10.(H)11.(G)12.(E)13.(I)14.(O)15.(N)
第三章1(1)立即寻址没有(2)直接寻址7237H(3)使用BX的寄存器寻址没有(4)使用BX的间接寻址637DH(5)使用BX的寄存器相对寻址0D5F0H(6)基址变址寻址8E18H(7)相对基址变址004FH2。根据下列要求,写出相应的汇编指令。(1)ADDDX,BX(2)ADDAL,[BX][SI](3)ADD[BX][0B2H],CX(4)MOVAX,2A59HADD[0524H],AX(5)ADDAL,0B5H3。(1)寄存器间接寻址MOVBX,OFFSET[BLOCK][0AH]MOVDX,[BX](2)寄存器相对寻址MOVSI,OAHMOVDX,[BLOCK][SI](3)基址变址寻址MOVBX,BLOCKMOVSI,OAHMOVDX,[BX][SI]4。现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。(1)MOVAX,1200H1200H(2)MOVAX,BX0100H(3)MOVAX,[1200]4C2AH注意,是字单元!!(4)MOVAX,[BX]3412H同上(5)MOV1100[BX]4C2AH(6)MOVAX,[BX][SI]7856H(7)MOVAX,1100[BX][SI]65B7H5。(1)7CD9H(2)1200H(3)6319H6。MOVBX,2000HLESDI,[BX]MOVAX,ES:DI
7。转向地址OBJ的值分别为:(1)064DH(2)0691H(3)05E0H注意有符号数的符号位~~8。(1)MOVAX,0ABH立即数寻址无物理地址(2)MOVAX,BX寄存器寻址同上(3)MOVAX,[100]直接寻址20100H(4)MOVAX,VAL直接寻址20050H(5)MOVAX,[BX]寄存器间接寻址20100H(6)MOVAX,ES:[BX]直接寻址21100H(7)MOVAX,[BP]寄存器间接寻址20010H(8)MOVAX,[SI]同上200A0H(9)MOVAX,[BX+10]寄存器相对寻址20110H(10)MOVAX,VAL[BX]同上20150H(11)MOVAX,[BX][SI]基址变址寻址201A0H(12)MOVAX,VAL[BX][SI]相对基相变址寻址201F0H9。(1)的指令:MOVAX,[BX][0CH]MOVZREO,AX(2)的指令:MOVAX,ARRAY[BX]MOVZREO,AX10。MOVAX,TABLE是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234HLEAAX,TABLE是把符号地址TABLE的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H11。执行完指令后,(AX)=1E00H12。LEAAX,CSTRINGMOVDL,AXMOVDH,[AX+6]13。这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~14。LESBX,[2000]MOVAX,ES:[BX]注意:一开始我写的是:MOVAX,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~15。运算结果SF,ZF,CF,OF各位的值(从左至右依次往下~)(1)74D4H0000(2)A5C1H1001(3)4240H0010(4)0000H011016。接上表~(1)5D140000(2)A8701001(3)D8701000(4)34E4001017。
(1).MOVAX,Z;把Z送到AXSUBAX,X;Z-XADDAX,W;W+(Z-X)MOVZ,AX;结果保存在Z中(2).MOVAX,R;R送到AX中ADDAX,9;R+9MOVBX,X;X送到BX中ADDBX,6;X+6ADDAX,BX;(R+9)+(X+6),结果保存在AX中MOVBX,W;W送到BX中SUBBX,AX;W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和~~MOVZ,BX;最终结果送到Z中(3)MOVAX,W;把W送到AXIMULX;W*X注意:低十六位保存在AX里,高十六位保存在DX里MOVBX,Y;把Y送到BX里ADDBX,6;Y+6IDIVBX;(W*X)/(Y+6)注意:商保存在AX里,余数保存在DX里MOVZ,AX;把商送到Z中,MOVR,DX;把余数送到R中(4)MOVAX,W;把W送到AX中SUBAX,X;W-XCWD;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保在DX中MOVBX,5;把5送到BX中IDIVBX;(W-X)/5被除数为32位,除数为16位商为16位IMULY;上一步结果再乖以Y,积为32位MOVBX,2;把2送到BX中IMULBX;上一步乘法所得的积再乘以2,各为64位MOVZ,EAX;把结果中低32位放入Z双字单元中MOV[Z+4],EDX;把结果中高32位放入Z+4双字单元中18。指令本条指令执行完后AX的内容执行完后CF,SF,ZF的值MOVAX,1234H1234H000MOVCL,41234H000ROLAX,CL2341H100DECAX2340H100
MOVCX,42340H100MULCX8918H000INT20H程序结束后,(AX)=8918H(DX)=0000H19。指令执行完后AX的内容执行完后CF,SF,ZF和OF的值MOVAX,000010DECAXFFFFH0100ADDAX,7FFFH7FFEH0000ADDAX,28000H0101NOTAX7FFFH0101SUBAX,0FFFFH8000H1101ADDAX,8000H0000H1011SUBAX,1FFFFH1101ANDAX,58D1H58D1H0000SALAX,1B1A2H0101SARAX,1D8D1H0100NEGAX272FH1000RORAX,19397H100120。(1)MOVAX,DATAXADDDATAY,AX(2)MOVAX,DATAXADDDATAY,AXMOVAX,[DATAX+2]ADD[DATAY+2],AX(3)本組指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF的值)帶進位加法~(4)MOVAX,DATAX
MULDATAY;結果的高十六位保存在DX裏,低十六位保存在AX裏(5)MOVAX,DATAXMOVDX,[DATAX+2]MULDWORDDATAY;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏;這裏所用的DWORD為一屬性操作符,在第四章會學到~~(6)MOVAX,DATAXDIV17H;結果商保存在AL中,余數在AH中(7)MOVAX,DATAXCDWDIVDATAY21。NEGDXNEGAXSBBDX,022。MOVAX,A;把雙字長數的低字放到AX中MOVDX,[A+2];把雙字長數的高字放到DX中TESTDX,8000H;測試雙字長數的符號JZRIGHT;如果是非負數,則直接保存NEGDX;如果是負數,則求補NEGAXSBBDX,0RIGHT:MOVB,AXMOV[B+2],DX2006-12-0711:4823。每條指令單獨執行完後的結果依次為:(1)9AH(2)61H(3)0FBH(4)1CH(5)0(6)0E3H24。執行指令序列後,BX的內容為:0DAH25。(1)把53D乘以2的程序:MOVAX,35H;53D=35HSHLAX,1(2)把53除以2的程序:MOVAX,35HSHRAX,1其他的同理~~26。這段程序完成的功能是:把DX:AX中的雙字數據左移4位(相當於乘以16D)27。各條指令單獨執行後,DX的值依次為:(1)5CH(2)17H(3)05C8H(4)72H(5)2017H(6)0CDH(7)0172H(8)05CCH(9)0DCH28。該程序段執行完後,BX寄存器的內容是:C02DH29。(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:LEASI,CONAME;把CONAME中第一个字节的偏移地址送到SI中LEADI,PRLINE;把PRLINE中第一个字节的偏移地址送到DI中MOVCX,20;把重复次数放到CX里
CLD;让SIDI从低地址指向高地址(即从左到右传送)REPMOVSB;传送(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:LEASI,CONAMELEADI,PRLINEMOVCX,20STD;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址REPMOVSB(3)把CONAME中的第三和第四個字節裝入AX的程序實現:LEASI,[CONAME+3]LODSW(4)把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:LEADI,[PRLINE+5]STOSW(5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:LEADI,CONAME;把CONAME中第一個字符偏移地址放入DI中MOVCX,20;把重複次數放到CX中MOVAL,20H;把空格符的ASCII值放入AL中CLD;從低到高REPNESCASB;比較MOVBH,[DI-1]R;把檢查到的空格符送到BH中30。MOVCX,12H;把重複次數放到CX中。這裏用十六進制表示MOVSI,0;初始化SIMOVAX,26H;把&字符的ASCII值放入AXCHECK:CMPAX,STRING[SI];依次查找INCSILOOPNECHECK;找到了就退出MOVAX,20H;把空格符的ASCII值勤放入AX中MOVSTRING[SI-1],AX;用空格符代替&31。(1)用空格符清除PRINT_LINE域的程序实现:MOVAL,20HLEADI,PRINT_LINEMOVCX,132CLDREPSTOSB(2)在STUDENT_ADDR中查找第一个’_‘的程序实现:MOVAX,2DH;把“—”的ASCII值放入AXMOVSI,0;初始化SIMOVCX,9;把重複次數放入CX中;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来CHECK:CMPAX,STUDENT_ADDR[SI];INCSI
LOOPNZCHECK(3)在STUDENT_ADDR中查找最后一个”_“的程序实现:;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9MOVAX,2DHMOVSI,9MOVCX,9CHECK:CMPAX,STUDENT_ADDR[SI]DECSILOOPNZCHECK(4)程序實現:MOVAL,2OH;把空格符的ASCII值放入AL中LEADI,STUDENT_NAME;把STUDENT_NAME中第一个字符偏移地址放到DI中MOVCX,30;把重复次数放到CX中CLD;让DI从低位移到高位REPZSCASB;如果有不是空格符的,就退出JZSTORE;如果全是空格符,就转到STORE中;用*代替空格STORE:MOVAL2AHMOVCX,30STD;注意,这里是把前面从低到高移动的DI再从高到低移上去~~REPSTOSB(5)程序实现:;把STUDENT_NAME移到PRINT_LINE的前30个字节中LEASI,STUDENT_NAMELEADI,PRINT_LINEMOVCX,30CLDREPMOVSB;把STUDENT_ADDR移到PRINT_LINE的后9个字节中LEASI,[STUDENT_ADDR+9]LEADI,[PRINT_LINE+132]MOVCX,9STDREPMOVSB32。程序实现:。。。LEASI,OLDSLEADI,NEWSMOVCX,5REPZCMPSBJNZNEW_LESS。。。33。(1)CMPDX,CX
JAEXCEED(2)CMPBX,AXJGEXCEED(3)CMPCX,0JZZERO(4)CMPBX,AXJOOVERFLOW(5)CMPBX,AXJLEEQ_SMA(6)CMPDX,CXJBEEQ_CX34。(1)跳转到:L1(2)跳转到L1(3)跳转到L2(4)跳转到L5(5)跳转到L535。(1)可以引起转移到L1的指令有:NB,BE,NL,LE(2)可以引起转移到L1的指令有:同上(3)可以引起转移到L1的指令有:B,BE,L,LE(4)可以引起转移到L1的指令有:NB,NBE,NL,NLE(5)可以引起转移到L1的指令有:同上(6)可以引起转移到L1的指令有:同(3)(7)可以引起转移到L1的指令有:同上36。37。程序流程图就不画了,呵呵,程序如下~~MOVAL,STAUS[SI];把要测试的字节放到AL中ANDAL,2AH;把第一,三,五位为一其他位为0的数--2AH,与这个字节比较,结果放到AL中JZROUTINE_4;如果结果为0,则三位都为0XORAL,2AH;前面相与的结果再与2AH异或JZROUTINE_1;如果结果为0,则三位都为1BSFBL,AL;BSRBL,ALCMPBL,CL;如果向前和向后测试后,第一个1的位置相同,说明只有一个1,则异或运算前有AL中有两个1JEROUTINE_2ROUTINE_1注:本题还有其他解法,请大家自己试试~~38。(1)当括号内是:LOOP时,循环四次,程序结束后(AX)=05(BX)=16(CX)=0(DX)=0(2)当括号内是:LOOPE时,不循环,程序结束后(AX)=02(BX)=04(CX)=03(DX)=02(3)当括号内是:LOOPNE时:循环三次,程序结束后
(AX)=04(BX)=11(CX)=01(DX)=039。图,就不画了,呵呵~~自己看一下课本,P101~~40.。(1)00003100H(2)5100H(3)7100H41。(1)目的地址:2004H内容依次为:56HF4H23H98H(2)目的地址:384CH内容依次为:91H34HF2H01H(3)目的地址:寄存器,无物理地址~内容依次为:92H6DHA2H4CH42。(1)PUSHAX (SP)<------(SP)-2(SP+1)<-----(AH)(SP)<------(AL)(2)POPESI(ESI)<-------((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(ESP)<-------(ESP)+4(3)PUSH[BX] (SP)<------(SP)-2(SP+1)<-----([BX+1])(SP)<------([BX])(4)PUSHAD(ESP)<-------(EAX)(ESP-4)<-------(ECX)(ESP-8)<-------(EDX)(ESP-12)<-------(EBX)(ESP-16)<-------(ESP);这里指的是指令执行前的ESP(ESP-20)<-------(EBP)(ESP-24)<-------(ESI)(ESP-28)<-------(EDI)(ESP)<-------(ESP)-32(5)POPDS(DS)<------((SP)+1,(SP))(SP)<------(SP)+2(6)PUSH4(SP)<-------(SP)-2(SP+1)<-----0(SP)<------443。(1)2CEFF93H(2)24B76A0H(3)9090804H(4)6F13ADH44。(1)0FFFFFFFCH(2)0FFFFFFF8H(3)00000007H(4)00000099H45。(EAX)=0(EBX)=25d46。(AX)=3d(DX)=7d47。ADDECX,EDXADDECX,ESIMOVEDI,ECX48。IMULBX,DX,100H执行的操作是:(BX)<-------(DX)*100H49。程序实现:
MOVAL,BLCBWIDIVCLIMUL2MOVDX,AX50。JMPDI是直接跳转,执行的操作是:(IP)<-----(IP)+(DI)JMP[DI]是间接跳转,执行的操作是:(IP)<----(IP)+([DI])跳转到DI中所指向的内存单元中的指令地址~51。假设数组名为NUMBERS,程序如下~MOVBX,0;后面用到~MOVCX,100H;把循环次数放入CXMOVAL,42HMOVSI,0;初始化SI;CHECK用来实现查找功能~CHECK:CMPAL,NUMBERS[SI]INCSIJBSTORE1;大于42H的数的个数存入UPJASTORE2;小于42H的的数的个数存入DOWN中~LOOPCHECK;相等继续循环~STORE1INCBL;找到一个大于42的数,BL值增加1~MOVUP,BLLOOPCHECKSTORE2INCBHMOVDOWN,BHLOOPCHECK52。图,也不用画了~第四章1.(1)MOVAH,BX源操作数与目的操作数长度不相同~(2)MOV[BX],[SI]这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~(3)MOVAX,[SI][DI]不能用两个变址连用,其中一个应为基址~(4)MOVMYDAT[BX][SI],ES:AX同(2)(5)MOVBYTEPTR[BX],1000必须有一个为寄存器(6)MOVBX,OFFSETMYDAT[SI]OFFSET不能与复杂操作数相连~(7)MOVCS,AX不能对CS赋值~(8)MOVECX,AX操作数类型不同~2。(1)合法(2)非法(3)非法(4)非法3。(1)非法,操作数类型不同(2)合法(3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~(4)合法~(5)合法~(6)合法
(7)非法~,必须有一个寄存器~~把CPU放哪了?~~(8)非法,两个内存单元地址相加没有意义~(9)合法(10)非法,同(3)4。(1)两内存单元传递数据(2)操作数类型不同(3)跳转指令只能跳转到符号地址(4)转移指令后不能为变量,只能为标号(5)格式不对,应为NEARPTR。。。5。图,就不画了~~6。(1)DW5150H(2)MOVAX,5150HMOVADDRESS,AX等,写出几个就可以~~7。DATASGSEGMENTFLD1BDB"personalcomputer"FLD2BDB10DUP(32)FLD3BDB20HFLD4BDB01011001BFLD5BDB"32654"FLD6BDB10DUP(0)FLD7BDB"PART1",DUP20(?),"PART2",DUP50(?),"PART3",DUP14(?)FLD1WDW0FFF0HFLD2WDW01011001BFLD3WDWFLD7BFLD4WDW5,6,7,8,9FLD5WDW5DUP(0)FLD6WDW(FLD6W-FLD1W)-(FLD7B-FLD1B)8。PLENTH的值为22,GE表示该数据段的长度~9。L的值为710。(1)MOVAX,OFFSETLNAME(2)MOVSI,WORDPTRCODE_LIST(3)CODE_LENGHTEQU$-CODE_LIST11。代码如下:DATA_SEGSEGMENTDB5DATA_LISTDW0FFFFH,0,2,5,4,5DUP(?)DATA_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGMOVAX,5MOVMAX,AXMOVAX,0FFFFHMOVMIN,AX
CODE_SEGENDS12。(1)10025(2)19(3)2548(4)3(5)103(6)0FFFFH(7)1(8)313。分别汇编成为:MOVAX,0AHMOVBL,0AHMOVCL,114。(1)(AX)=1(2)(AX)=2(3)(CX)=14H(4)(DX)=32H(5)(CX)=1]15。(1)操作符错误改为:DATA_SEGSEGMENT(2)缺少段名在前面加个段名(3)引用应该从;开始把那个“/”改成“;”(4)结构混乱改为:MAIN_PROCPROCFAR。。。。MAIN_PROCENDPEND16。程序框架如下:DATA_SEGSEGMENT;定義數據段ORG0E000H;讓下一字節地址為0E000HFIRST_TYPEEQUTHISWORD;建立一個與下一存儲單元有相同段地址和偏移地址的操作數DATA_GROUPDB100DUP(?);給DATA_GROUP分配100個字節的空間DATA_SEGENDS;數據段結束STACK_SEGSEGMENT;定義堆棧段ALIGN16;讓下一字節從小段首地址開始STACKDB100DUP(?);為堆棧分配空間STACK_SEGENDS;CODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGORG1000H;讓下條指令的第一個字節從1000H開始START:MOVAX,DATA_SEGMOVDS,AXMOVAX,STACK_SEGMOVSS,AX.......CODE_SEGENDSENDSTART;結束~17。程序如下:
D_SEGSEGMENT;数据段定义AUGENDDD99251D_SEGENDSE_SEGSEGMENT;附加段定义ADDENDDD-15926E_SEGENDSC_SEGSEGMENT;代码段定义ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGSTART:MOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AXMOVEAX,DS:AUGENDADDEAX,ES:ADDENDMOVDS:SUM,EAXC_SEGENDSENDSTART;结束19。需要加上PTR伪操作的有:(2)(3)(4)第五章5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart:pushdxmovax,0pushaxmovah,01Hint21Hcmpal,61Hjllop1cmpal,7BHjgelop1subal,20Hmovdl,allop1:movah,2
int21HretEndstart5.2编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符..modelsmall.386.codeMAINPROCFARstart:pushdssubax,axpushaxinput:movah,7Hint21Hcmpe:cmpal,20HJEexitcmpal,61HJLinputcmpal,7AHJGinputprint:subal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21H
;输出换行回车movdl,0AHmovah,02Hint21Hjmpinputexit:retMAINENDPENDstart5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。.modelsmall.dataxDB4dup(?).stack100H.codeMAINPROCFARstart:pushdsandax,00Hpushaxmovax,1234Hmovcx,04Hmovsi,00Hlop:pushcxmovcl,04Hrolax,clpushaxandal,0FHmovBYTEPTRx[si],alpopaxpopcxaddsi,2Looplopmoval,[X]movbl,[X+2]movcl,[X+4]movdl,[X+6]
print:movah,02Hint21Hmovdl,almovah,02Hint21Hmovdl,blmovah,02Hint21Hmovdl,clmovah,02Hint21Hexit:retMAINENDPENDstart5.4编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NOMATCH"。.modelsmall.dataSTRING1DB"Imuststudyhard"STRING2DB"Imuststudyhard"X DB"MATCH.$"Y DB"NOMATCH.$".stack100H.codemainprocfarStart:pushdxmovax,0pushaxmovax,@datamovds,axmoves,axleasi,STRING1leadi,STRING2
cldmovcx,(string2-string1)/typeSTRING2retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。modelsmall.codemainprocfarstart:pushdssubax,axpushaxinput: movah,01H int21H cmpal,20H jeexit cmpal,30H jleinput cmpal,3AH jgeinput subal,30H movcx,ax andcx,0FFHlop: movdl,07H movah,2H int21H looplop jmpinputexit: retmainendpendstart5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。
.modelsmall.386.dataMDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10PDB20dup(?)NDB20dup(?).codeMAINPROCFARstart: PUSHds ANDax,0 PUSHax MOVax,@data movds,ax MOVbx,0 MOVsi,0 MOVdi,0 MOVcx,20D cmpe: CMPM[bx],0 JLifLowhight: MOVal,byteptrM[bx] MOVbyteptrP[si],al incsi JMPcommonContrlifLow: MOVal,byteptrM[bx] MOVbyteptrN[di],al INCdicommonContrl: INCbx loopcmpe movax,si callshowNumber callprintCR movax,di callshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;
showNumberPROCNEARcovernum: DAA MOVdx,ax MOVcl,2Hshow: ROLdl,4H pushdx ANDdl,0fH ADDdl,30H MOVah,02H int21H popdx loopshow retshowNumberENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;printCRPROCNEAR movdl,0aH movah,02H int21H movdl,0dH movah,02H int21H retprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。 此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....dataaresegmentDATADW3322H,4555H,200H,3544H,1245HnumDB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dataareMAINPROCFARstart:
pushds movax,0H pushax movax,dataare movds,ax movdx,0H ;偶数数量计数 movcx,Wordptr[num] movsi,0HisO: movbx,WORDPTRDATA[si] shrbx,1H jncaddDX jmpcommonControladdDX: ADDdx,1H cmpdx,1H je firstAXValuecompare: movbx,WORDPTRDATA[si] cmpbx,ax jgecommonControl movax,bxcommonControl: ADDsi,2H loopisO jmpexitfirstAXvalue: movax,WORDPTRDATA[si] jmpcompareexit: retMAINENDPcodeendsENDstart5.8没有做。。5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。.modelsmall.386.codemainprocfarstart:pushds
movax,0pushaxmovax,0movcx,4movdx,0input:movah,1Hint21Hcmpal,30Hjl input cmpal,39H jlescmpal,61Hjl inputcmpal,66Hjg inputsubal,27Hs:subal,30Hadddl,alcmpcx,1Hje froldx,4f:loopinputexit:callprintretmainendpprintprocnearmovcx,10Hp: roldx,1pushdxanddx,1adddx,30Hmovah,2int21Hpopdxlooppretprintendp
endstart5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUNXXXX"显示出次数。.modelsmall.386.dataENG db"SUN"sSUNJAVA",24H;;;;24H=$MESSAGEdb"SUN:","$".stack100H.codeMAINPROCFARstart: PUSHDS ANDAX,0 PUSHAX MOVAX,@data MOVDS,AX ;------------------------ MOVAX,0H MOVSI,1HsubSI1: SUBSI,1HsubSI2: SUBSI,1HcompareS: ADDSI,1H MOVDL,ENG[SI] CMPDL,24H JE print CMPDL,53H JNEcompareScompareU: ADDSI,1H MOVDL,ENG[SI] CMPDL,55H JNEsubSI2compareN: ADDSI,1H MOVDL,ENG[SI] CMPDL,4EH JNEsubSI1 INCAX
JMPcomparesprint: LEADX,MESSAGE PUSHAX MOVAH,09H INT21H POPAX callshowNumberexit: retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum: DAA MOVdx,ax MOVcl,4Hshow: ROLdx,4H pushdx ANDdx,0fH ADDdx,30H MOVah,02H int21H popdx loopshow retshowNumberENDPENDstart5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。.modelsmall.386.codeMAINPROCFARstart: pushds movax,0 pushax movcx,0input:
movah,1H int21Hcompare: cmpal,24H je print cmpal,30H jl addCount cmpal,39H jg addCountaddCount: addax,1H jmpinputprint: callshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum: DAA MOVdx,ax MOVcl,2Hshow: ROLdl,4H pushdx ANDdl,0fH ADDdl,30H MOVah,02H int21H popdx loopshow retshowNumberENDPENDstart5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。.modelsmall.386.stack100H.datamemdw
12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2.codeMAINPROCFARstart: pushds andax,0 pushax movax,@data movds,ax;---------------------- movax,0H movbx,64H movcx,64H movsi,0FFFEHrepeat: ADDsi,2H cmpMEM[si],0H JE calls looprepeatcalls: INCax callsort cmpax,1H JE lastValue DECcx jmprepeatexit: retlastValue: movmem[bx],0H DECcx jmprepeat MAINENDPsortPROCNEARpushcxpushsisubsi,2Hs:addsi,2H
movdx,mem[si]movmem[si+2],dxloopsreturn:popsipopcxretsortENDPENDstart第七章1、 答:CLRBMACRON,ARRAYCLDMOVCX,NMOVAL,20HLEADI,ARRAYREPSTOSBENDM2、答:WAGESMACRORATE,HOURMOVAL,RATEMOVBL,HOURMULBL;计算周工资;ADDAX,AXADDAX,AX;一个月有4周MOVWAG,AX;暂存中间结果ADDBL,BLADDBL,BL;计算月出工小时数MOVAL,BLMOVAH,0MOVBL,10DIVBLMOVBL,3MULBL;计算奖金ADDWAG,AX;计算工资总数ENDM宏展开:1MOVAL,R11MOVBL,42
1MULBL1ADDAX,AX1ADDAX,AX1MOVWAG,AX1ADDBL,BL1ADDBL,BL1MOVAL,BL1MOVAH,01MOVBL,101DIVBL1MOVBL,31MULBL1ADDWAG,AX3、答:(1)调用有效1PUSHAX2MOVAX,P12SUBAX,P21CMPAX,01JGE??00001NEGAX1??0000:MOVDISTANCE,AX1POPAX(2)调用有效1PUSHAX2MOVAX,[BX]2SUBAX,[SI]1CMPAX,01JGE??00011NEGAX1??0001:MOVX[DI],AX1POPAX(3)调用无效,有错误指令1??0002:MOV240H,AX(4)调用有效,但无意义宏展开略。4、答:SENDMACROSCHARS,DCHARSLOCALNEXT,EXITPUSHAXPUSHSIMOVSI,0
NEXT:MOVAL,SCHARS[SI]MOVDCHARS[SI],ALCMPAL,24HJZEXITINCSIJMPNEXTEXIT:POPSIPOPAXENDM5、答:BIN_SUBMACROOPERAND,COUNT,RESULTLOCALNEXTLEABX,OPERANDMOVCX,COUNTDECCXMOVAL,[BX]NEXT:INCBXSUBAL,[BX]LOOPNEXTMOVRESULT,ALENDM7、答:宏展开:2DATA0DW?2DATA1DW?9、答:1MOVTAB,01MOVTAB+1,11MOVTAB+2,21MOVTAB+3,31MOVTAB+4,41MOVTAB+5,51MOVTAB+6,610、答:STOREMACROXIRPCX,0123456
MOVTAB+&X,XENDMENDM12、答:FINSUMMACROX,Y,SUMMOVAX,XMOVBX,Y.IFAX>BXADDBX,BXADDAX,BXMOVSUM,AX.ELSEADDAX,AXADDAX,BXMOVSUM,AX.ENDIFENDM14、答:DOS21MACRODOSFUNC,BUFFIFNBáBUFF?MOVAH,DOSFUNCMOVDX,OFFSETBUFFINT21HELSEMOVAH,DOSFUNCINT21HENDIFENDM展开宏调用:1MOVAH,011INT21H1MOVAH,0AH1MOVDX,OFFSETIPFIELD1INT21H '
您可能关注的文档
- 毛泽东思想和中国特色社会主义理论体系概论课后答案2010.doc
- 毛论第二章课后思考题(参考答案).doc
- 毛邓三课后思考题答案.doc
- 毛邓习题(附答案).doc
- 毛邓课后答案.doc
- 民法练习参考答案.doc
- 气相色谱复习题和答案.doc
- 水文学课后答案.doc
- 水污染控制课后答案(考试重点).doc
- 汉语史复习题和答案.doc
- 江苏2011年会计证考试会计电算化课后练习及答案(1).doc
- 汤姆索亚历险记练习题(附答案).doc
- 汽车维修工程复习题及答案.doc
- 汽车维修课后答案.docx
- 汽车车身结构与设计 习题与解答(已编辑版).doc
- 沪教版小学语文三年级(上)18 《爱迪生孵小鸡》 课外、课后练习和作文课课练及答案.doc
- 沪教版小学语文三年级(上)19 《牛顿在暴雨中》课外、课后练习和作文课课练及答案.doc
- 沪教版小学语文四年级(上)1 老师领进门 课文阅读练习及课后练习答案.doc