admin 管理员组

文章数量: 1086019


2024年1月25日发(作者:计算机编程题目及答案)

汇编语言程序设计(第二版)课后习题答案第二章1.解答:有256个2.解答:如下图.第一个络子为E51E000B0H字单元,注意,是字单元,第五个格子为000B3H字单元3C2A3.解答:30022H字节单元内容:30021H字单元内容:4.解答:这三个物理地址都是5.解答:CS+IPABH30024H字节单元内容:30022H字单元内容::0AAA40HEFHAB34HCDABH3017AH,说明了不同的段地址和偏移地址对应同一物理地址第一个字的物理地址为6.解答:条件标志OF,SF,ZF,CF,的值依次为:0,0,0,07.下列操作可使用那些寄存器?(1)加法和减法(2)循环计数(3)乘法和除法(4)保存段地址AX,BX,CX,DX,当然,还有这几个通用寄存器的高低位了,CXDX,AX,AH,ALCS,DS,ES,SSOFLAGSIPBP,SP,SSBX,SP,BP,DI,CS,DS,SI,ES,SS,IP11--G10--H13--I8--J7--K6---L1--M15--如AH,AL等(5)表示运算结果为(7)(6)将要执行的指令地址将要从堆栈取出数据的地址8.可以用来指示存储器地址的寄存器有:9.一一对应;5--A4--B2--C3--D12--E9--FN14--O第三章1.(1)立即寻址(2)直接寻址(3)使用BX的寄存器寻址(4)使用BX的间接寻址(5)使用BX的寄存器相对寻址(6)基址变址寻址(7)相对基址变址2.根据下列要求,写出相应的汇编指令。(1)ADD(2)(3)(4)(5)DX,BXCXADDAL,[BX][SI]ADD[BX][0B2H],MOVAX,2A59HADDAL,0B5H没有7237H没有637DH0D5B4H8E18H004FHADD[0524H],AX3.(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,试说明下列各条指令执行完后,存器的内容。(1)MOV(2)(3)(4)MOV上(5)MOV(6)(7)MOVLESMOV(1)064DH8.(1)MOV(2)MOV(3)MOV(5)(6)(7)(9)(11)(12)1100[BX]AX,[BX][SI]AX,1100[BX][SI](2)BX,2000HDI,[BX]AX,ES:DI(3)05E0H立即数寻址寄存器寻址直接寻址直接寻址寄存器间接寻址直接寻址寄存器间接寻址同上寄存器相对寻址同上基址变址寻址相对基相变址寻址201A0H201F0HMOVZREO,AXMOVZREO,AX20110H20150H20100H21100H20010H200A0H注意有符号数的符号位无物理地址同上20100H20050H0600H(3)098AH65B7H4C2AH7856HAX,[BX]3412H同MOVMOVAX,1200HAX,BXAX,[1200]1200H0100H4C2AH注AX寄意,是字单元!!5.(1)7CD9H7.转向地址OBJ的值分别为:(2)0691HAX,0ABHAX,BXAX,[100](4)MOVAX,VALMOVAX,[BX]MOVAX,ES:[BX]MOVAX,[BP]MOVAX,[BX+10]MOVAX,[BX][SI]MOVAX,VAL[BX][SI]MOVAX,[BX][0CH]MOVAX,ARRAY[BX](8)MOVAX,[SI](10)MOVAX,VAL[BX]9.(1)的指令:(2)的指令:

,TABLE是把符号地址是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234HLEAAX,TABLETABLE的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H11.执行完指令后,(AX)=,CSTRINGMOVDL,AXMOVDH,[AX+6]13.课本上,[2000]MOVAX,ES:[BX]一条指令的话为15.运算结果(1)74D4H(2)(3)(4)(1)(2)(3)(4)A5C1H4240H0000H5D14A870D87034E4SUBAX,XADDAX,WMOVZ,AX(2)MOVAX,RADDAX,9MOVBX,XADDBX,6ADDAX,BXMOVBX,WMOVZ,BX(3)MOVAX,WIMULXMOVBX,YADDBX,6IDIVBXMOVZ,AXMOVR,DX;把W送到AX;W*X;把Y送到BX里;Y+6;(W*X)/(Y+6);把商送到Z中,;把余数送到R中注意:商保存在AX里,余数保存在DX里注意:低十六位保存在AX里,高十六位保存在DX里;R+9;X送到BX中;X+6;(R+9)+(X+6),结果保存在;W送到BX中;最终结果送到Z中AX中;Z-X;W+(Z-X);结果保存在Z中10;把Z送到AXMOVAX,ES:[8000H]SF,ZF,CF,OF各位的值(从左至右依次往下)010010016.接上表17.(1)MOVAX,Z;R送到AX中SUBBX,AX;W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和

(4)MOVAX,WSUBAX,XCWD高十六位保存在MOVBX,5IDIVBX位IMULY;上一步结果再乖以Y,积为32位DX中;把5送到BX中;(W-X)/5被除数为32位,除数为16位商为16;把W送到AX中;W-X;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,MOVBX,2IMULBXMOVZ,EAXMOV[Z+4],EDX18.指令MOVAX,1234H0MOVCL,40ROLAX,CL0DECAX0MOVCX,400MULCX0INT20H程序结束后,(19.指令OF的值MOVAX,00010DECAX100;把2送到BX中;上一步乘法所得的积再乘以2,各为;把结果中低32位放入Z双字单元中;把结果中高32位放入Z+4双字单元中本条指令执行完后AX的内容1234H01234H02341H02340H02340H8918H0AX)=8918H(DX)=0000H执行完后AX的内容0FFFFH64位执行完后CF,SF,ZF的值001110执行完后CF,SF,ZF和0

ADD0000ADDAX,2NOTAX01SUBSUB101ANDAX,58D1HSALAX,1SARAX,1NEGAXRORAX,120.(1)MOVAX,DATAXADDDATAY,AX(2)MOVAX,DATAXADDDATAY,AXMOVAX,[DATAX+2]ADD[DATAY+2],AX58D1HB1A2HD8D1H272FH9397HAX,0FFFFHAX,18000H0000H8000H7FFEH7FFFHADDAX,8000HFFFFH(3)本組指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF法 ̄(4)MOV裏(5)MOVAX,DATAXMOVDX,[DATAX+2]MUL在EAX裏(6)MOVAX,EGAXSBBDX,0,AMOVDX,[A+2]TESTDX,8000HDATAY17HDWORDDATAY;結果的高三十二位保存在AX,DATAXDATAY;結果的高十六位保存在MUL的值)帶進位加DX裏,低十六位保存在AXEDX裏,低三十二位保存;結果商保存在AL中,余數在AH中(7)MOVAX,DATAX;把雙字長數的低字放到;把雙字長數的高字放到;測試雙字長數的符號AX中DX中

JZNEGDXNEGAXRIGHT;如果是非負數,則直接保存;如果是負數,則求補SBBDX,0RIGHT:MOVB,AXMOV[B+2],DX23.每條指令單獨執行完後的結果依次為:(1)9AH25.(1)把53D乘以2的程序:MOVAX,35HSHLAX,1(2)把53除以2的程序:MOVAX,35HSHRAX,126.這段程序完成的功能是:把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)从左到右把LEASI,CONAMELEADI,PRLINEMOVCX,20CLD送)REPMOVSB;传送CONMAE中的字符串传送到PRLINE中的程序实现:(2)从右到左把CONMAE中的字符串伟送到PRLINE的程序实现:SI中DI中的偏移地址送到;把CONAME中第一个字节的偏移地址送到;把PRLINE中第一个字节;把重复次数放到CX里;53D=35H(2)61H(3)0FBH(4)1CH(5)0(6)0E3H24.執行指令序列後,BX的內容為:0DAH;让SIDI从低地址指向高地址(即从左到右传LEASI,CONAMELEADI,PRLINEMOVCX,20STD;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址AX的程序實現:REPMOVSB(3)把CONAME中的第三和第四個字節裝入LEASI,[CONAME+3]LODSW(4)把AX寄存器的內容存入從LEADI,[PRLINE+5]STOSW(5)檢查CONAME字符串中有無空格字符,如有把它偉送給LEADI,CONAMEMOVCX,20MOVAL,20HCLD;把重複次數放到;把空格符的;從低到高BH寄存器的程序實現:DI中CX中;把CONAME中第一個字符偏移地址放入ASCII值放入AL中PRLINE+5開始的字節中的程序實現:

;比較;把檢查到的空格符送到;把重複次數放到;初始化SI;把&字符的ASCII值放入AX;依次查找;找到了就退出;把空格符的;用空格符代替&PRINT_LINE域的程序实现:ASCII值勤放入AX中BH中CX中。這裏用十六進制表示MOVBH,[DI-1]RMOVCX,12HMOVSI,0MOVAX,26HCHECK:CMPAX,STRING[SI]INCSILOOPNECHECKMOVAX,20HMOVSTRING[SI-1],AX31.(1)用空格符清除MOVAL,20HLEADI,PRINT_LINEMOVCLDREPSTOSBCX,132(2)在STUDENT_ADDR中查找第一个“_”的程序实现:MOVAX,2DHMOVSI,0MOVCX,9;依次檢查STUDENT-ADDR中的字符是否為CHECK:CMPAX,STUDENT_ADDR[SI]INCSILOOPNZCHECK(3)在STUDENT_ADDR中查找最后一个MOVAX,2DHMOVSI,9MOVCX,9CHECK:CMPAX,STUDENT_ADDR[SI]DECSILOOPNZCHECK(4)程序實現:MOVAL,2OHLEADI,STUDENT_NAMEMOVCX,30CLDREPZSCASBJZSTORE;用*代替空格STORE:MOVAL2AHMOVCX,30;把空格符的ASCII值放入AL中DI中CX中;把STUDENT_NAME中第一个字符偏移地址放到;把重复次数放到;让DI从低位移到高位;如果有不是空格符的,就退出;如果全是空格符,就转到STORE中“_”的程序实现:SI的初始化為9;和第二題不同的就是這次是從右到左查詢,所以;;把“—”的;初始化SI;把重複次數放入CX中“_”,找到第一个停下来ASCII值放入AX

STD;注意,这里是把前面从低到高移动的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,CXJAEXCEED(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,,LENL

(2)可以引起转移到(3)可以引起转移到(4)可以引起转移到(5)可以引起转移到(6)可以引起转移(7)可以引起转移,STAUS[SI]ANDAL,2AHL1的指令有:L1的指令有:L1的指令有:L1的指令有:到L1的指令有:到L1的指令有:NB同上同上B,BE,L,LE,NBE,NL,NLE同(3)同上;把要测试的字节放到AL中0的数--2AH,;把第一,三,五位为一其他位为AL中;如果结果为;如果结果为;0,则三位都为10;前面相与的结果再与0,则三位都为2AH异或与这个字节比较,结果放到JZROUTINE_4XORAL,2AHJZROUTINE_1BSFBL,ALBSRBL,ALCMPBL,CL;如果向前和向后测试后,第一个有两个1JEROUTINE_2ROUTINE_11的位置相同,说明只有一个1,则异或运算前有AL中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.P10140.(1)00003100H41.(1)目的地址:2004H(2)目的地址:(3)目的地址:92H6DHA2H42.(1)PUSHAX(SP)<------(SP)-2(SP+1)<-----(AH)(2)POPESI(ESI)<-------((ESP)+3,(ESP)+2,(ESP)+1,(ESP)<-------(ESP)+4(3)PUSH[BX](SP)<------(SP)-2(SP+1)<-----([BX+1])(4)PUSHAD(ESP)<-------(EAX)(ESP-4)<-------(ECX)(SP)<------([BX])(ESP))(SP)<------(AL)(2)5100H内容依次为:384CH4CH(3)7100H56HF4H91H23H34H98HF2H01H内容依次为:寄存器,无物理地址 ̄内容依次为:

(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)<-----0SP)<------443.(1)2CEFF93H(2)24B76A0H(3)9090804H(4)6F13ADH44.(1)0FFFFFFFCH(2)0FFFFFFF8H(3)00000007H(4)00000099H45.(EAX)=0(EBX)=25d46.(AX)=3d(DX)=,EDXADDECX,ESIMOVEDI,,DX,100H执行的操作是:(BX)<-------(DX)*100H49.程序实现:MOVAL,BLCBWIDIVCLIMUL2MOVDX,是直接跳转,执行的操作是:(IP)<-----(IP)+(DI)JMP[DI]是间接跳转,执行的操作是:(IP)<----(IP)+([DI])跳转到内存单元中的指令地址51.假设数组名为NUMBERS,程序如下MOVBX,0;后面用到MOVCX,100H;把循环次数放入CXMOVAL,42HMOVSI,0;初始化SI;CHECK用来实现查找功能 ̄CHECK:CMPAL,NUMBERS[SI]INCSIDI中所指向的

JBJASTORE1STORE2INCBL;大于42H的数的个数存入;小于42H的的数的个数存入;相等继续循环;找到一个大于UPDOWN中LOOPCHECKSTORE142的数,BL值增加1MOVUP,BLLOOPCHECKSTORE2INCBHMOVDOWN,BHLOOPCHECK第四章1.指令下列指令的错误(1)MOVAH,BX(2)MOV[BX],[SI](3)MOVAX,[SI][DI]源操作数与目的操作数长度不相同 ̄这是两个内存单元在传递数据,而这在汇编语言中是不允许的不能用两个变址连用,其中一个应为基址同(2)必须有一个为寄存器OFFSET不能与复杂操作数相连(4)MOVMYDAT[BX][SI],ES:AX(5)MOVBYTEPTR[BX],1000(6)MOVBX,OFFSETMYDAT[SI](7)MOVCS,AX(8)MOVECX,AX2.(1)合法(2)合法(2)非法3.(1)非法,操作数类型不同不能对CS赋值操作数类型不同(3)非法(4)非法(3)非法,不允许两个内存单元直接传递数据(4)合法(5)合法(6)合法(7)非法,必须有一个寄存器(8)非法,两个内存单元地址相加没有意义(9)合法(10)非法,同(3)4.(1)两内存单元传递数据(2)操作数类型不同(3)跳转指令只能跳转到符号地址(4)转移指令后不能为变量,只能为标号(5)格式不对,6.(1)DW5150HADDRESSSEGMENTDBDBDB'personal20Hcomputer'10DUP(32),AX(2)MOVAX,FLD1BFLD2BFLD3B应为NEARPTR

FLD4BFLD5BFLD6BFLD7BFLD1WFLD2WFLD3WFLD4WFLD5WFLD6W9.L的值为7DBDBDBDBDWDWDWDWDWDW01011001B'32654'10DUP(0)'PART1',DUP200FFF0H01011001BFLD7B5,6,7,8,95DUP(0)(FLD6W-FLD1W)-(FLD7B-FLD1B)(?),'PART2',DUP50(?),'PART3',DUP14(?)的值为22,GE表示该数据段的长度10.(1)MOVAX,OFFSET(3)CODE_LENGHT11.代码如下:DATA_SEGDB5DW0FFFFH,0,2,5,4,ENDSSEGMENT5DUP(?)DATA_LISTDATA_SEGCODE_SEGMOVAX,5MOVMAX,AXMOVAX,0FFFFHMOVMIN,AXCODE_SEGENDS12.(1)10025(2)19(3)2548(4)3(5)103(6)0FFFFH(7)1(8)313.分别汇编成为:MOVAX,0AHMOVBL,0AHMOVCL,1改为:DATA_SEGSEGMENT14.(1)(AX)=1(2)(AX)=2(3)(CX)=14H(4)(DX)=32H(5)(CX)=1]15.(1)操作符错误(2)缺少段名(3)引用应该从;开始(4)结构混乱……MAIN_PROCEND16.程序框架如下:DATA_SEGORG0E000HSEGMENT;定義數據段;讓下一字節地址為0E000HENDP改为:MAIN_PROCPROCFAR在前面加个段名把那个“/”改成“;”SEGMENTLNAMEEQU$-CODE_LIST(2)MOVSI,WORDPTRCODE_LISTASSUMECS:CODE_SEG,DS:DATA_SEG

FIRST_TYPE移地址的操作數EQUTHISWORD;建立一個與下一存儲單元有相同段地址和偏;給DATA_GROUP分配100個字節的空間;數據段結束;定義堆棧段;讓下一字節從小段首地址開DATA_GROUPDB100DUP(?)DATA_SEGENDSSTACK_SEGSEGMENTALIGN16始STACKDB100DUP(?);為堆棧分配空間STACK_SEGENDS;CODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGORG1000H;讓下條指令的第一個字節從始START:MOVAX,DATA_SEGMOVDS,AXMOVAX,STACK_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)第五章1.程序實現:(經DEBUG調試通過)開1000H

codesegmentmainprocfarstart:int21hmainendpcodeendsendstart2.程序實現:(經codesegmentagain:codeendsend3.程序實現:(經codesegmentax,0f0fehcl,4ax,clal,0fhdl,al調試通過)調試通過);把AX的最高四位;移到最右面;再把AL的高四位清assumecs:codemovah,1hsubal,20hmovah,2movdl,alint21hassumecs:codemovah,1hint21hsubal,1hmovcl,3movdl,almovah,2int21hincalloopagainassumecs:codemovmovroland0movrolax,clandal,0fhmovcl,alDEBUGDEBUG

rolax,clandal,0fhmovbl,alrolcodeendsend4.程序實現:(經DEBUG調試通過~~)ax,clandal,0fhdatasegment(?)string1!','$'dataendscodesegmentMAINPROCFARstart:axinfoinputinfoinputcheckdxstring1db20,0,20dupstring2db20,0,20dup(?)string3db'pleaseinputstring5db'match!','$'string6db'nomatch!','$'assumecs:code,ds:datapush;保護現場pushbxpushcxpushdxmovax,datamovds,axmovdx,offsetstring3call;在屏幕上輸出提示信息movdx,offsetstring1callmovdx,offsetstring4call;在屏幕上輸出提示信息movdx,offsetstring2callcall;比較兩個字符串pop;寄存器出棧;在第一緩衝區輸入字符串;在第二緩衝區輸入字符串

popcxpopbxpopaxmainendp;輸入字符串到緩衝區的過程INPUTPROCNEARpushaxmovah,0AHintretINPUTENDP;在屏幕上輸出提示信息的過程INFOPROCNEARpushaxmovah,9intcallcrlf;回車換行popaxretINFOENDP;回車換行的過程pushdxpushaxmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hpopaxpopdxretCRLFENDP;比較兩字符串是否相同並且在屏幕上輸出相應信息的過程CHECKPROCNEARpushaxpushcxpushsipushdimovax,0movcx,0CRLFPROCNEAR21h21hpopax

movcl,string1+1movsi,2movdi,2re:moval,string1[di]cmpal,string2[si]jnznoincdiincsideccxjnzremovdx,offsetstring5callinfojmpexitno:movdx,offsetstring6callinfoexit:popdipopsipopcxpopaxretCHECKENDPcodeendsendstart5.程序實現:(經DEBUG調試通過)datasegmentinfo1db'PLEASEINPUTANUMBER','$';提示信息,下同info2db'WRONGNUMBER!PLEASEINPUTANOTHERNUMBER!','$'非數字值,報錯,並提示輸入新的數字dataendscodesegmentMAINPROCFARassumecs:code,ds:datastart:movax,datamovds,axmovdx,offsetinfo1callinfo提示輸入一個數字;如果鍵入;

入過程查是否非數字字符響鈴N次,N為鍵入數字MAINENDP;在屏幕上輸出提示信息的過程INFOPROCNEARINFOENDP;回車換行的過程CRLFPROCNEARCRLFENDP;輸入的過程INPUTPROCNEARINPUTENDP;檢查是否非數字字符的過程 ̄CHECKPROCNEARpushdxcmpal,30h30H,jbWRONGcmpal,39hcallinput;輸callcheck;檢callbell;retpushaxmovah,9hint21hcallcrlfpopaxretpushaxpushdxmovdl,0dhmovah,2hint21hmovdl,0ahmovah,2hint21hpopdxpopaxretmovah,1int21hret;如果鍵入的字符ASCII值小於0的ASCII值;剛轉入WRONG,作錯誤處理如果鍵入的字符ASCII值大於9的ASCII值39H,;

jaWRONGmovcl,aljmpnext;錯誤處理過程,提示,並等待用戶鍵入新值WRONG:movdx,offsetcallcallcallnext:popdxretCHECKENDP;根據用戶鍵入的數字,響鈴相應的次數BELLPROCNEARpushdxsubcl,30hmovdl,7hmovah,2re:int21hdeccxjnzrepopdxretBELLENDPCODEENDSENDSTART6.程序實現。(末经调试).inprocfarstart:movax,@datamovds,axcall數組callmainendpdisplaycheck_storedbdbdup20,0,20(20個數)dup(?)db20,0,20infoinputinfo2;則轉入WRONG,作錯誤處理;把合法的數字ASCII值放入CL中check;鍵入數字的ASCII值減去30,才能成為次數;用于存放负数的最大容量为20的数组dup(?);同上,用于存放正数;判斷數的正負並存入相應;在屏幕上顯示

check_storeprocnear入CX向增加的方向移動地址放入SIagain:放入AL中0比較則存入負數組剛存入正數組store_in_n:pushbxmovbl,n[1]movn[bl+1],alpopbxjmpagainstore_in_pSTORE—IN—Pexit:check_storeendpdisplayprocnearpushaxpushbxpushcxmovcx,20;循環次數放cld;使SIleasi,m;M的偏移moval,[si];M中的數依次cmpal,0;並且依次和jlstore_in_n;如果小於0,jgstore_in_p;如果大於0,deccxjnzagainjzexitBL中,;把AL中負數存入數組N的最後一個數字的下一字節pushbxmovbl,p[1]movp[bl+1],alpopbxjmpagainpopcxpopbxpopaxretpushcx;N中已有數的個數放入

leasi,n[2]數放入CLre_display_n:間隔;下面四行用來回車和換行;同上面負數的顯示,re_display_p:displayendstart7.程序實現。(未調試).art:八位無符號正數movcl,n[1];數組N中數的個cldmovah2;依次顯示各個負數movdl,[si]int21hmovdl,20h;各個數之間用空格int21hdeccljnzre_display_nmovdl,0dhint21hmovdl,0ahint21hleasi,p[2]movch,p[1]cldmovdl,[si]int21hmovdl,20hint21hdecchjnzre_display_ppopcxretendpdatadb100ddup(100個數).movax,@datamovds,axmovcx,101d;循環次數movbl,0feh;初始化BX為最大的

movsi,offsetcldagain:deccxjzfinishmoval,[si]cbwdiv2cmpal,0數jnecmpbl,[si]jl數jmpagainfinish:movax,0moval,bl中endstart8.程序實現。(未調試).art:movch,9movcl,2movdl,0again:decchjzdisplayrolandcmpbl,3jnzjmpdisplay:movah,2intendstart9.程序實現:21hagainagain;在屏幕上輸出DL內容incdlax,clbl,3;如果“四分之一字節”不為;否則,DL增加一movbl,al;比較次數放入CH;每次AX循左移的次數放入samllagainmovbl,[si]again2data;全部判斷完成;每個數除以;佘數不為0的,不是偶;每次比較,;較小的數,;代替BX中原來的;把最小偶數放到AXCL;初始化DL,DL,中存放“四分之一字節”為三的個數;如果AX最後兩個字節循環結束,;則在屏幕上輸出為“3”的個數3,;則判斷下一個“四分之一字節”

.fo1info2db'PLEASEINPUTANUMBER!',0DH,0AH,'$';提示信息,下同db'ILLEGALCHAR,PLEASETYPEITAGAIN!',0DH,0AH,'$'.codemainprocfarstart:PUSHaxpushbxpushcxpushdxmovax,@datamovds,axmovdx,offsetinfo1calldis_str上顯示提示信息callinput_num進制數calldis_num上輸出二進制數popdxpopcxpopbxpopaxRETmainendp;在屏幕上顯示提示信息的過程dis_strprocnearpushaxmovah,9int21hpopaxretdis_strendp;輸入一個四位十六進制數,並保存在BX中的過程input_numprocnearpushax;在屏幕;輸入十六;在屏幕

六進制數的位數!)new_char:換成為二進制數小,說明不是數字,,,轉往非法字符處理過程,直接放入BX中A--F,減去7,(10H)相比,16D,說明不是數字,轉入非法字符處理過程add_to:移四位字wrong:exit:input_numendppushcxmovbx,0movch,4movah,1int21hsubal,30hcmpal,0jlwrongcmpal,9jleadd_tosubal,7cmpal,16jgwrongmovcl,4shlbx,clmovah,0addbx,axdecchjzexitjmpnew_charpushdxmovdx,offsetinfo2calldis_strpopdxjmpnew_charpopcxpopaxret;初始化BX;循環次數(十;把ASCII值轉;和0相比,;如果比0;是否A--F?;如果是0--9,;如果是;再和16D;如果大於;BX每次左;輸入新的數

;在屏幕上輸出二進進制數的過程dis_numprocnearre:dis_num10.程序實現,(DEBUG調試通過).gdb'hello,$';用作測試的字符串,共有三個infodb'sun','$'.codemainprocfarstart:movax,@datamovds,axmovcx,0movdi,0again:moval,24h值cmpal,eng[di]jzexit~~moval,73hcmpal,eng[di]movcx,16movah,2rolbx,1movdl,blanddl,1adddl,30hint21hdeccxjnzreretendpendstartare?hi,areyousun?sunisabeutifullgirl!suSUN;初始化CX;24H,字符串結束標誌$的ASCII;檢查當前字符是否是‘$';如果是結束標誌,就退出;73H,字母s的ASCII值;檢查當前字符是否是's',下同

jnznext1incdimoval,75h值,cmpal,eng[di]jnznext2incdimoval,6ehcmpal,eng[di]jnznext2inccl中next1:incdinext2:jmpagainexit:movdx,offsetmovah,9int來adddl,30hmovah,2intretmain11.程序實現;(未調試).rdb255,0,255存入輸入的字符inprocnearstart:movax,@datamovds,axmovbx,0movdx,offsetmovah,9info1db'PLEASEINPUTSOMECHARS,ENDWITH"$"!','0DH','0AH','$'db'THENUMBEROFTHECHARSWHICHARENOTNUMBERSIS:$'dup(?);定義一最大值為255字節的字符緩衝區用於endpendstart21h21h;把CL中SUN的個數顯示出movdl,clinfo;繼續第一步 ̄;SUN單詞的個數放進CX;75H,字母U(小寫)的ASCII

int21hmovdx,offsetstrmovah,0ahint21h義的緩衝區movsi,2again:moval,str[si]cmpal,24h$就退出 ̄jzexitcmpal,30h;如果小於30H,(0jlyescmpal,39h;如果大於39H,jgyesincsi下一字符,jmpagainyes:incsiincbl符的個數jmpagainexit:movah,9movdx,offsetinfo2int21hmovcl,100字字符的個數轉換成為十進制,並在屏幕上顯示的過程calldiv_dismovcl,10calldiv_dismovcl,1calldiv_disretmainendpdiv_disprocnearmoval,blcbw;提示信息;輸入字符到定;初始化SI;;如果是字符串結束標誌的ASCii值),就是非數字字符(9的ASCii值),也是非數字字符;使SI指向;用BL記錄非數字字;提示信息;以下為把BL中非數

divclmovbl,ahmovdl,aladddl,30hmovah,2intretdiv_disendpendstart21h;把二進制轉換成字符


本文标签: 地址 指令 字符 单元 寻址