汇编语言在数据处理中的应用汇编语言在数据处理中应用1、数值转换中应用数据输入/输出时的转换2、串操作中应用串移动、串搜索、串比较、串插入、串删除3、代码转换中应用ASCII码BCD码二进数BCD码4、算术运算ASCII码输入设备ASCII码表示的十进制二进制ASCII码表示的十六进制二进制ASCII码表示的二进制二进制机内二进制操作运算二进制ASCII码表示的十进制二进制ASCII码表示的十六进制二进制ASCII码表示的二进制ASCII码输出设备[例10-1]ASCII码十进制转换为二进制数设5位十进数从高位到低位依次是d4、d3、d2、d1、d0。可用下列多项式进行计算:((((0*10+d4)*10+d3)*10+d2)*10+d1)*10+d0初始化是0--9ASCII码-30H累加器*10累加器+这一位值修改指令结束NY[例10-1]ASCII码十进制转换为二进制数CHG_DEC_BINPROC;SI指向十进制缓冲区首址MOVDX,0;初始化MOVCX,10GET_ASC:MOVAL,[SI];取得十进制数CMPAL,‘0’JBEXITCMPAL,‘9’JAEXITDEC_BIN:SUBAL,30HMOVAH,0PUSHAXMOVAX,DXMULCX;*10MOVDX,AXPOPAXADDDX,AXINCSI;修改指针JMPGET_ASCEXIT:RET;转换后的二进数在DX中CHG_DEC_BINENDP[例10-2]二进制数转换为ASCII码十进制[例10-2]二进制数转换为ASCII码十进制BIN_TO_DECPROC;被转换的十进数在AX中PUSHDI;DI指向存放十进数缓冲区首址MOVCX,5;初始化CLEAR_BUF:MOVBYTEPTR[DI],‘‘INCDILOOPCLEAR_BUFDECDIMOVCX,10CHANGE:MOVDX,0;转换DIVCX;除以10,余数在DXADDDL,30H;ASCII码MOVBYTEPTR[DI],DL;存储十进制数DECDICMPAX,0商是否为0?JNZCHANGEPOPDIRETBIN_TO_DECENDPASCII码十六进制数转换为二进制数十六进制数的字符为0~9和A~F,输入后,ASCII码为30H~39H和41H~46H转换时,若是数字0~9,减30H若是A~F,减去37H[例10-3]ASCII码十六进制数转换为二进制数HEX_TO_BINPROCPUSHAXPUSHCXMOVDX,0;转换后结果在DX中GET_CHAR:MOVAX,01H;键盘输入INT21HSUBAL,30HJLEXITCMPAL,0AHJLCHANGESUBAL,07HCMPAL,0AH;是否是大写字母JLEXITCMPAL,0FHJLECHANGECMPAL,2AH;是否是小写字母JLEXITCMPAL,2FHJLECHANGEJMPEXITCHANGE:MOVCL,4;转换SHLDX,CLMOVAH,0ADDDX,AXJMPGET_CHARPOPCXPOPAXEXIT:RETHEX_TO_BINENDP汇编语言在串操作中的应用串移动(数据块移动)串搜索串比较串插入串删除求串长数据块移动1、一般情况S1S2源区目的区2、特殊情况:源区与目的区重叠源区目的区目的区源区[例10-4]串搜索例将串STR中第一个‘I’字符找出,并显示其在串中的位移量D_SEGSEGMENTSTRDB‘THISISACOMPUTER’STR_LEN=$-STRD_SEGENDS......LEADI,STRMOVCX,STR_LENMOVAL,’I’CLDFOUND:REPNZSCASBJEOK1JCXZRETNOK1:MOVDX,DIDECDL;第一个'I'字符距串头位移量MOVBL,DLPUSHCXMOVCL,4SHRDL,CLPOPCXCMPDL,0AHJBOK2ADDDL,7OK2:ADDDL,30HMOVAH,02HINT21H;显示位移量高位MOVDL,BLANDDL,0FHCMPDL,0AHJBOK3ADDDL,70K3:ADDDL,30HMOVAH,02HINT21H;显示位移量低位MOVDL,'H'INT21HRETN:......[例10-5]串比较例比较串STR1和STR2是否相等D_SEGSEGMENTSTR1DB'STRING1'STR2DB'STRING2'STR_LEN=($-STR1)/2MSG1DB'NOTEQUAL','$'MSG2DB'EQUAL','$'D_SEGENDS......LEASI,STR1MOVDI,OFFSETSTR2MOVCX,STR_LENCLDREPECMPSBJNZNO_EQUAEQUA:MOVAH,09HLEADX,MSG2INT21H;提示两个串相等JMPCMP_ENDNO_EQUA:MOVAH,09HLEADX,MSG1INT21H;提示两个串不等......CMP_END:......串插入串插入分三种情况:1、在目的串首插入2、在目的串尾插入3、在目的串中指定的位置插入[例10-6]串插入例将正数N插入一个升序的字数组中,数组的首地址和末地址为A_HEAD和A_ENDX3A_HEADXDW?5A_HEADDW3,5,23,49,52,6523A_ENDDW10549NDW325265105A_END32NMOVAX,NMOVA_HEAD-2,-1MOVSI,0COMPARE:CMPA_END[SI],AX;从最后一个元素开始比较JLEINSERTMOVBX,A_END[SI]MOVA_END[SI+2],BX;后移一个元素SUBSI,2JMPCOMPAREINSERT:MOVA_END[SI+2],AX;插入.....串删除[例10-7]串删除例附加段中有一个首地址为LIST的字数组,数组的第一字中存放该数组长度,数组首地址在DI中,数X在AX中,现要在数组中查找X,若找到则删除。CLDPUSHDIMOVCX,ES:[DI];数组长度送CXADDDI,2;DI指向第一个元素REPNESCASW;串扫描JEDELETE;如找到则删除POPDI;否则,退出JMPEXITDELET:JCXZDEC_CNT;若CX=0,X为最后一个元素NEXT_EL:MOVBX,ES:[DI]MOVES:[DI-2],BX;向前移动一个元素ADDDI,2LOOPNEXT_ELDEC_CNT:POPDIDECWORDPTRES:[DI];数组元素个数减1EXIT:......求串长[例10-8]求串长例求字符串的长度送入LEN,假定串以‘$’结束STRINGDB‘Hello,Howareyou!’,’$’…….MOVSI,OFFSETSTRINGXORBL,BLLOP:MOVAL,[SI]CMPAL,’$’JZDONEINCBLINCSIJMPLOPDONE:MOVLEN,BL汇编语言在代码转换中的应用1、十进制ASCII码转换成BCD码2、BCD码转换成十进制数的ASCII码3、二进制数转换为BCD码4、BCD码转换为二进制数[例10-9]十进制ASCII码转换成BCD码例令ASC_BUF开始的缓冲区内存放着若干个ASCII码表示ASC_BUF31H的十进制数,(每个单元存放一32H个十进制数),要求将其转换成33HBCD码,并把两个相邻单元的34HBCD码合并在一个存储单元中35H若ASCII码的个数为奇数,则将首地址单元的十进制数对应的BCD码单独存放一个单元,BCD_BUF1其余的按统一方法处理32子程序名:DEC_ASC_BCD54入口参数:DS:SI指向ASCII码首地址ASC_BUFES:DI指向BCD码首地址BCD_BUFCX=串长度,DS,ES指向同一个段出口参数:BCD码存放在BCD_BUF为首地址的缓冲区内DEC_ASC_BCDPROCFARPUSHSI;保护现场PUSHDIPUSHAXPUSHBXPUSHCXRORCX,1JNCNEXT;ASCII码为偶数个转移ROLCX,1LODSB;取ASCII码到ALANDAL,0FH;ASCII码转换成BCD码STOSB;存储BCD码DECCXRORCX,1;奇数个时单独处理完NEXT:LODSBANDAL,0FHMOVBL,ALLODSBPUSHCXMOVCL,4SALAL,CLPOPCXADDAL,BL;合并BCD码STOSB;存储BCD码LOOPNEXTPOPCX;恢复现场POPBXPOPAXPOPDIPOPSIRETDEC_ASC_BCDENDP[例10-10]BCD码转换成十进制数的ASCII码例将数据段字节变量BCD_BUF为首地址的缓冲区中一个八位十进制数对应的压缩BCD码转换成ASCII码,并显示BCD_BUF12345678显示:78563412子程序名:BCD_DEC_ASC入口参数:一个八位十进制数对应的压缩BCD码存储在BCD_BUF缓冲区出口参数:正常结束,DH=0FFHBCD_DEC_ASCPROCNEARPUSHSI;保护现场PUSHAXPUSHCXMOVCX,4LEASI,BCD_BUFADDSI,3MOVDH,0CHG_OUT1:PUSHCXMOVAL,[SI];取压缩BCD码DECSI;修改指针MOVDL,ALMOVCL,4RORAL,4ANDAL,0FH;取高半字节BCD码ADDAL,30H;生成ASCII码CALLSTD_OUT;标准设备输出CHG_OUT2:POPCXCMPCX,1JNZCHG_OUT3MOVDH,0FFHCHG_OUT3:PUSHCXMOVAL,DLANDAL,0FH;取低半字节BCD码ADDAL,30H;生成ASCII码CALLSTD_OUT;标准设备输出CHG_OUT4:POPCXLOOPCHG_OUT1POPCXPOPAXPOPSIRETBCD_DEC_ASCENDPSTD_OUTPROCNEAR;标准设备输出PUSHDXPUSHAXMOVDL,ALMOVAH,2INT21HPOPAXPOPDXRETSTD_OUTENDP[例10-11]二进制数转换为BCD码例DX寄存器中为一个十六位无符号二进制数(0-65535),将其转换为压缩的BCD码,保存在BCD_BUF缓冲区DXBCD_BUFBIN_TO_BCDPROCFAR1567878PUSHAX56PUSHCX1PUSHDX0PUSHDI0LEADI,BCD_BUFMOVAL,0MOVCX,5CLEAR_BUF:MOV[DI],AL;初始化缓冲区INCDILOOPCLEAR_BUFLEADI,BCD_BUFCHG_BCD1:MOVAX,DX;转换开始MOVDX,0MOVCX,10DIVCXXCHGAX,DX;交换余数和商MOVBL,AL;余数送ALMOVAX,DXMOVDX,0MOVCX,10DIVCXXCHGAX,DXMOVCL,4ROLAL,CLANDAL,0F0HORAL,BL;组合BCD码MOV[DI],AL;存储BCD码INCDICMPDX,0JNZCHG_BCD1POPDI……[例10-12]BCD码转换为二进制数例将AX寄存器中的四位压缩型BCD码转换为二进制数BCD_TO_BINPROCPUSHCXPUSHSIPUSHDIMOVSI,AXXORAX,AXMOVCX,4AGAIN1:MOVDI,0PUSHCXMOVCX,4AGAIN2:SHLSI,1;左移1位,最高位--CFRCLDI,1;CF移入DI中LOOPAGAIN2;重复4次得到1位BCD码MOVCX,10MULCX;乘10ADDAX,DIPOPCXLOOPAGAIN1MOVDX,AX;转换后的二进数在DX中POPDIPOPSIPOPCXRETBCD_TO_BINENDP[例10-13]多精度加法运算例如,两个无符号四字节二进数相加:346B7F7AH+2ABC8548H5F2804C2H计算步骤为:第一步第二步7AF74885ADC0ADC0C2(CF=0)0