第4章 汇编语言.ppt_第1页
第4章 汇编语言.ppt_第2页
第4章 汇编语言.ppt_第3页
第4章 汇编语言.ppt_第4页
第4章 汇编语言.ppt_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,微型计算机原理及应用,2,第四章 汇编语言程序设计,3,4.1 汇编语言概述,4,汇编语言:用指令的助记符、符号地址、标号、伪指令等符号书写程序的语言称为汇编语言。源程序:用这种汇编语言书写的程序称为汇编语言源程序或称源程序。汇编:把汇编语言源程序翻译成在机器上能执行的机器语言程序(目的代码程序)的过程叫做汇编。汇编程序:完成汇编过程的系统程序称为汇编程序。,5,.ASM,.OBJ,.EXE,汇编,连接,宏汇编程序: MASM.EXE,连接程序: LINK.EXE,编辑程序,源程序,连接程序,汇编程序,目标程序,执行程序,步骤: 1)编写源程序;2)汇编;3)连接;4)调试。,6,每当一个

2、用户的可执行文件.EXE装入内存后,存储器的分配情况如图:,00000H,DS,ES,100个字节,SS,用户程序空间,FFFFFH,CS,7,用户编写程序,程序在计算机中运行,计算机的控制由操作系统交给用户程序,运行用户程序,当用户程序运行结束后,应再将控制权交回操作系统,所以,在程序中应该有返回DOS的操作。在计算机中,返回DOS的操作由操作系统中的一个子程序来实现,用户使用时调用这个子程序即可。,8,无论用户程序有几段,也无论这些段的排列顺序如何,用户程序的代码前一定有100个字节的程序段前缀(Program Segment Prefix, 简称PSP),PSP给出了用户的可执行文件(.

3、EXE)的若干控制信息。其中PSP的开始处(第1,2字节)有一条中断指令INT 20H的代码,通过它可以结束用户程序,返回操作系统。在用户程序执行完以后,通过执行该条指令就可以返回DOS。,9,4.2 汇编语言程序语句行的构成,10,由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由14个部分组成,其格式是: 标识符 指令助记符 操作数;注解,其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至少一个)分开,一行最多可有132个字符。,汇编语言的语句格式,11,(1)标识符 标识符由下列字符组成: 字母: AZ, az; 数字: 09; 特殊字符: ? . _

4、 $,数字不能作标识符的第一个字符,而. 仅能作标识符的第一个字符,标识符最长为31个字符。,4.2.1 标记,(2)保留字 汇编语言中预先保留下来的具有特殊含义的符号,只能作固定用途,不能作为标识符用。 如8086的指令、伪指令、寄存器名等都是保留字。,12,(3)界符 表明某个标记的结束,本身也有一定的意义。一般作为一个程序中或者一条指令中两个部分的分隔符用。 , ; + ( ) . * NUM为 6,20,SEG 和OFFSET SEG: 求标号或变量的段地址 OFFSET: 求标号或变量的偏移地址,例如,定义: SLOT DW 25 则:MOV AX,SLOT; 从SLOT地址中取一个

5、字送入AX MOV AX,SEG SLOT; 将SLOT的段地址送入AX MOV AX,OFFSET SLOT; 将SLOT的段内偏移地址送AX,21,3) TYPE 返回标号或存储器操作数的类型值 对存储器操作数:表示占用的字节数 对标号:表示过程或指令地址的调用类型,表3-1 存储器操作数的类型属性及返回值 字节 字 双字 NEAR FAR 1 2 4 1 2,22,4) LENGTH 和 SIZE(对用DUP定义数据的情况下),LENGTH: 返回一个与存储器操作数相联系的基本数据个数, SIZE: 返回一个为存储器操作数分配的字节数 关系:SIZE=LENGTH TYPE,例如:若 M

6、ULT-WORD DW 50DUP(0) 则 LENGTH MULT-WORD=50 SIZE MULT-WORD=100 TYPE MULT-WORD=2,23,3、属性运算符,用来给指令中的操作数指定一个临时的属性,而暂时忽略操作数定义时的属性。,1) PTR 定义操作数为新的类型,一般格式:类型 PTR 操作数,功能:建立一个存储器操作数,它与其后的存储器操作数有相同的段地址和偏移地址,但有不同的类型。,F2 DW 3456H MOV AL, BYTE PTR F2 MOV BX, 3 MOV BYTE PTR BX, 3,; AL: 56H,; 错,类型不明确,; 字节传输,24,2)

7、 THIS,一般格式:操作数 EQU THIS 类型,功能:建立一个存储器操作数,它与下一条指令的存储器操作数有相同的段地址和偏移地址,但有不同的类型。,例如:BUFB EQU THIS BYTE BUFW DW 1234H,5678H,3) LABEL,一般格式:操作数 LABEL 类型,25,4) SHORT,一般格式:JMP SHORT DES,功能:确定转移地址的属性,用在JMP指令中,规定转移范围在+127个字节内。,例:L1:JMP SHORT L2 L2:MOV AX,BX 标号L1、L2之间的字节距离小于127字节,称为短转移。,26,5) HIGH运算符 取地址表达式或16位

8、绝对值高8位。 例:CONST EQU 0ABCDH 则:MOV AH,HIGH CONST 将汇编成:MOV AH,0ABH 6) LOW运算符 取地址表达式或16位绝对值低8位。 在上例中,MOV AL,LOW 0ABCDH 将汇编成:MOV AL,0CDH,27,4.3 常用伪指令,28,伪指令:伪指令不是CPU运行的指令,而是程序员给汇编程序下达的命令。是在汇编源程序期间由汇编程序执行的命令。,伪指令用来对汇编程序进行控制,对程序中的数据进行存储空间分配、数据定义、指示程序结束等处理,其格式和汇编指令一样,但不产生目标代码,即不直接命令CPU去执行什么操作。,29,4.3.1 数据定义

9、伪指令,DB:定义字节,其后的每个操作数占有一个存储单元,连续存放;,BUFFER DB 2, 3 STRING DB NO,DW:定义字,其后的每个操作数占有两个字节;,BUF DW 2, 3, 5,STRING,DD: 定义双字,其后每个操作数占4个字节;,还有DQ(4个字长)、DT(10个字节长),30,若仅保留单元,不初始化,用?代替初值; 若数据重复,用 n DUP( )代替,n为重复次数。,ARRAY DB 100 DUP(?),保留100个字节,首地址为ARRAY,不初始化,即100个字节内均为随机值,DATA1 DB 100 DUP(AB),初始化200个字节,内有100个41

10、H, 42H,31,例:有如下数据定义伪指令: VAL DB 1,4 DUP (5, 2 DUP(FFH, 0 ) 则在VAL存储区前10个字节单元的数据是:,1,5,FFH,0,FFH,0,5,FFH,0,FFH,若定义 DW 1, 2, 5 DUP(Y,2 DUP(3), 则在存储区的数据是什么?,32,4.3.2 符号定义伪指令(表达式赋值伪指令),标识符 EQU 表达式,标识符 = 表达式,给标识符定义一个值或其他符号名或一条可执行语句,汇编时,凡是出现该标识符的地方就用定义的数据替代。,注意:用EQU赋值的名字不能重新赋值,需用PURGE释放后重新定义。如:PURGE TIMES T

11、IMES EQU 100,TIMES EQU 50 BUF DB TIMES DUP(?),等效于:,BUF DB 50 DUP(?),BETA = TIMES-2 BETA = TIMES+5 ;重新赋值,33,DATA SEGMENT A DW 3 B DW 4 L EQU B-A DATA ENDS,DS:0000H,数据段,L为常量,不占空间,值为1,34,4.3.3 段定义伪指令SEGMENT和ENDS,一般的源程序分为4个段:代码段Code、数据段Data、堆栈段Stack、附加段Extra。 各个段从段定义语句开始,到段结束语句ENDS结束。,段名 SEGMENT 定位类型 组合

12、类型 类别, 段体 ,段名 ENDS,用户指定,可任选定义,35,1)段名必须是合法的标识符。,2)定位类型: 表示本段起始地址位于何处,内存可以看成是一本书,将其分成页,段,字,和字节。 每256个地址为一页(PAGE),每页的起始地址为二进制: * * * 0000 0000 16进制:*00H,第一页 (256个地址),第二页 (256个地址),00000H,000FFH,00100H,00200H,001FFH,36,每16个地址为一段(PARA), 每段的起始地址为二进制: * * * * 0000 16进制:*0H,第一段 (16个地址),第二段 (16个地址),*00H,*0FH

13、,*10H,*1FH,*20H,段(节)是默认的定位类型。,37,每2个地址为一个字(WORD),每个字的起始地址为偶数; 最基本的类型是字节(BYTE),每个字节只包含一个地址,可以是内存的任何空间。,定位类型表示所定义的段存放在内存空间时,段首地址对内存空间的要求,即段起始点是放在一页的起点上(PAGE)还是一段的起点上(PARA)等,如果不定义定位类型,编译程序将默认其为段类型,即将段首地址放在从*0H开始的内存空间。,BYTE: 表示本段起始单元可以从任一地址开始; WORD: 表示本段起始单元从一个偶地址开始; PARA: 表示本段起始单元从一个段的边界开始(默认); PAGE: 表

14、示本段起始单元从一个页的边界开始。,38,3)组合类型,告诉汇编程序,所定义的段与其他段的关系,即将该段存放内存时,是否将该段与其他段在物理上或逻辑上放在一起。,NONE: 表示本段与其他段不发生任何关系,该段有自己的段基址,是默认的组合关系。,PUBLIC:在满足定位类型的前提下与其他模块的同名段连接在一起,形成一个新的逻辑段,共用一个段基址。,39,COMMON: 表示产生一个覆盖段。连接时,把本段与其他也用COMMON说明的同名段置成相同的起始地址,重叠在一起,共享相同的存储区,其段长度由最长的段确定。,STACK: 在每个汇编程序中,只能必须有一个堆栈段,连接时,将本段与其他也用STA

15、CK说明的同名段连接成一个连续的STACK段,编译程序自动初始化SS和SP寄存器,使SS的内容为该连续段的段基址,SP指向堆栈底部加1的存储单元。,40,MEMORY: 表示本段在存储器中应定位在所有其他段的最高地址。,AT: 表示本段从表达式指定的地址处开始装入,这样,在程序中用户就可以直接定义段地址,这种方式不适用于代码段。,41,4) 类别,是用单引号括起来的字符串,以表明该段的类别,如代码段(CODE)、数据段(DATA)、堆栈段(STACK)等。当然也允许用户在类别中用其他的名,这样进行连接时,连接程序便将同类别的段(但不一定同名)放在连续的存储区内。,42,4.3.4 设定段寄存器

16、伪指令ASSUME,一般格式: ASSUME 段寄存器: 段名,段寄存器: 段名,,功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。,例如,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,43,注意:,当程序运行时,由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,因此用户在程序中不必设置。但是,在装入程序中DS寄存器被用作其它用途,因此,在用户程序中必须用两条指令对DS进行初始化,以装入用户的数据段段地址。当使用附加段时,也要用MOV指令给ES赋段地址。,例如,C

17、ODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,DS才有实际段值 CODE ENDS,44,4.3.5 过程定义伪指令PROC和ENDP,在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。 要求先定义后使用。,一个过程由伪指令PROC和ENDP来定义,其格式为:,过程名 PROC 类型 过程体 RET 过程名 ENDP 注意:PROC和ENDP要成对出现。,过程名是为过程所起的名称,不能省略,类型由FAR(远过程,为段间调用)

18、和NEAR(近过程,为段内调用)来确定,如果缺省类型,则该过程就默认为近过程。,过程体内至少有一条RET指令,45,一个码段中可以包含一个或许多过程。过程可以嵌套调用,可以递归调用。,MYCODE SEGMENT ASSUME CS: MYCODE SUB1 PROC FAR RET SUB1 ENDP SUB2 PROC NEAR RET SUB2 ENDP CALL SUB2 MYCODE ENDS,FAR: 该过程为远过程,调用该过程时为段间调用,即CS和IP均要重新赋值; NEAR: 该过程为近过程,调用该过程时为段内调用,只修改IP。(默认),CALL: 调用过程SUB2,到此处才真

19、正去执行子程序。,46,例:延时100ms的子程序,编程定义如下:,DELAY PROC MOV BL, 10 AGAIN: MOV CX, 2801H WAIT1: LOOP WAIT1 DEC BL JNZ AGAIN RET DELAY ENDP,任何一个过程都要求先定义,后调用。调用时才真正执行该过程。一个过程产生一段目标代码。,47,在汇编语言书写的源程序中,有的程序段要多次使用,为了简化书写,该程序段可以用一条特殊的指令来代替,这个特殊的指令就是宏指令。 宏指令只是为了方便书写,当汇编程序汇编生成目标代码时,在引用宏指令处仍会产生原来程序段应生成的目标代码,引用一次生成一次。,4.

20、3.6 宏指令,48,1) 宏指令定义格式:,宏指令名 MACRO 汇编程序段(宏体) ENDM,MACRO 与 ENDM必须成对出现,先定义后引用,SHIFT MACRO MOV CL, 4 SAL AL, CL ENDM,宏名,程序段: 将AL左移4位(乘16),IN AL, 5FH SHIFT OUT 5FH, AL,在程序中引用宏指令如下:,49,宏指令也可以接收参数,如对X左移Y位。,SHIFT MACRO X, Y MOV CL, Y SAL X, CL ENDM,形参列表,MOV BX, WORD PTR BUF SHIFT BX, 4 MOV WORD PTR BUF , BX

21、,在程序中引用宏指令如下:,功能:BX的值左移4位。,BXX 4Y 实参形参一一对应,50,4.3.7 定位伪指令,格式:ORG 表达式,功能:指定在其后的指令或数据存放的偏移地址。,CODE SEGMENT ORG 0100H MOV AX, 0 CODE ENDS,指定MOV指令放在代码段中偏移地址为0100H开始的位置。,DATA SEGMENT ORG 2000H NUM DB 0,5 DATA ENDS,指定NUM指向数据段中偏移地址为2000H开始的位置 (开始存放0,5)。,51,4.3.8 汇编结束伪指令END,汇编程序在汇编时遇到END,便知源程序已经结束。,一般格式:END

22、 表达式,表达式为可执行程序运行的起始位置。一般是一个标号。,52,完整结构1,DATA SEGMENT X DB 3 Y DB 5 DATA ENDS STACK SEGMENT STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA, SS:STACK BEGIN: MOV AX, DATA MOV DS, AX MOV AH,4CH INT 21H CODE ENDS END BEGIN,设置DS段寄存器内容,源程序结束,第一条指令的地址,分配段寄存器,首指令位置,数据段,堆栈段(可略),返回D

23、OS,53,完整结构2,DATA SEGMENT X DB 3 Y DB 5 DATA ENDS STACK SEGMENT STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA, SS:STACK BEGIN PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX RET BEGIN ENDP CODE ENDS END BEGIN,将PSP首址压栈,以便返回DOS。,设置DS段寄存器内容,源程序结束,第一条指令的地址,分配段寄存器,

24、主过程名,数据段,堆栈段(可略),返回DOS,54,4.4 汇编程序设计,55,汇编语言编写的程序也跟高级语言类似,程序结构分三种:顺序、分支、循环;较复杂的程序也应该是由众多子程序组成的,每个子程序是一个过程,在程序中被显式地调用。变量等数据部分被定义在数据段,所有程序都要显式地定义堆栈段。汇编程序的每一条指令都与机器语言一一对应,因此,汇编生成的可执行文件代码少,适合于实时控制,但由于语法成分很少,不适合于复杂的算法、运算。汇编程序主要的调试环境是DOS系统下的DEBUG程序。,56,一、 顺序程序设计 顺序程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行

25、。,57,例1 利用查表法计算平方值。已知0 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X 9且为整数。,分析:解这个问题,关键在两方面, 一是了解平方表的存放位置; 二是根据X的值,找到X对应X2在表 中位置(在这为表的首地址加上X 单元的内容)。也可以用查表指令。,58,例2 已知 Z=(X+Y)-(W+Z),其中X,Y, Z,W均为用压缩BCD码表示的数,写出程序段。,分析:注意是压缩BCD码相加减,因此 正常运算完要进行相应的十进制 调整。,59,二、 分支程序设计 分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图

26、,若条件A成立,则执行P1;否则执行P2。 一般情况下,两个分支仅选其一执行。,60,例1 试编写完整程序,实现符号函 数。变量X的符号函数可表示为: 1 X0Y= 0 X=0 -1 X0,分析:解这个问题,要注意对X的值的判 别。这时,根据判别的结果要出 现三个分支,因此,需要进行两 次判别。,61,例2 将内存数据区中从STR1开始的数据 块传送到STR2指示的另一区域中, 数据块长度由STRCOUNT指示。,分析:采用串操作实现。 首先判断源数据块和目的数据块 之间是否有重叠,若无则直接传;若有则要判别: 源地址数据块长度目的地址 是则地址增量修改,反之地址减量改。,62,三、 循环程序

27、设计 循环程序是经常遇到的程序结构,一个循环结构通常由以下几个部分组成。,1循环初始化部分。一般要进行地址指针、循环次数的设置,相关寄存器的清零等操作。只有正确地进行了初始化设置, 循环程序才能正确运行,及时停止。 2循环体。是要求重复执行的程序段部分。 3循环控制部分。由该部分修改并判断控制循环的条件是否满足,以决定是否继续循环。 4循环结束部分。如保存循环运行结果等。,63,例1 将数据段中TABLE开始的连续100个 单元写入 0AAH,然后逐个读出进行 检查, 若发现有错,则置FLAG1, 反之,置FLAG0。试编写完整程序。,分析:通过循环,往指定存区写入0AAH, 然后逐个读出,与

28、0AAH相比较, 全部相同时,0 Flag 如有不相同时,1 Flag 设置BX为地址指针,初值指向TABLE, 循环控制变量初值为100。,64,例2 设内存BUFF开始的单元中依次存放 着30个8位无符号数,求它们的和并 放在SUM单元中,试编写完整程序。,分析:这是一个求累加的程序。设置工作单 元存放累加和,初始值送0。然后逐个 读出数据,做累加和数据 累加和, 循环进行N次。 设置SI为地址指针,初值指向BUFF, 循环控制变量初值为30。,65,例3 在ARRAY开始的存区中存放着一组字 数据,个数由COUNT指示。试编写程序 段寻找其中的最大数,放在MAX中。,分析:设置工作单元,

29、先把第一个数放入, 然后逐个读出数据与其相比较, 如读出的数据大时,则数据 工作单元 如工作单元中的数据大时,则不送。 循环进行N-1次。 设置BX为地址指针,初值指向ARRAY, 循环控制变量初值为COUNT-1。,66,例4 在给定的16位数组中,找出大于零、等于零和小于零的数据个数,并紧跟着原数组存放。,已知数据段定义如下:DATASEGMENTBUFF DW X1,X2,X3,XnCOUNT EQU $-BUFF ;此时,COUNT的 值为BUFF所占的字节数PLUS DB ?ZERO DB ?MINUSDB ?DATAENDS,67,分析:这是一个统计问题,须设定三个计数器分别 统计

30、三种情况下的结果。计数器的初始值送0。 然后逐个读出数据进行判别,满足哪个条件, 就在哪个计数器中做统计即计数器1 计数器, 循环进行N次。 设置BX为地址指针,初值指向BUFF,DH、DL、 AH为计数器,分别存放0、0、0的数据个数。 循环控制变量初值为原始数据个数。,68,例5 要求从0FFH端口输入一组100个字符,若 该字符是数字,则转换成数值后以非压缩 BCD码的形式存放在以DATA开始的存区, 并统计输入的数字的个数,存放在NUM 单元中。,分析:如何确定输入的是数字? 判别:0 X 9 如何将数字的ASCII码转换成非压缩BCD码? X AND 0FH X 或 X30H X 即

31、可 设置BX为地址指针,初值指向DATA,DH为 计数器进行统计。循环进行N次。 循环控制变量初值为100。,69,MY-DATASEGMENTDATA DB 100 DUP(?)NUMDB?MY-DATA ENDSMY-PROG SEGMENT ASSUME CS:MY-PROG, DS:MY-DATASTART:MOV AX,MY-DATA MOV DS,AX,MOVCX,100 MOV DH,0 LEA DI, DATA AGAIN: IN AL,0FFH CMP AL,0 ; JB NEXT ;不是数字转移 CMP AL, 9 ;与9比较 JA NEXT,SUB AL,0 ;求相应的非

32、 压缩BCD码 MOV DI,AL ;存入 (*) INC DH ;进行统计 INC DI NEXT: LOOP AGAIN MOV NUM,DH MOV AX, 4C00H INT 21H MY-PROG ENDS ENDSTART,若本题又要求将DATA中存放的数字在LED显示器(共阴极)上显示输出(口地址为0AAH),程序可作怎样修改?,70,思考:1、若题目没有明确告知输入的字符个数,仅以$表示输入结束,程序如何修改?2、若题目要求以压缩BCD码形式存放,程序又该如何修改?,71,DATA SEGMENT ORG 1000H ADDR DW ? COUNT DW ? DATA ENDS

33、 CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX XOR CX, CX MOV AX, ADDR REPEAT: TEST AX, 0FFFFH JZ EXIT SHR AX, 1 JNC NEXT INC CX NEXT: JMP REPEAT,EXIT: MOV COUNT, CX MOV AX, 4C00H INT 21H CODE ENDS END START,例6 阅读此程序,指出该程序完成了什么工作?,统计在数据段1000H单元(ADDR)开始存放的16位数据中1的个数,并将统计结果存放在CO

34、UNT单元中。,72,例7 在当前数据段从偏移地址 BUFFER开始 顺序存放着100个无符号16位数,现要编 写程序将这100个字数据从大到小排序。,分析:排序的方法有很多,我们采用冒泡法实现。 这时,需要两重循环。外循环控制变量BL的 初值为99,每次减1,而内循环控制变量CL每 次的初值等于当时BL的值。 设置DI为基本地址指针,初值指向BUFFER, 另一个地址指针SI的初值每次总同DI的值,也 就是说,内循环总是从第一个数据开始。,73,LEADI,BUFFER ;设地址指针MOVBL,99 ;设比较次数NEXT0:MOV SI,DI ;每轮固定从第一个数据开始 MOV CL,BL

35、;进入一轮比较NEXT3:MOV AX,SI ;取一个数 ADD SI,2 ;修改地址指针 CMP AX,SI ;与下一个数比较 JNC NEXT5 ;大于等于时不交换,MOV DX,SI ;小于时进行交换 MOV SI-2,DX MOV SI,AX NEXT5: DEC CL ;比较次数减1 JNZ NEXT3 ;没比完则循环 DEC BL ;比完了,进入下一轮 JNZ NEXT0 HLT,74,DS_SEG SEGMENT COUNT DB 4 BLK1 DB 96H, 74H, 32H, 16H BLK2 DB 65H, 94H, 87H, 29H BLK3 DB 4 DUP(?) DS

36、_SEG ENDS CS_SEG SEGMENT ASSUME CS: CS_SEG, DS:DS_SEG MAIN PROC FAR START: PUSH DS XOR AX, AX PUSH AX MOV AX, DS_SEG MOV DS, AX MOV SI, OFFSET BLK1 MOV DI, OFFSET BLK2 MOV BX, OFFSET BLK3 MOV CL, COUNT MOV CH, 0 CLC,NEXT: MOV AL, SI INC SI ADC AL, DI INC DI DAA MOV BX, AL INC BX LOOP NEXT RET MAIN E

37、NDP CS_SEG ENDS END START,SI,DI,BX,BCD码加法,75,DATA SEGMENT TABLE DW 1020H, 2030H, 3040H, 4050H, 5060H TEMP DW 5 DUP(0) COUNT DW 5 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA MAIN PROC FAR START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV CX, COUNT LEA SI TABLE LEA DI, TEMP CLD REP MOVSW LEA SI, TEMP

38、MOV CX, COUNT MOV DI, OFFSET TABLE MOV BX, CX,SHL BX, 1 LOP1: DEC BX DEC BX MOV AX, SI+BX MOV DI, AX ADD DI, 2 LOOP LOP1 MOV AX, 4C00H INT 21H RET MAIN ENDP CODE ENDS END START,REP MOVSW在指令中的功能是:,循环程序段LOP1的功能是:,程序运行结束时TEMP+2,TEMP+0字单元的内容,程序运行结束时,DI的值为:,复制数据块TABLE到TEMP,将原数据块倒排,2030H,5060H,TEMP或TABLE+

39、10,76,DATA SEGMENT TABLE DW 1020H, 2030H, 3040H, 4050H, 5060H TEMP DW 5 DUP(0) COUNT DW 5 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA MAIN PROC FAR START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV CX, COUNT LEA SI TABLE LEA DI, TEMP CLD REP MOVSW LEA SI, TEMP MOV CX, COUNT MOV DI, OFFSET TABLE MOV

40、BX, CX,SHL BX, 1 LOP1: DEC BX DEC BX MOV AX, SI+BX MOV DI, AX ADD DI, 2 LOOP LOP1 MOV AX, 4C00H INT 21H RET MAIN ENDP CODE ENDS END START,若将CLD改为STD,则程序运行结束时,TEMP+8字单元,TEMP字单元的内容分别是:,1020H,1020H,77,四、 子程序设计,对于一个子程序,应该注意它的入口参数和出口参数。入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用的寄存器和存储单元往往需要保护,以免影响返

41、回后主程序的运行。,78,参数传递一般有三种方法实现。 (1) 利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。 (2) 利用存储单元。把所需传递的参数直接放在子程序调用指令之后或通过数据区传递。 (3) 利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。,79,例1 用子程序的方法实现两个六字节数相 加。原始数据分别存放在ADD1和 ADD2开始的存区,结果存放在SUM 单元。,分析:子程序功能:完成一个字节数的加法。 要求:入口参数SI、DI分别指向源操作 数,BX指向存放结果的单元。 主程序调用六次子程序。,80,SUBADDPROC

42、;定义过程,完成一个字节相加MOVAL,SI ;取一个字节ADCAL,DI ;用ADC指令实现加法MOVBX,AL ;保存结果INCSI ;修改指针INCDIINCBXRET ; 返回主程序SUBADDENDP,主程序: MOV SI,OFFSETADD1 ;设置地址指针 MOVDI,OFFSET ADD2 MOVBX,OFFSET SUM MOVCX,COUNT CLC ;CF置0,为第一个ADC指令作准备 AGAIN:CALL SUBADD ;调用过程 LOOP AGAIN,81,例2 把数据段中的字变量NUMBER的值,转换为4个用ASCII码表示的十六进制数码串,存放在STRING开始

43、的存区。,分析:设计一个子程序,完成将AL中的16进制数转 换成ASCII码,结果仍在AL中。转换公式是: 如果AL中的数字是小于10的,则AL+0即可; 对于大于10的数,要转换成字母。如果转换成小写 字母仅需AL10 +a。如果要转换成大写字母,可 以是AL10 +A。本题转换成小写字母。 主程序只要从低位开始每次取出一位16进制数,调用子程序完成转换后按次序保存结果即可。,82,DATASEGMENTNUMBERDW 25AFH ;定义原始数据STRING DB 4 DUP(?) ;保存转换后的ASCII码DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DAT

44、AHEXDPROC ;定义过程CMPAL,10JBADDZ ;10,转移ADDAL,a10 ;10,转换成小写字母 JMP HUIADDZ:ADDAL,0 ;转换成09的ASCII码HUI:RETHEXDENDP,83,主程序: LEADI,STRING3 ;从最低位开始转换并存放 MOV AX,NUMBERMOVDX,AXMOVCX,4 ;循环做4次AGAIN:AND AX,0FH ;取16进制数据的最低位 CALLHEXD ;调用子程序 MOV DI,AL ;保存结果 DEC DI ;修改地址指针 PUSH CX ;保存循环控制变量的值 MOV CL,4 ;重新给CL赋值 SHR DX,C

45、L ;将16进制数据的下一位右移到最低4位 MOV AX,DX POP CX ;恢复循环控制变量的值 LOOP AGAIN,84,五、 DOS功能调用,85,操作系统管理计算机,为用户提供与CPU对话的接口,也就是提供使用键盘和显示器的通道,这样,用户不需要具体掌握这些接口的地址和输入输出数据的格式,直接执行操作系统提供的命令就可以了。 但是,在运行用户程序时,DOS将操作权交给了用户程序,这时,用户程序需要与键盘、显示器等系统资源打交道该怎么办?,86,在高级语言中,可以通过调用编译系统提供的库函数来实现。(这时,编译系统已把输入输出等操作功能做成函数的形式,用户只要依据函数的格式进行调用即

46、可。) 在汇编程序中,如果用户程序要与输入输出设备打交道,就要调用现成的程序,这些程序是DOS系统的一部分,随着DOS系统驻留内存,DOS 提供规定的接口格式供用户调用。,87,DOS系统功能调用的步骤: 1)送入口参数(选用) 2)调用号送AH 3) 执行 INT 21H 4) 保护出口参数(选用),88,1) 在显示器上显示单个字符(2号功能),功能:在屏幕的光标处显示单个字符 入口参数: 要显示字符的ASCII码放在DL中 出口参数: 无,MOV DL, A MOV AH, 2 INT 21H,; 提供调用功能号,; 系统功能调用,; 送显示字符A的ASCII码,运行至此,屏幕上当前光标处显示字符A,89,2) 在屏幕上显示字符串(9号功能),功能:在屏幕上当前光标处输出存储在内存数据段的一串字符串,该字符串以$结束。 入口参数: DS:DX指向欲显示字符串的首址 出口参数:无,DATA SEGMENT STRING DB I am a student.$ DATA ENDS MOV DX, OFFSET STRING MOV AH, 9 INT 21H,; 指向字符串首址,; 提供调用功能号,; 系统功能调用,运行至此,屏幕上当前光标处显示I am a student.,90,3) 带显示的键盘输入(1号功能),功能:等待键

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论