1 / 11

4.2 汇编语言程序设计

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

nishi
Download Presentation

4.2 汇编语言程序设计

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. 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

  2. 4.2 汇编语言程序设计 程序设计举例 MOV SI ,OFFSET ASDEC MOV AL, [SI] ;取十位数的ASCII码 SUB AL ,30H ;37H7 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 ; 39H9 ADD AL, BL ;AL=79D MOV BIN, AL ;保存结果 MOV AH, 4CH ;结束返回操作系统 INT 21H CODE ENDS END START 汇编连接EXA11

  3. 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号功能显示这个十进制数。流程图如图所示。

  4. 起 始 初如化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

  5. 例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

  6. 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

  7. 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

  8. 4.2 汇编语言程序设计 例2,有一个100个字节的数据表,存放在数据段中,首地址为TAB,表内各数已按升序排列好。给定一关键字,试编程从表内查找该关键字,若有,则结束;若无将该关键字顺序插入表中,并修改表长。 算法:将给定关键字依次同数据表中的数据比较,若大于表中的数据,则继续同下一个数据比较,若小于表中数据,则先将从该数据开始的数据全部下移一 个地址,然后将关键字插入表中空格,并将表长数加1。 程序: DATA SEGMENT LTH DB 100 ;表长 TAB DB 0FH,12H,14H,… ;数据表 TEM DB 57H ;关键字 DATA ENDS

  9. 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

  10. 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

  11. 课后作业: • P192 4.20 4.21 4.23

More Related