汇编语言在数据处理中的应用.ppt
1,1、数值转换中应用 数据输入/输出时的转换2、串操作中应用 串移动、串搜索、串比较、串插入、串删除3、代码转换中应用 ASCII码 BCD码 二进数 BCD码 4、算术运算,在这一部分,我们将汇编语言在数据处理中的应用集中起来给大家,其中有些程序在11章中已经介绍过。,汇编语言在数据处理中应用(自学),2,ASCII码输入设备,ASCII码表示的十进制二进制,ASCII码表示的十六进制二进制,ASCII码表示的二进制二进制,机内二进制操作运算,二进制ASCII码表示的十进制,二进制ASCII码表示的十六进制,二进制ASCII码表示的二进制,ASCII码输出设备,3,ASCII码十进制转换为二进制数设5位十进数从高位到低位依次是d4、d3、d2、d1、d0。可用下列多项式进行计算:(0*10+d4)*10+d3)*10+d2)*10+d1)*10+d0,初始化,是0-9,ASCII码-30H,累加器*10,累加器+这一位值,修改指令,结束,N,Y,汇编语言在数值转换中的应用,4,CHG_DEC_BINPROC;SI 指向十进制缓冲区首址MOV DX,0;初始化MOV CX,10GET_ASC:MOV AL,SI;取得十进制数CMP AL,0JB EXITCMP AL,9JA EXITDEC_BIN:SUB AL,30HMOV AH,0PUSH AXMOV AX,DXMUL CX;*10MOV DX,AXPOP AXADD DX,AXINC SI;修改指针JMP GET_ASCEXIT:RET;转换后的二进数在DX中 CHG_DEC_BIN ENDP,5,二进制数转换为 ASCII码十进制,6,BIN_TO_DEC PROC;被转换的十进数在AX中 PUSH DI;DI 指向存放十进数缓冲区首址MOV CX,5;初始化 CLEAR_BUF:MOV BYTE PTRDI,INC DILOOP CLEAR_BUFDEC DIMOV CX,10 CHANGE:MOV DX,0;转换DIV CX;除以10,余数在DXADD DL,30H;ASCII码MOV BYTE PTRDI,DL;存储十进制数DEC DICMP AX,0 商是否为0?JNZ CHANGEPOP DIRETBIN_TO_DECENDP,7,ASCII码十六进制数转换为二进制数 十六进制数的字符为09和AF,输入后,ASCII码为30H39H和41H46H 转换时,若是数字09,减30H 若是AF,减去37H HEX_TO_BIN PROC PUSH AX PUSH CX MOV DX,0;转换后结果在DX中 GET_CHAR:MOV AX,01H;键盘输入 INT 21H SUB AL,30H JL EXIT CMP AL,0AH JL CHANGE SUB AL,07H,8,CMP AL,0AH;是否是大写字母JL EXITCMP AL,0FHJLE CHANGECMP AL,2AH;是否是小写字母JL EXITCMP AL,2FHJLE CHANGEJMP EXIT CHANGE:MOV CL,4;转换SHL DX,CLMOV AH,0ADD DX,AXJMP GET_CHARPOP CXPOP AX EXIT:RET HEX_TO_BIN ENDP,9,串移动(数据块移动)串搜索 串比较 串插入 串删除 求串长,汇编语言在串操作中的应用,10,数据块移动 1、一般情况 S1 S2 源区 目的区2、特殊情况:源区与目的区重叠 源区 目的区 目的区 源区,11,串搜索例 将串STR中第一个I字符找出,并显示其在串中的位移量D_SEG SEGMENTSTR DB THIS IS A COMPUTERSTR_LEN=$-STRD_SEG ENDS.LEA DI,STRMOV CX,STR_LENMOV AL,ICLD FOUND:REPNZ SCASBJE OK1JCXZ RETNOK1:MOV DX,DIDEC DL;第一个I字符距串头位移量MOV BL,DL,12,PUSH CXMOV CL,4SHR DL,CLPOP CXCMP DL,0AHJB OK2ADD DL,7OK2:ADD DL,30HMOV AH,02HINT 21H;显示位移量高位MOV DL,BLAND DL,0FHCMP DL,0AHJB OK30K3:ADD DL,30HMOV AH,02HINT 21H;显示位移量低位MOV DL,HINT 21H RETN:.,13,串比较例 比较串STR1和STR2是否相等 D_SEG SEGMENTSTR1DB STRING1STR2DB STRING2STR_LEN=($-STR1)/2MSG1DB NOT EQUAL,$MSG2DB EQUAL,$D_SEG ENDS.LEA SI,STR1MOV DI,OFFSET STR2MOV CX,STR_LENCLD,14,REPE CMPSBJNZ NO_EQUAEQUA:MOV AH,09HLEA DX,MSG2INT 21H;提示两个串相等JMP CMP_ENDNO_EQUA:MOV AH,09HLEA DX,MSG1INT 21H;提示两个串不等.CMP_END:.,15,串插入串插入分三种情况:1、在目的串首插入 2、在目的串尾插入 3、在目的串中指定的位置插入串插入例 将正数N插入一个升序的字数组中,数组的首地址和末地址为 A_HEAD和A_END X 3 A_HEAD X DW?5 A_HEAD DW 3,5,23,49,52,65 23 A_END DW 105 49 N DW 32 52 65 105 A_END 32 N,16,MOV AX,N MOV A_HEAD-2,-1 MOV SI,0 COMPARE:CMP A_ENDSI,AX;从最后一个元素开始比较 JLE INSERT MOV BX,A_ENDSI MOV A_ENDSI+2,BX;元素后移一个位置 SUB SI,2 JMP COMPARE INSERT:MOV A_ENDSI+2,AX;插入.,17,串删除 串删除例 附加段中有一个首地址为 LIST的字数组,数组的第一字中存放该数组长度,数组首地址在DI中,数X在AX中,现要在数组中查找X,若找到则删除。,18,CLD PUSH DI MOV CX,ES:DI;数组长度送CX ADD DI,2;DI指向第一个元素 REPNE SCASW;串扫描 JE DELETE;如找到则删除 POP DI;否则,退出 JMP EXITDELET:JCXZ DEC_CNT;若CX=0,X为最后一个元素NEXT_EL:MOV BX,ES:DI MOV ES:DI-2,BX;元素向前移动一个位置 ADD DI,2 LOOP NEXT_ELDEC_CNT:POP DI DEC WORD PTR ES:DI;数组元素个数减1EXIT:.,19,求串长求串长例 求字符串的长度送入LEN,假定串以$结束 STRING DB Hello,How are you!,$.MOV SI,OFFSET STRING XOR BL,BLLOP:MOV AL,SI CMP AL,$JZ DONE INC BL INC SI JMP LOPDONE:MOV LEN,BL,20,1、十进制ASCII 码转换成BCD码2、BCD码转换成十进制数的ASCII码3、二进制数转换为BCD码4、BCD码转换为二进制数,汇编语言在代码转换中的应用,21,十进制ASCII 码转换成BCD码例 令ASC_BUF开始的缓冲区内存放着若干个ASCII码表示 ASC_BUF 31H 的十进制数,(每个单元存放一 32H个十进制数),要求将其转换成 33HBCD码,并把两个相邻单元的 34HBCD码合并在一个存储单元中 35H 若ASCII码的个数为奇数,则将首地址单元的十进制数对 应的BCD码单独存放一个单元,BCD_BUF 1其余的按统一方法处理 32 子程序名:DEC_ASC_BCD 54入口参数:DS:SI指向ASCII码首地址ASC_BUF ES:DI指向BCD码首地址BCD_BUF CX=串长度,DS,ES指向同一个段 出口参数:BCD码存放在BCD_BUF为首地址的缓冲区内,22,DEC_ASC_BCD PROC FAR PUSH SI;保护现场 PUSH DI PUSH AX PUSH BX PUSH CX ROR CX,1 JNC NEXT;ASCII码为偶数个转移 ROL CX LODSB;取ASCII码到AL AND AL,0FH;ASCII码转换成BCD码 STOSB;存储BCD码 DEC CX ROR CX,1;奇数个时单独处理完,23,NEXT:LODSB AND AL,0FH MOV BL,AL LODSB PUSH CX MOV CL,4 SAL AL,CL POP CX ADD AL,BL;合并BCD码 STOSB;存储BCD码 LOOP NEXT POP CX;恢复现场 POP BX POP AX POP DI POP SI RET DEC_ASC_BCD ENDP,24,BCD码转换成十进制数的ASCII码例 将数据段字节变量BCD_BUF为首地址的缓冲区中一个八位十进制数对应的压缩BCD码转换成ASCII码,并显示 BCD_BUF 12 34 56 78 显示:7 8 5 6 3 4 1 2 子程序名:BCD_DEC_ASC 入口参数:一个八位十进制数对应的压缩BCD码存储 在BCD_BUF缓冲区 出口参数:正常结束,DH=0FFH,25,BCD_DEC_ASC PROC NEAR PUSH SI;保护现场 PUSH AX PUSH CX MOV CX,4 LEA SI,BCD_BUF ADD SI,3 MOV DH,0 CHG_OUT1:PUSH CX MOV AL,SI;取压缩BCD码 DEC SI;修改指针 MOV DL,AL MOV CL,4 ROR AL,4 AND AL,0FH;取高半字节BCD码 ADD AL,30H;生成ASCII码 CALL STD_OUT;标准设备输出,26,CHG_OUT2:POP CX CMP CX,1 JNZ CHG_OUT3 MOV DH,0FFH CHG_OUT3:PUSH CX MOV AL,DL AND AL,0FH;取低半字节BCD码 ADD AL,30H;生成ASCII码 CALL STD_OUT;标准设备输出 CHG_OUT4:POP CX LOOP CHG_OUT1 POP CX POP AX POP SI RET BCD_DEC_ASC ENDP,27,STD_OUT PROC NEAR;标准设备输出 PUSH DX PUSH AX MOV DL,AL MOV AH,2 INT 21H POP AX POP DX RET STD_OUT ENDP,28,二进制数转换为BCD码例 DX寄存器中为一个十六位无符号二进制数(0-65535),将其转换为压缩的BCD码,保存在BCD_BUF缓冲区 DX BCD_BUFBIN_TO_BCD PROC FAR 15678 78 PUSH AX 56 PUSH CX 1 PUSH DX 0 PUSH DI 0 LEA DI,BCD_BUF MOV AL,0 MOV CX,5CLEAR_BUF:MOV DI,AL;初始化缓冲区 INC DI LOOP CLEAR_BUF LEA DI,BCD_BUF,29,CHG_BCD1:MOV AX,DX;转换开始 MOV DX,0 MOV CX,10 DIV CX XCHG AX,DX;交换余数和商 MOV BL,AL;余数送AL MOV AX,DX MOV DX,0 MOV CX,10 DIV CX XCHG AX,DX MOV CL,4 ROL AL,CL AND AL,0F0H OR AL,BL;组合BCD码 MOV DI,AL;存储BCD码 INC DI CMP DX,0 JNZ CHG_BCD1 POP DI,30,BCD码转换为二进制数例 将AX寄存器中的四位压缩型BCD码转换为二进制数 BCD_TO_BIN PROC PUSH CX PUSH SI PUSH DI MOV SI,AX XOR AX,AX MOV CX,4 AGAIN1:MOV DI,0 PUSH CX MOV CX,4 AGAIN2:SHL SI,1;左移1位,最高位-CF RCL DI,1;CF移入DI中 LOOP AGAIN2;重复4次得到1位BCD码,31,MOV CX,10 MUL CX;乘10 ADD AX,DI POP CX LOOP AGAIN1 MOV DX,AX;转换后的二进数在DX中 POP DI POP SI POP CX RET BCD_TO_BIN ENDP,32,多精度加法运算 例如,两个无符号四字节二进数相加:3 4 6 B 7 F 7 A H+2A BC 8 5 4 8 H 5 F 2 8 0 4 C 2 H 计算步骤为:第一步 第二步 7 A F 7 4 8 8 5 ADC 0 ADC 0 C 2(CF=0)0 4(CF=1)第三步 第四步 6 B 3 4 B C 2 A ADC 1 ADC 1 2 8(CF=1)5 F(CF=0),算术运算,33,ADR1 DB 7AH,7FH,6BH,34HADR2 DB 48H,85H,0BCH,2AHSUM DB 0,0,0,0 MOV SI,OFFSET ADR1 MOV BX,OFFSET ADR2 MOV DI,OFFSET SUM MOV CL,4 CLC;CF-0 AGAIN:MOV AL,SI ADC AL,BX;字节加 MOV DI,AL INC SI;修改地址 INC BX INC DI LOOP AGAIN,34,设在单元A、B和C存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清0。,MOV AX,ACMP AX,0JZ P1MOV AX,BCMP AX,0JZ P1MOV AX,CCMP AX,0JZ P1ADD AX,A,ADC AX,B MOV D,AX JMP DONEP1:MOV A,0 MOV B,0 MOV C,0DONE:.,35,数据区DATA1和DATA2分别存放N个字节数据,检查它们的数据是否相同。若完全一致,则将FLAG置FFH,否则置0,并将第一次出现的不同数据的地址分别存入D1和D2中。(1)用一般比较指令CMP实现,LEA SI,DATA1 LEA DI,DATA2 MOV CX,NM2:MOV AL,SI CMP AL,DI JNZ M1 INC SI INC DI LOOP M2,MOV FLAG,0FFH JMP DONEM1:MOV FLAG,0 MOV D1,SI MOV D2,DIDONE:,36,(2)用串操作指令CMPS实现,LEA SI,DATA1 LEA DI,DATA2 MOV CX,N CLD REPZ CMPSB JNZ M3 MOV FLAG,0FFH JMP DONEM3:MOV FLAG,0 DEC SI DEC DI MOV D1,SI MOV D2,DIDONE:,37,1、利用高档机32位字长特性,有两个4字长数分别存放在DATA1和DATA2中,求它们的和,结果存放于DATA3中。,DATA1 DQ 123456789ABCDEFHDATA2 DQ 0FEDCBA987654321HDATA3 DQ?,在实模式下发挥80386及其后继机的优势,38,CLC LEA SI,DATA1 LEA DI,DATA2 LEA BX,DATA3 MOV CX,4BACK:MOV AX,SI ADC AX,DI MOV BX,AX,8086中实现:,INC SI INC SI INC DI INC DI INC BX INC BX LOOP BACK,39,386及其后继机中实现:,CLC LEA SI,DATA1 LEA DI,DATA2 LEA BX,DATA3 MOV CX,2BACK:MOV EAX,SI ADC EAX,DI MOV BX,EAX PUSHF;保存CF ADD SI,4 ADD DI,4 ADD BX,4 POPF LOOP BACK,40,386及其后继机中实现:,MOV EAX,DWORD PTR DATA1ADD EAX,DWORD PTR DATA2MOV EDX,DWORD PTR DATA+4ADC EDX,DWORD PTR DATA2+4MOV DWORD PTR DATA3,EAXMOV DWORD PTR DATA3+4,EDX,41,2、通用寄存器可作为指针寄存器,使用32位寻址时,32位通用寄存器可作为基址或变址寄存器使用例:MOV EAX,BX MOV EAX,EDX MOV AX,WORD PTR ECX MOV AX,EBXEBX,注意:实模式下,段的大小限制于64KB,32位通用寄存器作为指针寄存器时,高16位应为0,42,3、与比例因子有关的寻址方式,把5个双字相加并保存结果,ARRAY DD 234556H,0F983F5H,6754AE2H,0C5231239H,0AF34ACB4HRESULT DQ?SUB EBX,EBX MOV EDX,EBX MOV EAX,EBX MOV CX,5BACK:ADD EAX,ARRAYEBX*4 ADC EDX,0 INC EBX DEC CX JNZ BACK MOV DWORD PTR RESULT,EAX MOV DWORD PTR RESULT+4,EDX,43,数据段中有一个20个字节的表和一个20个字的表,把字节表中每个数据作为表中的高位字节部分移入字表中。,XOR SI,SI XOR DI,DINEXT:MOV AX,WORD_TABLEDI MOV AH,BYTE_TABLESI MOV WORD_TABLEDI,AX INC SI ADD DI,2 CMP SI,20 JL NEXT,BYTE_TABLE DB 20 DUP(?)WORD_TABLE DW 20 DUP(?),方法1:用一般寻址方式,44,XOR ESI,ESINEXT:MOV AX,WORD_TABLEESI*2 MOV AH,BYTE_TABLEESI MOV WORD_TABLEESI*2,AX INC ESI CMP ESI,20 JL NEXT,方法2:用比例变址寻址方式,