汇编试题库.pdf
以下加*的题不要求;加*的题本学期不要求。L显示数据区中的一个字符DATA SEGMENTA DB yDATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV DL,AMOV AH,2INT 21HMOV AH,4cHINT 21HCODE ENDSEND START;取要显示的字符到D L中;调2 号 DOS系统功能调用显示一位二进制码;利用4CH号 DOS系统功能调用退回DOS2.显示数据区中的一个十进制数字DATA SEGMENTA DB 8DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV DL,AADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START;取要显示的字符到D L中;将十进制数字变成ASCH码;调2 号 DOS系统功能调用显示一位二进制码;利用4C H 号DOS系统功能调用退回DOS3.10以内的加法程序并显示结果DATA SEGMENTA DB 6B DB 3DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVDL,A;取一个加数到DL中ADDDL,B;加另一个加数ADDDL,30H;将和变成ASCII码MOVAH,2;调2 号 DOS系统功能调用显示一位二进制码INT21HMOVAH,4CH;利用4CH号 DOS系统功能调用退回DOSINT21HCODE ENDSEND START4.以二进制形式显示一个字符的ASCII码DATA SEGMENTADBA,BDBCDBB,0DH,0AH,$DATAENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXLEADX,B;取“A)=$首地址至ij DX 中MOVAH,9;利用9 号 DOS系统功能调用显示(A)=INT21HMOV BL,A;取要显示的字符到B L中MOVCL,8;循 环 8 次,每次显示一位NEXT:MOVDL,0;2 号 DOS系统功能调用要求将欲显示的;字符的ASCII码放至D L中SALBL,1;欲显示的字符左移一位,移出部分到C F中RCLDL,1;移出到C F中的部分移到D L中ADDDL,30H;移入D L的可能是1,也可能是0,变成ASCII码MOVAH,2;调2 号 DOS系统功能调用显示一位二进制码INT21HDECCL;循环次数减1JNENEXT;如果减1 后不到0,转 NEXTLEADX,C;取变量C 的首地址到DX 中MOVAH,9;利用9 号 DOS系统功能调用显示单位“B”及回车换行INT 21HMOV AH,4CHINT 21H;利用4CH号 DOS系统功能调用退回DOSCODE ENDSEND START5.二进制数转换为十进制数将 DO起字单元中存放的1 6 位二进制数转换为十进制数,并将其ASCII码存入DI所指向的缓冲区BUF中,最后显示出来。程序如下所示:DATASEGMENTBUFDB 5 DUP(?);预留5 单元空间DODW 2A5HDATAENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDI,OFFSET DO;将D I指向BUF的下一单元MOVAX,DO;取要用来变十进制数的数到AXMOVBX,10;准备除以10MOVCX,0;准备统计余数的个数CHANGE 10:DECDI;准备存放余数,往前倒存INCCXMOVDX,0;将除数的高16位(在 D X 中)清 0,DX也将用来存放余数DIVBX;DX,AX 除以 BX(BX=10)ADDDL,30H;余数变为ASCII码值MOVBYTE PTRDI,DL;存储十进制数CMPAX,0;是否为0?JNZCHANGE 10;不为 0 转 CHANGE10CHANGE11:MOV DL,BYTE PTRDI;取出存放在BUF中的卜进制数到DL供显示MOVAH,2;显 示 1个字符INT21HINCDILOOPCHANGE 11MOVAH,4CH;程序结束并返回DOSINT21HCODEENDSENDSTART6.A S C II码表示的十进制数转换为二进制数并显示将 S I指向的缓冲区BUF中保存的五位ASCII码卜进制数(0-65535)转换成对应的二进制数并存放在D X 中,再以二进制形式显示。DATA SEGMENTBUF DB 25092,C DB,B;0DH,0AH;$,DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSLOFFSETBUF;将BUF的地址放到S I中MOVDX,0;清D X为0;MOVCX,5;置循环次数为5MOVBX,10GET_ASC:MOVAL,SI;取出一个字符CMPAL;0,;必须保证5个数都是十进制数(0-9)JBEXITCMPAL,*9JAEXIT;判断是否是“0”-“9”DEC_BIN:SUBAL,30H;减30H变二进制数MOVAH,0PUSHAX;转换为对应的数并置于A X中,转存堆栈MOVAX,DXMULBX;A X内容乘10MOVDX,AXPOPAXADDDX,AX;(DX)-(D X)*10+(AX)INCSI;使指针S I指向下一个字符DECe xJNZGET_ASCMOVBX,DX;取要显示的字符到B L中MOVCL,16;移16次,最大数64000NEXT:MOVDX,0SALBX,1RCLDX,1ADDDX,30HMOVAH,2INT21HDECCLJNENEXTLEADX,C;取C的地址,以便显示单位B与回车换行MOVAH,9INT21HEXIT:MOVAH,4CHINT21HCODEENDSEND START7.二进制数到十六进制数的转换二进制整数转换为ASCII码十六进制数的基数为16,显示时注意从9到A,ASCII码跳了 7!其他类似于例4.8。DATA SEGMENTBUF DB 5 DUP(?);预留5 单元空间DO DW 100010011010001 IBDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA8.ASCII码表示的十六进制数到二进制数的转换START:MOVAX,DATAMOVDS,AXMOVDI,OFFSET DO;将口1指向BUF的下一单元MOVCX,0MOVAX,DO;取要用来变十六进制数的数到AXMOVBX,16;准备除以16CBUF10:DECDI;准备存放余数,往前倒存INCCXMOVDX,0;将除数的高16位(在 D X 中)清 0,DX也将用来存放余数DIVBX;DX,AX 除以 BX(BX=16)ADDDL,30H;余数变为ASCII码值MOVBYTE PTRDI,DL;存储十六进制数CMPAX,0;是否为0?JNZCBUF10;不为0 转 CBUF10CHANGE11:MOVDL,BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示CMPDL,3AH;是否小于10?JBCHANGE 12;如果小于10转显示ADDDL,7;否则为A 到 F 之间数,加 7CHANGE 12:MOVAH,2;显 示 1个字符INT21HINCDILOOPCH ANGE 11MOVAH,4cH;程序结束并返回DOSINT21HCODEENDSENDSTART从键盘输入四位十六进制数,将其转换十六位二进制数,并保存在DX 寄存器中,再显示。程序分析:十六进制数的数字符为0-9和 a-f(或 A-F),输入后以ASCII码 30H-39H和61H-66H(或 41H-46H)存入AL。明显,如是数字键0-9,其 ASCII码减去30H,即是该位十六进制数对应的四位二进制值。而如是字符键a-f或 A-F,其 ASCII码则要分别减去57H和37H,得到的差才是所输入的十六进制数字符对应的四位二进制值。CODESEGMENTASSUMECS:CODESTART:MOVDX,0MOVBL,4;输入字符个数INPUT:MOVAH.01HINT21H;键盘输入SUBAL,30HJLNEXT1;输入的是十六进制数外其它字符CMPAL,0AHJLCHANGE;输入0-9SUBAL,07HCMPAL,0AHJLNEXT1;输入的是十六进制数外其它字符CMPAL,0FHJLECHANGE;输入A-FSUBAL,20HCMPAL,0AHJLNEXT1;输入的是十六进制数外其它字符CMPAL,0FHJLECHANGE;输入a-fJMPNEXT1;输入的是十六进制数外其它字符CHANGE:MOVCL,4SHLDX,CLMOVAH,0ADDDX,AX;(DX)*-(DX)*16+(AX)DECBLJNZINPUTNEXT1:MOV BX,DX;取要显示的字符到B L中MOVCL,16;移 16次NEXT2:MOV DX,0SALBX,1RCLDX,1ADDDX,30HMOVAH,2INT21HDECCLJNENEXT2MOVDL,BMOVAH,2INT21HEXIT:MOVAH,4CHINT21HCODE ENDSEND START9.求计算二个字类型无符号数的和并以十进制形式显示。设和的大小不超过16位二进制数。DATA SEGMENTBUF DB 5 DUP(?)A DW 2598B DW 6234DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:D ATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV AX,AADD AX,BMOVDI,OFFSET A;将 D I指向BUF的下一单元MOVBX,10;准备除以10MOVCX,0;准备统计余数的个数CHANGE10:DEC DI;准备存放余数,往前倒存INCe xMOVDX,0;将除数的高16位(在 DX 中)清 0,DX也将用来存放余数DIVBX;DX,AX 除以 BX(BX=10)ADDDL,30H;余数变为ASCII码值MOVBYTE PTRDI,DL;存储十进制数CMPAX,0;是否为0?JNZCHANGE 10;不为 0 转 CHANGEI0CHANGE11:MOV DL,BYTE PTRfDI;取出存放在BUF中的十进制数到DL供显示MOVAH,2;显 示 1 个字符INT21HINCDILOOPCH ANGE 11MOV AH,4CHINT 21HCODE ENDSEND START(1)将 A、B 改为:A DW 2A5AHB DW 623FH10.求 B+C的和并以十六进制形式显示。本程序段要求在数据区设置变量BUF与 A,BUF设置情况为:DB 5 DUP(?)A 为其下的一个变量名。DATA SEGMENTBUF DB 5 DUP(?)A DW?B DW 2598C DW 6234DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:D ATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,BADDAX,CMOVDI,OFFSET A;将D I指向BUF的下一单元MOVCX,0MOVBX,16;准备除以16CBUF10:DECDI;准备存放余数,往前倒存INCCXMOVDX,0;将除数的高16位(在 DX中)清 0,DX也将用来存放余数DIVBX;DX,AX 除以 BX(BX=16)ADDDL,30H;余数变为ASCII码值MOVBYTE PTRDI,DL;存储十六进制数CMPAX,0;是否为0?JNZCBUF10;不为0 转 CBUF10CHANGE11:MOVDL.BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示CMPDL,3AH;是否小于10?JBCHANGE 12;如果小于10转显示ADDDL,7;否则为A 到 F 之间数,加7CHANGE 12:MOV AH,2;显 示 1个字符INT21HINCDILOOPCH ANGE 11EXIT:MOVAH,4CH;程序结束并返回DOSINT21HCODE ENDSEND START11.检查4 个输入的数,如果是16进制数字就保留并显示,否则停止输入并退出。CODESEGMENTASSUME CS:CODESTART:MOVDX,0MOVBL,4;输入字符最多多少个的个数INPUT:MOV AH,01HINT21H;键盘输入SUBAL,30HJLEXIT;如果输入小于0 的字符退出CMPAL,0AH;和0人相比较JLCHANGE;如果小于0AH表示输入的是0-9SUBAL,07H;看看输入的是不是大写的A-FCMPAL,0AH;如果减07H后小于0AH表示比大写的A 小JLEXIT;小于表示输入的是其它字符,退出CMPAL,0FH;如果减07H后大于OFH,表示比F 大JLECHANGE;小于等于表示输入的数在A-F之间,存到D X 中去SUBAL,20H;如果大于大写F,再看是否是a-fCMPAL,0AHJLEXIT;如果小于a,说明输入的是其它字符,退出CMPAL,0FH;再看是否大于fJLECHANGE;小于等于表示输入的是a-f,存到D X 中去JMPEXIT;输入其它字无条件退出CHANGE:MOV CL,4SHLDX,CL;D X 中数左移4 位(因为是16进制数)MOVAH,0;清AH,只保留AL,再将D X 中原来的数和A X 中新数相加ADD DX,AX;(DX)-(D X)*16+(AX)DECBL;BL减 1,控制做4 次循环JNZINPUT;再输下一个数直到4 个数EXIT:MOVAH,4CH;程序结束并返回DOSINT21HCODE ENDSEND START1 2 .求一个数X的 9-X 并显示从键盘上输入1 到 9 中任一自然数X,计算9-X 的值并输出。DATA SEGMENTINPUT DB PLEASE INPUT X(09):$DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATA;数据段寄存器的装填CODEMOV DS,AX;送段地址MOV AH,09HMOV DX,OFFSET INPUTINT 21H;输出提示字符串INPUTMOV AH,01HINT 21H;从键盘输入一个X 对应的字符:(“0”-“9”)AND AL,0FH;将输入的字符“0”一 “9”转换为数据X:09MOV DL,9SUB DL,AL;计算 9XMOV AH,02HADD DL,30HINT 21H;输出 9-XMOV AH,4CHINT 21H;程序正常结束并返回DOSENDSEND START1 3 .求解二元一次方程组:A1 X+B 1 Y=C 1A2 X+B 2 Y=C 2假设各系数均为字节类型无符号数,解均为一位十进制数。DATA SEGMENTAl DB 27Bl DB 81Cl DB 243A2 DB 54B2 DB 30C2 DB 222MESSI DB,XW?加MESS2 DB 0DH,0AH;y=,?;$,DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,AlMULB2MOVSI,AX;al*b2放到S I中MOVAL,A2MULBl;a2*blSUBSI,AX;al*b2-a2*blMOVAL,ClMULB2MOVBX,AX;cl*b2MOVAL,C2MULBlSUBBX,AX;cl*b2-c2*blMOVAX,BXCWD;符号扩展,A X 中符号扩到DX中IDIVSI;带符号除法(cl*b2-c2*bl)/(al*b2-a2*bl)ADDAL,30H;变成ASCII码MOVDI,2;在M ESSI的第2 字节预留有放结果的地方MOVMESSI DI,AL;将 X 的解放到MESS1的第2 字节处MOVDX,OFFSET MESSIMOVAH,9;调用9 号功能显示X=*INT21HMOVAL,AlMULC2MOVDX,AX;al*C2放到D X 中MOVAL,A2MULClSUBDX,AX;al*C2-a2*ClMOVAX,DXCWD;符号扩展,A X 中符号扩到DX中IDIVSI;带符号除法(al*C2-a2*Cl)/(al*b2-a2*bl)ADDAL,30H;变成ASCII码MOVDI,4;在MESS2的第4 字节预留有放结果的地方MOVMESS2DI,AL;将 Y 的解放到MESS2的第4 字节处MOVDX,OFFSET MESS2MOVAH,9;调用9 号功能显示Y=*INT21HMOVAH,4CHINT21HCODE ENDSEND START14.回答注释中提出的问题。DATA SEGMENTADW35H,9AC9HDB34HBDW4CBEH,8872HDB34HCDD8A607HDB34HDDD98AB457HDB34HEDB-48HDATAENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:D ATA,SS:STACK,CS:CODESTART:MOVAX,DATA;数据段在那里?怎样看数据段中的内容?MOVDS,AXMOVAX,OFFSET A+2;AX中值是多少?意义是什么?LEAAX,A+2;A X 中值是多少?意义是什么?MOVAX,A+2ADDAX,B+2;多少加多少,结果在那里?等于多少?有没有标志改变?MOVBX,AADCBX,B;多少加多少,结果在那里?等于多少?有没有标志改变?MOVAX,WORD PTR CADDAX,WORD PTR D;多少加多少MOVAX,WORD PTR C+2ADCAX,WORD PTR D+2;多少加多少MOVAL,EMOVBL,-3MULBL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?MOVAL,EMOVBL,-3IMULBL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?MOVAL,EMOVBL,-1IMULBL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?MOVAH,4cHINT21HCODE ENDSEND START15.检查下面那些指令是错误的,说明原因并改正。DATA SEGMENTBUF DB 3DAI DB?C DB B,0DH,0AH,$COUNT EQU$-CDATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOVDL,255HINCCOUNTMOVCS,DXCMP280,BLPUSHDXLEAAL,CMOVBX,DA1DXSUBD1J4SIJADDDX,BXMOV80H,AXMOVDAI,AXADDIDI,1OHMOVBX,OFFSET DAIMOVSI+DI,BXINCCSMOVES,DSPOPAHROLAX,2MOV BX,DA1DIMOV AH,4CHINT 21HCODE ENDSEND START16.十进制数的ASCII码转换为压缩型BCD码令数据段中自ASC_BUF开始的缓冲区内存放着若干个ASCII码表示的十进制数(每个单元存放一位十进制数),要求将这些ASCII码表示的卜进制数转换为BCD码,并把两个相邻单元的BCD码合并在一个存储单元(若ASCII码的个数为奇数,则将首地址单元的十进制数对应的BCD码单独存放一个单元,其余的按统一的方法处理)。应用DEBUG跟踪执行程序,当程序执行到语句MOV AH,4CH时,查看数据区的内容,分析运行结果。通过执行过程深入理解内存储器分段的概念。DATA SEGMENTASC_BUF DB“71542185”COUNT EQU$-ASC_BUFBCDBUF DB 10 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:D ATA,ES:D ATASTART:MOVAX,DATAMOVDS,AXMOVSLOFFSETASC_BUFMOVDLOFFSETBCDBUFMOVCX,COUNTMOVBX,CXSHRBX,1;BX右移一位,等效于除2JNCEVEN1;(CF)=0,则 CX 为偶数MOVBL,SI;对首位单独进行处理ANDBL,0FHMOVDIJ,BLDECe xINCSIINCDIEVEN1:MOV AL,S1JANDAL,0FH;清高4 位为0MOVBL,LSI+1ANDBL,0FH;清高4 位为0MOVDL,16MULDLADDAL,BLMOVDI,ALADDSI,2INCDIDECe xJNZ EVEN1MOV AH,4CHINT 21HCODE ENDSEND START17.压缩BCD码转换为十进制数的ASCII码将数据段中字节变量BCD_BUF为首地址的缓冲区中一个八位十进制数对应的压缩BCD码转换为ASCII码,并显示。DATASEGMENTBCD_BUF DB34H,25H,12H,97H;十进制数 97122534DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AXMOVCX,4MOVSI,OFFSET BCD_BUFADDSI,3MOVDH,0CHG_OUT1:PUSH CXMOVAL,SI;取压缩BCD码DECSI;修改指针MOVBL,AL;保存ALMOVCL,4RORAL,CLANDAL,0FH;取高半字节BCD码ADDAL,30H性 成 ASCII码MOVDL,ALMOVAH,2INT21H;标准设备输出MOVAL,BL;从BL所保存的AL恢复ALANDAL,0FH;取低半字节BCD码ADDAL,30H性 成 ASCII码MOVDL,ALMOVAH,2INT21H;标准设备输出POPCXDECCXJNZCHG_OUT1CODEENDSEND MAIN18.二进制数转换为压缩BCD码将 DX寄存器中存放的无符号二进制数(0-6 5 5 3 5)转换为压缩BCD码(在程序中自行加一条语句,将一个数保存到D X 中),保存在BCD_BUF缓冲区中。应 用 DEBUG跟踪执行程序,查看数据区的内容,分析运行结果DATASEGMENTBCD_BUFDB 3 DUP(O)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AXMOVDI,OFFSET BCD_BUFMOVAL,0MOVCX,5CLEAR_BUF:MOV DI,AL;初始化缓冲区INCDIDECe xJNZCLEAR_BUFMOVDLOFFSET BCD_BUFCHG_BCD1:MOV AX,DX;转换开始MOVDX,0MOVe x,10DIVe xMOVBL,DLMOVDX,0MOVe x,10DIVe xMOVCL,4SHLDL,CL;左移4 位,等效于乘以16ANDDL,0F0HORDL,BL;组合BCD码MOVDI,DL;存储 BCD 码INCDIMOVDX,AXCMPDX,0JNZCHG_BCD1CODE ENDSEND MAIN19.压缩BCD码转换为二进制数将 BX 寄存器中的四位压缩型BCD码转换为二进制数,并存放到D X 中。CODE SEGMENTASSUME CS:CODESTART:MOV BX,3698HMOV SI,BXXOR AX,AXMOV CX,4;BCD 码共 4 位CHG_AGAIN1:MOV DI,0;分析:本程序未写D S,是正确的吗,为什么?PUSHMOVCXCX,4;每个BCD码对应四位2 进制数CHG_AGAIN2:SHL SI,1;S I左移,最高位送CFRCLDI,1;C F最高位送DIDECCXJNZCHG_AGAIN2;将某位BCD码送DIMOVCX,10MULCXADDAX,DI;二进制数合并POPCXDECCXJNZCHG_AGAIN1MOVDX,AXMOVAH,4CHINT21HCODEENDSENDSTART20.分析每次运算结果及对标志位的影响。DATA SEGMENTA DW 000AHC DW,AB,;CD,;EF,GH;IJ,;KL,DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV AHJ0001000BMOV AL,00001100BADD AH,ALPUSHFPOP AX;分析运算结果及对标志位的影响MOV AH,11001 HOBMOV ALJ1000100BADD AH,ALPUSHFPOP AX;分析运算结果及对标志位的影响MOV AH,4CHINT 21HCODE ENDSEND START21.分析以下程序功能是什么?分析其每一次算术运算对标志位的影响。DATA SEGMENTA DW OOOAHC DW,ABCD;EF,;GH,;IJ,;KL,DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV AH,0A7HMOV AL,84HADD AH,ALMOV AH,35HMOV AL,0A4HSUB AH,ALMOV AX,085AHMOV DX,0A357HADD AX,DXMOV AX,085AHMOV DX,0A357HSUB AX,DXMOV AX,0A57HMOV DX,0MOV CX,4MUL CXMOV AH,4CHINT 21HCODE ENDSEND START22.已知DN1与 DN2均为双字,求计算DN1+DN2,将结果放到DSUM中,并 以 16进制形式在屏幕上显示。假设DN1为:0D3453A59H,DN2为:3E6D135FH。双字相加如有进位不考虑。DATA SEGMENTDN1 DW 3 A59HQD345HDN2 DW 135FH,3E6DHDSUM DW 0,0BUF DB 5 DUP(0)A DB?DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTARTMOV AX,DATAMOV DS,AXMOV AX,WORD PTR DN1ADD AX,WORD PTR DN2MOV WORD PTR DSUM,AXMOV DX,WORD PTR DN 1 +2ADC DX,WORD PTR DN2+2MOV WORD PTR DSUM+2,DXMOV AX,WORD PTR DSUM+2CALL CHANTH16MOV AX,WORD PTR DSUMCALL CHANTH16MOV AH,4CHINT 21HCHANTH16PROCMOVDI,OFFSET A;将D I指向BUF的下一单元MOVCX,0MOVBX,16;准备除以16CBUF10:DECDI;准备存放余数,往前倒存INCCXMOVDX,0;将除数的高16位(在 D X 中)清 0,DX也将用来存放余数DIVBX;DX,AX 除以 BX(BX=16)ADDDL,30H;余数变为ASCII码值MOVBYTE PTRDI,DL;存储十六进制数CMPAX,0;是否为0?JNZCBUF10;不为0 转 CBUF10CHANGE11:MOV DL,BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示CMPDL,3AH;是否小于10?JBCHANGE 12;如果小于10转显示ADDDL,7;否则为A 到 F 之间数,加 7CHANGE12:MOVAH,2;显 示 1 个字符INT21HINCDILOOPCHANGE11RETCODE ENDSEND START23.清 除D H 中最低3 位而不改变其他位,结果存入BHoCODE SEGMENTASSUME CS:CODESTART:ANDMOVMOVINTDH,11111000BBH,DHAH,4CH21HCODE ENDSEND START24.将D L中最高3 位 置 1 而不改变其他位。CODE SEGMENTASSUME CS:CODESTART:OR DL,11100000BMOV BH,DLMOV AH,4CHINT 21HCODE ENDSEND START25.将A X 中 03位 置 1、79位取反、其他位清0。CODE SEGMENTASSUME CS:CODESTART:OR AX,000000000000HUBXOR AX,0000001110000000BAND AX,000000111000111 IBMOV AH,4CHINT 21HCODE ENDSEND START26.检查B X 中第2、5、9 位是否至少有1位 是 1,如是,将 BX清 0。CODE SEGMENTASSUME CS:CODESTART:TEST BX,0000001000100100BJNZ NEXTJMP EXITNEXT:MOV BX,0EXIT:MOV AH,4CHINT 21HCODE ENDSEND START27.检查CX中第1、6、11位是否同时为1,如是,将 CX清 0。CODE SEGMENTASSUME CS:CODESTART:MOV AX,CXAND AX,0000100001000010BCMP AX,0000100001000010BJZ NEXTJMP EXITNEXT:MOV CX,0EXIT:MOV AH,4CHINT 21HCODE ENDSEND START28.检查BX 中第0、2、9、13位是否至少有1 位 是 0,如是,将 BX清 0。CODE SEGMENTASSUME CS:CODESTART:MOV AX,BXNOT AXTEST AX,0010001000000101BJNZ NEXTJMP EXITNEXT:MOV BX,0EXIT:MOV AH,4CHINT 21HCODE ENDSEND START29.检查D X 中第1、4、11、14位是否同时是0,如是,将 DX清 0。CODE SEGMENTASSUME CS:CODESTART:TEST DX,0100100000010010BJZ NEXTJMP EXITNEXT:MOV BX,0EXIT:MOV AH,4CHINT 21HCODE ENDSEND START30.右移DL 3 位,并将0 移入最高位。CODE SEGMENTASSUME CS:CODESTART:MOV CL,3SHR DL,CLMOV AH,4CHINT 21HCODE ENDSEND START31.将AL左移一位,将 0 移入最低位。CODE SEGMENTASSUME CS:CODESTART:SHL AL,1MOV AH,4CHINT 21HCODE ENDSEND START3 2 .D X 右 移 6 位且保持正负特性不变。CODESEGMENTASSUME CS:CODESTART:MOVSARMOVCL,6DL,CLAH,4CHINT 21HCODE ENDSEND START3 3 .将AL中压缩BCD码变成AX中的非压缩BCD码。INT 21HCODESEGMENTASSUME CS:CODESTART:MOVMOVSHLSHRMOVAH,0CL,4AX,CLAL,CLAH,4CHCODEENDSEND START3 4.设 A,B,C 为 8 位 带 符 号 数,D 为16位 带 符 号 数,计 算 算 术 表 达 式(A*B-3 2 4 8 6 H)+C)/D 的值,结果中的商存放到(A X)寄存器中(假设D的值足够大),余数存放到(D X)寄存器中。DATA SEGMENTA DB 39B DB-29C DB-13D DW 5049HE DWOF DWODATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV AL,ACBW3 5.已知DN1与DN2均为双字,求计算DN1-DN2,将结果放到DSUM中,并 以16进制形式在屏幕上显示。假设DN1为:OD3453A59H,DN2为:3E6D135FH。双字相加如有进位不考虑。IMULBCWDSUB AX,2486HMOV BX,AXSBB DX,3MOV CX,DXMOV AL,CCBWCWDADD AX,BXADC DX,CXIDIVDMOV AH,4CHINT 21HCODE ENDSEND START;A*B;符号扩展,A X 中符号扩展到DX 中;A*B 32486H;符号扩展,C(A L)中符号扩展到A H 中;符号扩展,A X 中符号扩展到DX中;(A*B-32486H)+C;(A*B-32486H)+C)/DDATA SEGMENTDN1 DW 3 A59HQD345HDN2 DW 135FH,3E6DHDSUM DW 0,0BUF DB 5 DUP(0)A DB?DATA ENDSSTACK SEGMENT STACKDB 200 DUP(O)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,WORD PTR DN1SUB AX,WORD PTR DN2MOV WORD PTR DSUM,AXMOV DX,WORD PTR DN1 +2SBB DX,WORD PTR DN2+2MOV WORD PTR DSUM+2,DXMOV AX,WORD PTR DSUM+2CALL CHANTH16MOV AX,WORD PTR DSUMCALL CHANTH16MOV AH,4CHINT 21HCHANTH16PROCMOVDI,OFFSET A;将口1指向BUF的下一单元MOVCX,0MOVBX,16;准备除以16CBUF10:DECDI;准备存放余数,往前倒存INCCXMOVDX,0;将除数的高16位(在 D X 中)清 0,DX也将用来存放余数DIVBX;DX,AX 除以 B