《微机原理与应用教学资料》第四章(课件).ppt

上传人:牧羊曲112 文档编号:5898340 上传时间:2023-09-01 格式:PPT 页数:78 大小:398KB
返回 下载 相关 举报
《微机原理与应用教学资料》第四章(课件).ppt_第1页
第1页 / 共78页
《微机原理与应用教学资料》第四章(课件).ppt_第2页
第2页 / 共78页
《微机原理与应用教学资料》第四章(课件).ppt_第3页
第3页 / 共78页
《微机原理与应用教学资料》第四章(课件).ppt_第4页
第4页 / 共78页
《微机原理与应用教学资料》第四章(课件).ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《《微机原理与应用教学资料》第四章(课件).ppt》由会员分享,可在线阅读,更多相关《《微机原理与应用教学资料》第四章(课件).ppt(78页珍藏版)》请在三一办公上搜索。

1、1,第四章:宏汇编语言程序设计,汇编语言程序格式MASM中的表达式伪指令语句DOS系统功能调用程序设计方法程序举例,电气学院学习部资料库,2,4.1 汇编语言程序格式,汇编语言 机器语言的符号表示,面向机器的语言汇编语言的特点:直接控制目标代码,可对输入输出设备进行控制,实时性好;编程效率高,节省内存,运行速度快。源程序1.asm 1.obj 1.exe8086常用的汇编程序:宏汇编程序MASM一、指令性语句:生成机器代码,由CPU来执行格式:标号:指令助记符 操作数,操作数;注释 字母开头,最长31个字符,汇编,链接,电气学院学习部资料库,3,二、伪指令语句:只提供汇编信息 功能:变量定义、

2、存储区分配、段定义、段分配、指示程序开始、结束 格式:名字 伪指令助记符 操作数,操作数;注释 变量名、段名、过程名、符号名(名字后不允许有“:”)三、数据项汇编语言中的操作数:常数、寄存器、存储器、变量、标号和表达式,电气学院学习部资料库,4,1、常数00110101B 026H 123D how are you?2、变量是内存中的一个数据区。在程序中作为操作数使用。变量名又称符号地址,表示该数据项中第一项所在的地址。和常数区别:变量值可以改变。三个属性:段地址 段内偏移地址 类型属性(BYTE,WORD,DWORD)3、标号可执行指令语句的地址的符号表示。可作为转移指令的目的操作数。三个属

3、性:段地址 段内偏移地址 类型属性(NEAR,FAR),电气学院学习部资料库,5,4.2 表达式,汇编后的表达式为一个值组成:运算对象+运算符,运算对象与结果都是整数运算对象:常数、变量、标号分为数字表达式和地址表达式两种一、算术运算符:+,-,*,/,MOD,SHL,SHR所有算术运算符都可以对数据进行运算 例 MOV AX,5+3;(AX)=8 MOV AX,(9MOD 2);(AX)=1 MOV AX,9/2;(AX)=42.对地址运算,只能是+,-,电气学院学习部资料库,6,例2:ARRAY DB 1,2,3,4 TRY DB 20 MOV AX,(TRY-ARRAY);汇编后 MOV

4、 AX,4例3:FIRST DB 1,2,3 MOV AX,FIRST+2二、逻辑运算符:AND,OR,NOT,XOR 只能用于数字表达式中例:PORT EQU 90H AND DL,PORT AND 0FEH;汇编后AND DL,90H 前AND指令助记符,在程序执行时运算 后AND运算符,在汇编时计算,电气学院学习部资料库,7,三、关系运算符:EQ、NE、GT、LT、GE、LE结果为真:输出0FFH、0FFFFH 全1结果为假:全 0例:PORT EQU 2 MOV BX,PORT LT 5;MOV BX,0FFFFH MOV CX,(PORT LT 5)AND 100)OR(PORT G

5、E 5)AND 200);若PORT LT 5PORT LT 5=FFFFH FFFFH AND 100=100PORT GE 5=0000 0000H AND 200=0 100 OR 0=100汇编后 MOV CX,100,电气学院学习部资料库,8,四、数值返回运算符:OFFSET、SEG、TYPE、LENGTH、SIZE 1.OFFSET 返回变量或标号的偏移地址值2.SEG 返回变量或标号的段基地址值例:MOV SI,OFFSET FIRST例:MOV AX,SEG FIRST MOV DS,AX MOV DS,SEG FIRST 3.TYPE 变量:返回类型属性DB 1 DW 2 D

6、D 4(字节数)TYPE 标号:返回距离属性 NEAR-1 FAR-2例4-9,电气学院学习部资料库,9,4.LENGTH 变量当变量定义使用DUP时,返回变量所包含的单元数 例 n DUP():返回n 其它:返回 15.SIZE=LENGTH*TYPE例:FIRST DW 1,2,3,4 M DW 100 DUP(?)MOV AL,TYPE FIRST;MOV AL,2 MOV AL,LENGTH FIRST;MOV AL,1 MOV AL,SIZE FIRST;MOV AL,2 MOV AL,TYPE M;MOV AL,2 MOV AL,LENGTH M;MOV AL,100 MOV AL

7、,SIZE FIRST;MOV AL,200,电气学院学习部资料库,10,五、修改属性运算符:段操作符、PTR、THIS、HIGH、LOW、SHORT 1、段操作符:例:MOV AX,ES:BX ES-段超越前缀 2、PTR:格式:类型/距离 PTR 变量/标号变量:BYTE,WORD 标号:NEAR,FAR例1:AREA1 DB 15H,23H AREA2 DW 1234H MOV AL,AREA1;AL=15H MOV AX,AREA1;应为:MOV AX,WORD PTR AREA1 MOV BL,BYTE PTR AREA2;BL=34H,电气学院学习部资料库,11,例2:MOV BY

8、TE PTR BX,10H;BX 10H MOV WORD PTR BX,10H;BX 0010H例3:JMP FAR PTR AGAIN;实现段间转移.AGAIN-标号3、THIS 格式:变量/标号 EQU THIS 类型/距离 功能:将类型/距离 属性赋予变量/标号,且该变量/标号的地址与下一个存储单元相同例1:FIRST EQU THIS BYTE TABLE DW 200 DUP(?);使变量FIRST与TABLE的偏移地址相同,但FIRST为字节类型,TABLE为字类型例2:SPP EQU THIS FAR MOV AX,0100 H;即SPP:MOV AX,0100H,电气学院学习

9、部资料库,12,4、SHORT SHORT 标号例:JMP SHORT L1;限制跳转的距离在-128+127之间5、HIGH和LOW 字节分离符 HIGH/LOW 变量或标号 HIGH 分离出高位字节 LOW分离出低位字节例:K1 EQU 1234H MOV AH,HIGH K1;MOV AH,12H MOV AL,LOW K1;MOV AL,34H MOV AH,HIGH 1234H;不能+立即数,电气学院学习部资料库,13,六、其他运算符 1、()改变优先级次序 表4-3例:MOV AL,X1 OR X2 AND X3 MOV AL,(X1 OR X2)AND X3 2、用 表达地址表达

10、式例:MOV CL,BX MOV AX,BX+2用 表示多重变量的下标值例:M1 DB 10H,20H,30H,40H MOV AL,M13;MOV AL,40H,电气学院学习部资料库,14,4-3 伪指令语句,一、数据定义语句 DB DW格式:变量名 助记符 操作数,操作数,;注释 变量名 助记符 n DUP(操作数,操作数);注释 功能:将操作数存入变量名指定的存储单元中,或者只分配存储空间不存入数据例1:A1 DB 0DH A2 DW?A3 DB 00H,01H,03H A5 DB 9 DUP(?)A6 DB 8 DUP(1,2,3);共3x8=24个单元 A7 DB How are y

11、ou?A8 DW OK A9 DW OVER;,电气学院学习部资料库,15,二、表达式赋值语句1、赋值语句EQU格式:符号名 EQU 操作数功能:给操作数(变量、标号、常数、表达式、指令)定义一个符号名在同一个程序中不允许重复定义例1:ABC EQU 75 XYZ EQU ABC+2;XYZ EQU ABC+2 ABC EQU 75 A1 EQU BX A2 EQU ADDPURGE 语句可以解除赋值,使它在后面可以重新赋值。例2:PURGE ABC,电气学院学习部资料库,16,2、等号语句=功能:同EQU,但允许重复定义例1:X1=100 X1=X1+100;X1=200 X1 EQU 10

12、0 X1 EQU 200;,电气学院学习部资料库,17,例2:PORT EQU 50H IN_PORT DB PORT+1;IN_PORT DB 51H PORT DB 50H IN_PORT DB PORT+1;PORT DB 50H IN_PORT DW PORT+1;将变量PORT+1的偏移地址,赋给字变量IN_PORT,变量名,符号名,表达式,电气学院学习部资料库,18,三、段定义语句 1、段定义语句 SEGMENTENDS格式:段名 SEGMENT;逻辑内容 段名 ENDS(上下段名必须相同)功能:将一个逻辑段定义成一个整体段名:逻辑段的标识符,不可省略,确定了逻辑段在存储器中的地址

13、(段基地址)例:MOV AX,DATA MOV DS,AX,电气学院学习部资料库,19,堆栈段定义:段名 SEGMENT STACK(不可省略)段名 ENDS说明:定位类型、组合类型、分类名一般情况下可省略Data,Stack,ES段中,只能有伪指令Code段中,可有指令和与指令相关的伪指令,电气学院学习部资料库,20,2、段分配语句:ASSUME格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名功能:将存储器中的某几个逻辑段分别定义成代码段、数据段、堆栈段、附加段(指定某程序运行时,哪几个逻辑段有效。CS、DS段是必须的,SS、ES段看情况)注意:assume指令只指定某个段

14、分配给哪个段寄存器,并将代码段的段基址自动装入CS中,而不能把其它段基址自动装入相应的段寄存器中,所以,在代码段的开始,要有一段初始化程序完成这一工作,电气学院学习部资料库,21,四、过程定义语句 段内调用 段间格式:过程名 PROC 属性(距离属性(NEAR FAR);过程内容 RET N 过程名 ENDP说明:RET N 带参数返回,其中N为正偶数,表示从过程返回后,堆栈指针SP加上N过程内部至少有一条RET指令,也可以有多个,表示此过程具有多个返回出口。过程调用允许嵌套调用,递归调用嵌套调用:一个被调用的过程中又调用另一个过程递归调用:一个被调用的过程又调用自己,电气学院学习部资料库,2

15、2,五、程序开始、结束语句 1、ORG:设置位置指针,指定下面语句的起始偏移地址例:DATA SEGMENT ORG 100H A1 DB 10H,20H,30H;A1的偏移地址为0100H ORG 200H A2 DW 3031H,3233H;A2的偏移地址为0200H DATA ENDS,电气学院学习部资料库,23,2、END格式:END 标号名 放在程序的末尾,CPU遇到END语句停止汇编,每段程序只能有一个END标号名是该程序中第一条可执行语句的标号名,可以缺省,若一个程序中,包含多个模块,则为主程序模块中的标号名称,电气学院学习部资料库,24,六、使用地址计数器的值$来保存当前正在汇

16、编的指令的偏移地址例:ABC DW 1,2,$+4;若ABC的偏移地址为1000H,相当于 ABC DW 1,2,1004H,电气学院学习部资料库,25,完整的汇编语言编写的格式DATA SEGMENTDA1 DB this is a sample programDATA ENDSSTACK SEGMENT STACKST1 DB 100 DUP(?)TOP EQU LENGTH ST1STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART:PUSH DS;返回DOS用 SUB AX,AX PUSH AX

17、,电气学院学习部资料库,26,MOV AX,DATA;初始化DS MOV DS,AX MOV AX,STACK;初始化SS MOV SS,AX MOV SP,TOP;设栈底 RETMAIN ENDPCODE ENDS END START参见例4-29,友情提示:编程中用到的;,:等符号要用半角形式输入,电气学院学习部资料库,27,好的程序特点:程序结构模块化,易读,易调试和维护执行速度快占用内存小编程基本步骤:分析问题绘制程序流程图分配存储空间及工作单元编程调试实际运行,4.4程序设计方法,电气学院学习部资料库,28,1、顺序程序设计 例:设计一个顺序程序实现两个双字数的加法,结果放在加数单元

18、中被加数:变量first,四单元加数:变量second,四单元和:变量second寄存器间接寻址:SI,DI累加器AX,电气学院学习部资料库,29,FIRST DD 12345678H SECOND DD 22334455H MOV SI,OFFSET FIRST MOV DI,OFFSET SECOND MOV AX,SI ADD AX,DI MOV DI,AX MOV AX,SI+2 ADC AX,DI+2 MOV DI+2,AX,电气学院学习部资料库,30,2、分支程序设计 多分支例:x+1 x1 y=x+2 1x0 x+3 x0假设x放在AX里 CMP AX,1 JGE P1 CMP

19、AX,0 JGE P2 ADD AX,3 JMP P3P1:ADD AX,1 JMP P3P2:ADD AX,2P3:MOV 2000H,AX,电气学院学习部资料库,31,跳转表实现多分支根据表内地址分支表地址=跳转表首地址+偏移地址例4-67 有8个加工子程序,入口偏移地址分别为P1,P2,P8,编程实现检测键盘输入数字18,使系统分别转向8个加工子程序。用跳转表实现。,电气学院学习部资料库,32,BASE DW P1,P2,P3,P4,P5,P6,P7,P8KEY DB?MOV AH,1 INT 21H;从键盘输入字符,字符ASCII AL AND AL,0FH DEC ALADD AL,

20、AL;AL乘2 MOV AH,0MOV BX,OFFSET BASEADD BX,AXJMP WORD PTR BX,电气学院学习部资料库,33,例:p3子程序地址在cs:7800H开始,则BASE中第3个数据为7800H,地址DS:0004H,当键盘输入字符3 AL=33H AL=03H AL=2 AL=2X2=4 AH=0 BX=0 BX=0+4=4 BX=0004H=7800H.程序转移至CS:7800H,电气学院学习部资料库,34,3、循环程序设计,电气学院学习部资料库,35,例1:题目同上,利用循环程序设计 MOV SI,OFFSET FIRST MOV DI,OFFSET SECO

21、ND CLC CLD MOV CX,02HLI:LODSW;DS:SI AX,SI+2 SI ADC AX,DI STOSW;AX ES:DI,DI+2 DI LOOP LI;先执行,后判断,电气学院学习部资料库,36,例2:AX寄存器中有16位二进制数,编程统计其中1的个数,结果放到BL中方法一:MOV BL,0;计数值清0 L1:AND AX,AX;先判断,后执行 JZ STOP;若AX=0,则不进入循环 SHL AX,1 JNC L2 INC BL L2:JMP L1 STOP:,电气学院学习部资料库,37,方法二:MOV BL,0;计数值清0 MOV CX,16 L1:SHL AX,1

22、 JNC L2 INC BL L2:LOOP L1 方法三:MOV BL,0 MOV CX,16 L1:ROL AX,1 ADC BL,0 LOOP L1,电气学院学习部资料库,38,多重循环 3点注意:多重循环的初始控制条件内循环可嵌套在外循环中,内可跳到外,外不得进入内循环不要回到初始条件,造成死循环,电气学院学习部资料库,39,3 5 7 8 1 9 3 5 7 1 8 9 3 5 1 7 8 9 3 1 5 7 8 9 1 3 5 7 8 9,例4-72 冒泡排序。使一个数组中的数据从小到大排列。分析:第一遍内循环N-1次,最大数像气泡一样升至数组尾第二遍内循环只要N-2次,找到次大数

23、,依次类推外循环共需N-1遍 初始 5 3 8 7 9 1 一 3 5 8 7 9 1 二 3 5 8 7 9 1 三 3 5 7 8 9 1 四 3 5 7 8 9 1 五 3 5 7 8 1 9,第一遍内循环 N-1 次,外循环 N-1 遍,电气学院学习部资料库,40,电气学院学习部资料库,41,DATA SEGMENT BUF DW N,15,37,8600,0A768H,3412H,1256H,DW 76HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV BX,0;i=0 MOV CX

24、,BUFBX;NCX DEC CX;N-1,内循环次数L1:MOV DX,CX;外循环次数L2:ADD BX,2,电气学院学习部资料库,42,MOV AX,BUFBX CMP AX,BUFBX+2 JBE CONTI XCHG AX,BUFBX+2 MOV BUFBX,AXCONTI:LOOP L2 MOV CX,DX MOV BX,0;回到i=0,重新开始比较 LOOP L1;CX-1:内循环次数N-1,N-2;外循环次数-1 MOV AX,4C00H INT 21H RETCODE ENDS END START,电气学院学习部资料库,43,四、子程序结构子程序说明名称、功能存储单元和寄存器

25、入口和出口有否调用其它子程序主程序调用子程序注意:堆栈保护现场参数传递寄存器存储器堆栈,电气学院学习部资料库,44,例4-30:过程调用,实现内存中N个BCD码数据相加(完整程序)DATA SEGMENT FIRST DB 22H,33H,44H,55H;加数1 SECOND DB 55H,66H,77H,88H;加数2 SUM DB 20 DUP(?);定义存放结果单元 DATA ENDSSTACK SEGMENT STACK STA DB 20 DUP(?);设置堆栈长度为20个字节 TOP EQU LENGTH STASTACK ENDS,电气学院学习部资料库,45,CODE SEGME

26、NT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATAMAIN PROC FARSTART:MOV AX,STACK;将堆栈段段地址SS MOV SS,AX MOV AX,TOP;将堆栈指针指向栈底 MOV SP,AX PUSH DS;使得程序执行完了,能返回DOS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX;MOV DS,DATA,初始化 MOV ES,AX;将数据段段地址DS、ES MOV SI,OFFSET FIRST MOV BX,OFFSET SECOND MOV DI,OFFSET SUM,电气学院学习部资料库,46

27、,MOV CX,04 CLD CLCADBCD:CALL AAM LOOP ADBCD RET;返回DOSMAIN ENDP AAM PROC NEAR LODSB;DS:SIAL SI+1SI ADC AL,BX DAA STOSB;ALES:DI DI+1DI INC BX RETAAM ENDPCODE ENDS END START,电气学院学习部资料库,47,;子程序入口参数:SI,BX 出口参数:DI 参数传递:存储器,电气学院学习部资料库,48,4.5 DOS系统功能调用,Disk Operation System 磁盘操作系统 一、DOS常用的软中断命令DOS具有对I/O设备管理

28、及磁盘与文件管理功能,一部分固化在系统的ROM中一部分在系统启动时调入内存,通过软件中断来调用中断指令:INT n 表4-6 DOS 常用的软中断命令 入口、出口参数,电气学院学习部资料库,49,二、DOS系统功能调用 INT 21H附录F AH=功能号每个子程序对应一个功能号(相应的入口号),格式如下:功能号AH入口参数指定寄存器INT 21H根据出口参数分析功能调用执行情况1.DOS键盘功能调用 表4-7键入单字符 AH=1、8、6、7 例:从键盘输入字符并显示 MOV AH,1 INT 21H;检查,若为Break键,自动调用INT 23H,电气学院学习部资料库,50,键入字符串 功能号

29、:AH=0AH 入口参数:DS:DX=缓冲区首址例4-52:开辟一个缓冲区,从键盘输入一个字符串,将输入的字符数CL寄存器,并将指针指向字符串的第一个字符。BUFF DB 100;定义存放100字节的缓冲区 DB?;系统填入实际输入字符字节数 DB 100 DUP(?);存放输入字符的ASCII码 MOV DX,OFFSET BUFF MOV AH,0AH INT 21H MOV BX,DX MOV CL,BX+1;取输入字符数CL ADD DX,2;将指针指向第一个字符,电气学院学习部资料库,51,2、DOS显示功能调用表4-8单字符操作 例:MOV DL,$MOV AH,2 INT 21H

30、;调用结果,屏幕上在光标处显示$字符串操作 AH=9的INT 21H,注意串必须以$结束例4-55:在屏幕上显示HOW DO YOU DO?字符串,且回车、换行。DATA SEGMENT MES DB HOW DO YOU DO?,0DH,0AH,$;0DH(回车),0AH(换行)DATA ENDS,电气学院学习部资料库,52,CODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN:PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSET MES INT 21H RET CODE END

31、S END START,电气学院学习部资料库,53,3、返回操作系统 4CH功能调用:能够结束当前正在执行的程序,返回DOS系统 MOV AH,4CH INT 21H,电气学院学习部资料库,54,4.6 上机实验 参见课本及实验指导书 实验一:两个多位十进制数相减的实验 实验二:排序实验要求:从首地址偏移地址为1000H的内存区域开始存放10个无符号字节数,设计程序将这些数从大到小排序,并将排序前后次序分别显示在屏幕上。参见课本P181及实验指导书实验十三 MOV BX,0 MOV CX,N-1;L1:MOV DX,CX L2:MOV AX,BUFBX CMP AX,BUFBX+1 JAE C

32、ONTI XCHG AX,BUFBX+1 MOV BUFBX,AX ADD BX,1CONTI:LOOP L2MOV CX,DXMOV BX,0 LOOP L1 调用显示子程序,参见P177,电气学院学习部资料库,55,4.7 程序举例,一、查表 例4-64二、代码转换类 16位二进制 ASC码(例4-69)无符号二进制组合BCD码(例4-78)ASCII码 有符号二进制(例4-79)ASC码 显示三、算术运算类 加减乘除(二进制,BCD码),电气学院学习部资料库,56,例4-64 内存中TABLE开始存放09的平方值,通过人机对话,当任给定一个数X(09),查表得X的平方值,放在AL中。TA

33、BLE DB 0,1,4,9,16,25,36,49,64,81BUF DB Please input one number(09):,0DH,0AH,$MOV DX,OFFSET BUFMOV AH,9INT 21H;显示字符串MOV AH,1INT 21H;输入字符AND AL,0FH;ASCIIBINMOV BX,OFFSET TABLE;查表XLATHLT,电气学院学习部资料库,57,例4-69 将BX中的16进制数转换为ASCII码,存放到BUF开始的内存单元中去,并在屏幕显示数值转换表:入口参数:BX出口参数:BUF开始的内存单元中,SI指示。,电气学院学习部资料库,58,LEA

34、SI,BUF MOV CH,4;循环4次NEXT:MOV CL,4 ROL BX,CL;最高位移到右边 MOV AL,BL;一位十六进制数转换成ASCII码 AND AL,0FH ADD AL,30H CMP AL,3AH JL STORE ADD AL,7STORE:MOV SI,AL MOV AH,2 MOV DL,AL INT 21H;显示,INC SIDEC CHJNZ NEXTHLT,电气学院学习部资料库,59,例4-78:将AX中的无符号16位二进制数转换为4位压缩型BCD码算法一:千位数:无符号16位二进制数/1000的商,得余数1百位数:余数1/100的商,得余数2十位数:余数

35、2/10的商,得余数3个位数:余数3算法二:把要转换的数分别减去相应的最高次幂,直至不够减,此时减的次数即是相应的位,电气学院学习部资料库,60,78657000,1000,7,865-余数1,865,100,800,65-余数2,8,65 60,10,6,5-余数3,程序中,7865D=1EB9H1000D=3E8H 865D=361H1EB9H/3E8H=7H.361H361H/64H=8H41H41H/0AH=6H5H,电气学院学习部资料库,61,复习除法:16位/8位 商AL,余AH(AX)(源操作数)32位/16位商AX,余DX(DX,AX)(源操作数)若计算 16位/16位,8位/

36、8位,需将被除数扩展程序:入口参数:AX=16位二进制数出口参数:AX=4位压缩型BCD码(CF=0时)占用资源:CX,DX,千位 百位,千位 百位 十位,千位 百位 十位 个位,千位,每次所得商,依次移入DX,DX,DX,DX,DX,左移4位,电气学院学习部资料库,62,B2TOBCD PROC FAR CMP AX,9999;AX9999,则置CF=1,JBE TRAN;不转换 STC JMP EXITTRAN:PUSH CX;保护现场 PUSH DX XOR DX,DX;32位/16位,需DX MOV CX,1000;求千位数 DIV CX;商在AX,余数1在DX XCHG AX,DX;

37、余数1在AX,千位数(商)在DX最低4位,DX=0007H,电气学院学习部资料库,63,MOV CL,4;DX左移4位,低位添SHL DX,CL;四个0,DX=0070HMOV CL,100;求百位数DIV CL;商在AL,余数2在AHADD DL,AL;百位数入DX,DX=0078H MOV CL,4;DX左移4位,DX=0780HSHL DX,CLXCHG AH,AL;余数2在AL AND AX,00FFH;AH=0MOV CL,10;求十位数 DIV CL;商在AL,余数3在AH,电气学院学习部资料库,64,ADD DL,AL;DL=86HMOV CL,4SHL DX,CL;DX=786

38、0HADD DL,AH;DX=7865H MOV AX,DX;转换后的数入AXPOP DXPOP CXEXIT:RETB2TOBCD ENDP作业:将AH中存放的无符号8位二进制数转换为3位压缩型BCD码,电气学院学习部资料库,65,例4-79 将十进制数的ASCII码转换成有符号二进制数,结果存入AX字符串转换:数字字符(30H39H)对应一位十进制数(09)例:十进制数a0a1a2转换成十六进制数:十六进制数=a0 x100+a1x10+a2=(a0 x10+a1)x10+a2符号字符串检测字符串的正负,若为正,按的算法转换即可若为负,将标识符MINU置1,转换结束还需将AX中的数取补,电

39、气学院学习部资料库,66,字符串是否合法?(3点要求)字符串字符个数6,AX为16位,216=65536(5位十进制数加1个符号位)字符在09之间转换完的结果要能存入AX中,必须结果-32768+32767调用的子程序:CHE 乘10子程序,电气学院学习部资料库,67,查符号,X10 CHE,置标志位,DX清零,是负数?,修改地址,字符串首地址给SI,Y,读下一位数修改地址,累加到DX,字符串转换完?,是负数?,取补,Y,电气学院学习部资料库,68,入口:DX字符串地址偏移量,CX字符个数 出口:CF=0,AX=二进制数;CF=1,则字符串非法,AX=0使用的寄存器:BX,SIAS2BIN P

40、ROC FAR PUSH CX PUSH DX PUSH SI MOV SI,DX CMP CX,6 JA ERR CLD MOV AL,SI;查符号 CMP AL,-JNE CHK MOV MINU,1 JMP DECSCHK:CMP AL,+JNE CLRDDECS:DEC CX INC SI,电气学院学习部资料库,69,CLRD:SUB DX,DXNEXT:CALL CHE;调用乘10子程序 JC ERR LODSB CMP AL,0 JB ERR CMP AL,9 JA ERR AND AX,000FH ADD DX,AX JC ERR LOOP NEXT MOV AX,DX CMP

41、MINU,1;负数求补 JNE EXIT NEG AX JMP EXITERR:STC;字符串为非法,将CF置1,AX=0 MOV AX,0,电气学院学习部资料库,70,EXIT:POP SI POP DX POP CX RETAS2BIN ENDPCHE PROC NEAR;乘10子程序 PUSH BX MOV BX,DX SHL DX,1 SHL DX,1 ADD DX,BX SHL DX,1 POP BX RET CHE ENDP,电气学院学习部资料库,71,例:两个多字节无符号数乘法子程序(参考例4-29,P142)高16位 低16位 高16位 低16位 DX0 AX0 被乘数低16位

42、X低16位 DX1 AX1 被乘数高16位X低16位 DX2 AX2 被乘数低16位X高16位+DX3 AX3 被乘数高16位X高16位 BX+6 BX+4 BX+2 BX,电气学院学习部资料库,72,DATA SEGMENT FIRST DW 3213H,4746H SECOND DW 2278H,6452H SUM DW 4 DUP(?)DATA ENDSSTACK SEGMENT STACK STA DB 100 DUP(?);定义一个100字节的堆栈,TOP LABEL WORD;TOP为栈底的名,类型为字STACK ENDS,电气学院学习部资料库,73,CODE SEGMENT AS

43、SUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART:MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX,电气学院学习部资料库,74,MOV SI,OFFSET FIRST MOV DI,OFFSET SECOND MOV BX,OFFSET SUM CALL DWMULT;调用乘法子程序 RETMAIN ENDP CODE ENDS(若题意要求用段间调用来实现)DCODE SEGMENT ASSUME CS:DCODE,DS:

44、DATA,SS:STACKDWMULT PROC FAR PUSH AX PUSH DX,电气学院学习部资料库,75,MOV AX,SI;低16位 X 低16位 MUL WORD PTR DI MOV BX,AX MOV BX+2,DX MOV AX,SI+2 MUL WORD PTR DI;高16位 X 乘数低16位 MOV BX+4,DX CLC ADD BX+2,AX ADC BX+4,0 CLC,电气学院学习部资料库,76,MOV AX,SI;低16位 X 乘数高16位 MUL WORD PTR DI+2 ADD BX+2,AX ADC BX+4,DX MOV WORD PTR BX+

45、6,0 ADC WORD PTR BX+6,0 CLC MOV AX,SI+2;高16位 X 乘数高16位 MUL WORD PTR DI+2 ADD BX+4,AX ADC BX+6,DX,电气学院学习部资料库,77,POP DX POP AX RETDWWULT ENDPDCODE ENDS END START 高16位 低16位 16位 DX0 AX0 低16位 X 16位+DX1 AX1 高16位 X 16位 BX+4 BX+2 BX,;子程序入口:SI、DI指示的内存单元,出口:BX指示的内存单元,使用寄存器:AX、DX,电气学院学习部资料库,78,谢谢大家!,作业:4-2,3,5,6,11,13,15,16,电气学院学习部资料库,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号