110 likes | 318 Views
4.2 汇编语言程序设计. 程序设计举例. 例1,将 ASCII 码表示的两位十进制数转换成一字节二进制数. 算法: 37 H~39H(ASCII 码)=79 D. 37H=0011 0111B 屏蔽高4位 0011 01111B AND 0000 1111B=0000 0111B 或:0011 0111 B-0011 0000B=0000 0111B 同理: 39 H 转为0000 1001 B 所以79 D=0000 0111BX10D+0000 1001B=0100 1111B. DATA SEGMENT ASDEC DB 37H, 39H
E N D
4.2 汇编语言程序设计 程序设计举例 例1,将ASCII码表示的两位十进制数转换成一字节二进制数. 算法: 37H~39H(ASCII码)=79D 37H=0011 0111B屏蔽高4位 0011 01111B AND 0000 1111B=0000 0111B 或:0011 0111B-0011 0000B=0000 0111B 同理: 39H转为0000 1001B 所以79D=0000 0111BX10D+0000 1001B=0100 1111B DATA SEGMENT ASDEC DB 37H, 39H BIN DB ? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX
4.2 汇编语言程序设计 程序设计举例 MOV SI ,OFFSET ASDEC MOV AL, [SI] ;取十位数的ASCII码 SUB AL ,30H ;37H7 SAL AL ,1 ;AL=AL*2 MOV BL, AL ; BL=AL * 2 MOV CL, 2 SAL AL, CL ; AL=AL * 8 ADD BL, AL ; BL=AL * 2+AL+8=10AL INC SI MOV AL, [SI] ;取个位ASCII码 DATA SEGMENT ASDEC DB 37H, 39H BIN DB ? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START:MOV AX, DATA MOV DS, AX SUB AL, 30H ; 39H9 ADD AL, BL ;AL=79D MOV BIN, AL ;保存结果 MOV AH, 4CH ;结束返回操作系统 INT 21H CODE ENDS END START 汇编连接EXA11
4.2 汇编语言程序设计 起 始 初如化DI=ASDEC SI=PWTAB CX=5 DX:AX=被除数 AX=DX:AX /[SI] DX=余数 AL=ASCII码 ADD SI,2 INC DI [DI]=AL N CX-1=0? Y 显示结果 终 止 程序设计举例 例2:将16位二进制数转换成用ASCII码表示的5位十进制数。 算法1: 用除法指令完成,被除数送DX:AX与PWTAB的数10000、1000、100、10 、1相除,利用循环程序分别可得到对应位的十进制数的ASCII码。调用DOS的9号功能显示这个十进制数。流程图如图所示。
起 始 初如化DI=ASDEC SI=PWTAB CX=5 两种算法对比 DX:AX=被除数 AX=DX:AX /[SI] DX=余数 MOV AX, BIN LOP1: XOR CL, CL MOV BX, [SI] LOP2: SUB AX, BX JB NEXT INC CL JMP LOP2 NEXT: ADD AX, BX ADD CL, 30H MOV [DI], CL INC SI INC SI INC DI CMP BX, 1 JNZ LOP1 MOV AH, 4CH INT 21H CODE ENDS END START AL=ASCII码 ADD SI,2 INC DI [DI]=AL N CX-1=0? 显示 Y 显示结果 终 止 DATA SEGMENT BIN DW 358CH ASDEC DB 5 DUP(?) ,’$’ PWTAB DW 10000, 1000, 100, 10, 1 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV DI, OFFSET ASDEC MOV SI, OFFSET PWTAB 显示调用专用 MOV CX,5 MOV DX, BIN LOP1: MOV AX,DX MOV DX,0 DIV WORD PTR [SI] ADD AL,30H MOV [DI], AL INC SI INC SI INC DI LOOP LOP1 MOV AH,09 LEA DX,ASDEC INT 21H MOV AH, 4CH INT 21H CODE ENDS END START 汇编连接EXA13
例3:编制完成两个4字节的BCD码(8位十进制数)的加法运算程序。例3:编制完成两个4字节的BCD码(8位十进制数)的加法运算程序。 算法:将4字节的BCD码分为4个单字节数相加,从低字节开始,进行4次 循环操作,注意每次相加后必须进行BCD修正。 程序: DATA SEGMENT BCD1 DB 76H,54H,38H,29H BCD2 DB 49H,37H,65H,17H SUM DB 4 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA MULADD:MOV AX, DATA MOV DS, AX LEA SI, BCD1 LEA BX, BCD2 LEA DI, SUM MOV CL, 4 CLC AGAIN: MOV AL, [SI] ADC AL, [ BX] DAA MOV [DI], AL INC SI INC BX INC DI DEC CL JNZ AGAIN MOV AH, 4CH INT 21H CODE ENDS END MULADD 汇编连接EXA14
4.2 汇编语言程序设计 MASM6.0简化段伪指令 (1).MODEL应放在任何简化段指令之前,语法是: .MODEL 内存模式 (2)简化段定义 .STACK 堆栈段 .DATA 数据段 .CODE 代马段 (3).STARTUP和.EXIT 开始和结束CODE。产生相应程序代码并向DOS交还控制权并终止程序执行。 (4)不论是使用简化或完整段都必须使用END伪指令结束。END不产生程序代码。 .MODEL SMALL .STACK l024 .DATA X DB ’Hello’,0DH,0AH, ’$’ .CODE Main PROC .STARTUP MOV AH,09H LEA DX,X INT 21H .EXIT Main ENDP END
4.2 汇编语言程序设计 例1,从键盘输入字符串“PENTIUM CPU”并显显在屏上。 DATA SEGMENT KEYBUF DB 10H,21 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA DX,KEYBUF MOV AH,0AH INT 21H ;输入一串字符 LEA SI,KEYBUF ;字串结束地址 MOV AL,[SI+1] MOV AH,0 ADD SI,AX MOV [SI],‘$’ ;9号功能标志 LEA DX,KEYBUF+2 MOV AH,09 INT 21H ;输出一串字符 EXIT: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START ;程序汇编结束 .MODEL SMALL .DATA KEYBUF DB 10H,21 DUP(?) .CODE .STARTUP LEA DX,KEYBUF MOV AH,0AH INT 21H LEA BX,KEYBUF MOV AL,[SI+1] MOV AH,0 ADD SI,AX MOV [SI],‘$’ LEA DX,KEYBUF+2 MOV AH,09 INT 21H .EXIT END
4.2 汇编语言程序设计 例2,有一个100个字节的数据表,存放在数据段中,首地址为TAB,表内各数已按升序排列好。给定一关键字,试编程从表内查找该关键字,若有,则结束;若无将该关键字顺序插入表中,并修改表长。 算法:将给定关键字依次同数据表中的数据比较,若大于表中的数据,则继续同下一个数据比较,若小于表中数据,则先将从该数据开始的数据全部下移一 个地址,然后将关键字插入表中空格,并将表长数加1。 程序: DATA SEGMENT LTH DB 100 ;表长 TAB DB 0FH,12H,14H,… ;数据表 TEM DB 57H ;关键字 DATA ENDS
4.2 汇编语言程序设计 JMP JUST ;大于表中 ;所有元素 ;放在表末 INST: MOV DI, OFFSET TAB ;CX=未 ;查找的元 ;素的个数 STD ADD DI, word ptr LTH ;DI指向 ;表末 MOV SI, DI DEC SI ;SI=DI-1 REP MOVSB ;未查找 ;元素后移 JUST : MOV [BX] ,AL ;插入关 ;键字 INC LTH ;表长加1 EXIT: MOV AH, 4CH ;结束 INT 21H CODE ENDS END START DATA SEGMENT LTH DB 100 TAB DBOFH,12H,14H,… TEM DB 57H DATA ENDS CODE SEGMENT ASSUME CS:CODE ASSUME DS:DATA,ES:DATA START:MOV AX, DATA MOV DS,AX MOV ES, AX MOV BX,OFFSET TAB MOV AL, TEM MOV CL,LTH ;取表长 MOV CH,00H ;CX=LTH LOP: CMP AL,[ BX ] ;表中查找 JE EXIT ;有关键字不插入 JL INST ;小于,插入关键字 INC BX ;查找下一个 LOOP LOP
4.2 汇编语言程序设计 .MODEL SMALL .DATA LTH DB 100 TAB DB 0FH,12H,14H DB 45H , … TEM DB 57H .CODE .STARTUP MOV AX, DATA MOV DS,AX MOV ES, AX MOV BX,OFFSET TAB MOV AL, TEM MOV CL,LTH MOV CH,00H ;CX=LTH LOP:CMP AL,[ BX ] JE SOP JL INST INC BX LOOP LOP JMP JUST INST: MOV DI, OFFSET TAB STD ADD DI, word ptr LTH MOV SI, DI DEC SI REP MOVSB JUST: MOV [BX] ,AL INC LTH SOP: .EXIT END
课后作业: • P192 4.20 4.21 4.23