1 / 44

汇编语言在数据处理中应用 ( 自学 )

汇编语言在数据处理中应用 ( 自学 ). 1 、数值转换中应用 数据输入 / 输出时的转换 2 、串操作中应用 串移动、串搜索、串比较、 串插入、串删除 3 、代码转换中应用 ASCII 码 BCD 码 二进数 BCD 码 4 、算术运算. 在这一部分,我们将汇编语言在数据处理中的应用集中起来给大家,其中有些程序在 11 章中已经介绍过。.

renate
Download Presentation

汇编语言在数据处理中应用 ( 自学 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 初始化 N 是0--9 Y ASCII码-30H 结束 累加器*10 累加器+这一位值 修改指令

  4. CHG_DEC_BIN PROC ;SI 指向十进制缓冲区首址 MOV DX, 0 ;初始化 MOV CX, 10 GET_ASC: MOV AL, [SI] ;取得十进制数 CMP AL, ‘0’ JB EXIT CMP AL, ‘9’ JA EXIT DEC_BIN: SUB AL, 30H MOV AH, 0 PUSH AX MOV AX, DX MUL CX ;*10 MOV DX, AX POP AX ADD DX, AX INC SI ;修改指针 JMP GET_ASC EXIT: RET ; 转换后的二进数在DX中 CHG_DEC_BIN ENDP

  5. 二进制数转换为 ASCII码十进制

  6. BIN_TO_DEC PROC ;被转换的十进数在AX中 PUSH DI ;DI 指向存放十进数缓冲区首址 MOV CX, 5 ;初始化 CLEAR_BUF: MOV BYTE PTR[DI], ‘ ‘ INC DI LOOP CLEAR_BUF DEC DI MOV CX, 10 CHANGE: MOV DX, 0 ;转换 DIV CX ;除以10,余数在DX ADD DL, 30H ;ASCII码 MOV BYTE PTR[DI], DL ;存储十进制数 DEC DI CMP AX, 0 商是否为0? JNZ CHANGE POP DI RET BIN_TO_DEC ENDP

  7. ASCII码十六进制数转换为二进制数 十六进制数的字符为0~9和A~F,输入后,ASCII码为30H~39H和41H~46H 转换时,若是数字0~9,减30H 若是A~F,减去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 EXIT CMP AL, 0FH JLE CHANGE CMP AL, 2AH ;是否是小写字母 JL EXIT CMP AL, 2FH JLE CHANGE JMP EXIT CHANGE: MOV CL, 4 ;转换 SHL DX, CL MOV AH, 0 ADD DX, AX JMP GET_CHAR POP CX POP AX EXIT: RET HEX_TO_BIN ENDP

  9. 汇编语言在串操作中的应用 • 串移动(数据块移动) • 串搜索 • 串比较 • 串插入 • 串删除 • 求串长

  10. 数据块移动 1、一般情况 S1 S2 源区 目的区 2、特殊情况:源区与目的区重叠 源区 目的区 目的区 源区

  11. 串搜索例 将串STR中第一个‘I’字符找出,并显示其在串中的位移量 D_SEG SEGMENT STR DB ‘THIS IS A COMPUTER’ STR_LEN = $-STR D_SEG ENDS ...... LEA DI, STR MOV CX, STR_LEN MOV AL, ’I’ CLD FOUND: REPNZ SCASB JE OK1 JCXZ RETN OK1: MOV DX, DI DEC DL ;第一个'I'字符距串头位移量 MOV BL, DL

  12. PUSH CX MOV CL,4 SHR DL, CL POP CX CMP DL, 0AH JB OK2 ADD DL, 7 OK2: ADD DL, 30H MOV AH, 02H INT 21H ;显示位移量高位 MOV DL, BL AND DL, 0FH CMP DL, 0AH JB OK3 0K3: ADD DL, 30H MOV AH, 02H INT 21H ;显示位移量低位 MOV DL, 'H' INT 21H RETN: ......

  13. 串比较例 比较串STR1和STR2是否相等 D_SEG SEGMENT STR1 DB 'STRING1' STR2 DB 'STRING2' STR_LEN = ($-STR1)/2 MSG1 DB 'NOT EQUAL','$' MSG2 DB 'EQUAL','$' D_SEG ENDS ...... LEA SI, STR1 MOV DI, OFFSET STR2 MOV CX, STR_LEN CLD

  14. REPE CMPSB JNZ NO_EQUA EQUA: MOV AH, 09H LEA DX, MSG2 INT 21H ;提示两个串相等 JMP CMP_END NO_EQUA: MOV AH, 09H LEA DX, MSG1 INT 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_END[SI], AX ;从最后一个元素开始比较 JLE INSERT MOV BX, A_END[SI] MOV A_END[SI+2], BX ;元素后移一个位置 SUB SI, 2 JMP COMPARE INSERT: MOV A_END[SI+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 EXIT DELET: JCXZ DEC_CNT;若CX=0,X为最后一个元素 NEXT_EL: MOV BX, ES:[DI] MOV ES:[DI-2], BX ;元素向前移动一个位置 ADD DI, 2 LOOP NEXT_EL DEC_CNT: POP DI DEC WORD PTR ES:[DI] ;数组元素个数减1 EXIT: ......

  19. 求串长 求串长例 求字符串的长度送入LEN,假定串以‘$’结束 STRING DB ‘Hello,How are you!’,’$’ ……. MOV SI, OFFSET STRING XOR BL, BL LOP: MOV AL, [SI] CMP AL,’$’ JZ DONE INC BL INC SI JMP LOP DONE: MOV LEN, BL

  20. 汇编语言在代码转换中的应用 1、十进制ASCII 码转换成BCD码 2、BCD码转换成十进制数的ASCII码 3、二进制数转换为BCD码 4、BCD码转换为二进制数

  21. 十进制ASCII 码转换成BCD码例 令ASC_BUF开始的缓冲区 内存放着若干个ASCII码表示 ASC_BUF 31H 的十进制数,(每个单元存放一 32H 个十进制数),要求将其转换成 33H BCD码,并把两个相邻单元的 34H BCD码合并在一个存储单元中 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_BUF BIN_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, 5 CLEAR_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, 34H ADR2 DB 48H, 85H, 0BCH, 2AH SUM 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,则设在单元A、B和C存放有三个数,若三个数都不为0,则 求出三个数之和存入D中;若有一个为0,则将其他两个单元 也清0。 MOV AX, A CMP AX, 0 JZ P1 MOV AX, B CMP AX, 0 JZ P1 MOV AX, C CMP AX, 0 JZ P1 ADD AX, A ADC AX, B MOV D, AX JMP DONE P1: MOV A, 0 MOV B, 0 MOV C, 0 DONE: ….

  35. 数据区DATA1和DATA2分别存放N个字节数据,检查它们的数据是否相同。若完全一致,则将FLAG置FFH,否则置0,并将第一次出现的不同数据的地址分别存入D1和D2中。数据区DATA1和DATA2分别存放N个字节数据,检查它们的数据是否相同。若完全一致,则将FLAG置FFH,否则置0,并将第一次出现的不同数据的地址分别存入D1和D2中。 (1) 用一般比较指令CMP实现 LEA SI, DATA1 LEA DI, DATA2 MOV CX, N M2: MOV AL, [SI] CMP AL, [DI] JNZ M1 INC SI INC DI LOOP M2 MOV FLAG, 0FFH JMP DONE M1: MOV FLAG, 0 MOV D1, SI MOV D2, DI DONE: ……

  36. (2)用串操作指令CMPS实现 LEA SI, DATA1 LEA DI, DATA2 MOV CX, N CLD REPZ CMPSB JNZ M3 MOV FLAG, 0FFH JMP DONE M3:MOV FLAG, 0 DEC SI DEC DI MOV D1, SI MOV D2, DI DONE: ……

  37. 在实模式下发挥80386及其后继机的优势 1、利用高档机32位字长特性 有两个4字长数分别存放在DATA1和DATA2中,求它们的和,结果存放于DATA3中。 DATA1 DQ 123456789ABCDEFH DATA2 DQ 0FEDCBA987654321H DATA3 DQ ?

  38. 8086中实现: CLC LEA SI, DATA1 LEA DI, DATA2 LEA BX, DATA3 MOV CX, 4 BACK:MOV AX, [SI] ADC AX, [DI] MOV [BX], AX 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, 2 BACK: 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 DATA1 ADD EAX, DWORD PTR DATA2 MOV EDX, DWORD PTR DATA+4 ADC EDX, DWORD PTR DATA2+4 MOV DWORD PTR DATA3, EAX MOV DWORD PTR DATA3+4, EDX

  41. 2、通用寄存器可作为指针寄存器 使用32位寻址时,32位通用寄存器可作为基址 或变址寄存器使用 例:MOV EAX, [BX] MOV EAX, [EDX] MOV AX, WORD PTR [ECX] MOV AX, [EBX][EBX] 注意: 实模式下,段的大小限制于64KB,32位通用 寄存器作为指针寄存器时,高16位应为0

  42. 3、与比例因子有关的寻址方式 把5个双字相加并保存结果 ARRAY DD 234556H,0F983F5H,6754AE2H, 0C5231239H,0AF34ACB4H RESULT DQ ? SUB EBX, EBX MOV EDX, EBX MOV EAX, EBX MOV CX, 5 BACK: ADD EAX, ARRAY[EBX*4] ADC EDX, 0 INC EBX DEC CX JNZ BACK MOV DWORD PTR RESULT, EAX MOV DWORD PTR RESULT+4, EDX

  43. 数据段中有一个20个字节的表和一个20个字的表,把字节表中每个数据作为表中的高位字节部分移入字表中。数据段中有一个20个字节的表和一个20个字的表,把字节表中每个数据作为表中的高位字节部分移入字表中。 BYTE_TABLE DB 20 DUP(?) WORD_TABLE DW 20 DUP(?) 方法1:用一般寻址方式 XOR SI, SI XOR DI, DI NEXT: MOV AX, WORD_TABLE[DI] MOV AH, BYTE_TABLE[SI] MOV WORD_TABLE[DI], AX INC SI ADD DI, 2 CMP SI, 20 JL NEXT

  44. 方法2:用比例变址寻址方式 XOR ESI, ESI NEXT: MOV AX, WORD_TABLE[ESI*2] MOV AH, BYTE_TABLE[ESI] MOV WORD_TABLE[ESI*2], AX INC ESI CMP ESI, 20 JL NEXT

More Related