已阅读5页,还剩150页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 章 汇 编 语 言 程 序 设 计,本章内容,汇编语言语法,汇编语言程序实现,汇编语言程序设计方法及应用,汇编语言程序设计举例,第4章:汇编语言的特点,汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 汇编程序设计的过程与其他高级语言程序设计大致相同,第4章:4.1汇编语言语法 4.1.1 汇编语言源程序的结构及组成,完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内 通常,程序还需要一个堆栈段,源程序由语句序列构成,汇编语言语句行 汇编语言源程序的格式,标号/名字: 操作码 操作数 ;注释,源程序由若干各段组成。每段以SEGMENT开始,以ENDS结束,整个源程序以END结束。,【例题4.1】实现:123 + 456sum 的源程序,CODE SEGMENT ;语句6 ASSUME CS:CODE,DS:DATA MAIN PROC FAR ;语句8 START:PUSH DS ;语句9 . ; RET ;语句17 MAIN ENDP ;语句18 CODE ENDS ;语句19,数据段,代码段,DATA SEGMENT ;语句1 A DW 123 ;语句2 B DW 456 ;语句3 SUM DW ? ;语句4 DATA ENDS ;语句5,END START ;语句20,名字 指令/伪指令 操作数1,操作数2,段=语句,1. 源程序组成,源程序=段,段:数据段、堆栈段、附加段、代码段,语句: 指令性语句,由CPU执行。 指示性语句,指示如何进行汇编。,名字:段 名,如:DATA、CODE 变量名,如:A、B、SUM 过程名,如:MAIN 标号名,如:START,1) 组成名字的合法字符有: 字母(不分大小写); 数字09; 特殊符号(“?”,“:”,“”,“_”,“$”)。 2) 名字的有效长度小于31个西文字符。 3) 名字以字母开头。 4) 不能把保留字用作名字。,2.名字命名规则,3.名字属性,(1)变量名,(2)段名:该段起始位置的段地址值,段属性:变量所代表的数据区所在段的 段基址 ; 偏移量:变量所代表的数据区首字节所 在段内偏移地址 ; 类 型:BYTE、WORD、DWORD、DQ、DT 长 度:变量所代表的数据区中数据元 素的个数。 规 模:变量所代表的数据区中数据所 占空间大小,以字节计。,(3)过程名 或标号名,(4)常量名:代表一常数,段属性:过程起始位置或标号处 段地址值 偏移量:过程起始位置或标号处 偏移地址值 类 型:NEAR、FAR,用于程序跳转,4.1.2 汇编语言伪指令,1.数据定义伪指令 变量名 数据定义伪指令 操作数1,操作数2,DB、DW、DD、 DQ、 DT,字节、字、双字、4字、5字的变量。,(1) 数字常量:十进制、八进制、十六进制、二进制等,缺省形式是十进制; (2) 字符常量,用单引号括起来,被存储的是该字符的ASCII码; (3) 符号常量,必须是预先已定义的符号; (4) 符号“?”,表示预留空间,内容不定; (5) DUP,表示内容重复的数据。具体形式为: 次数 DUP(被重复的内容),操作数:,【例】D_A DB 10, A, BC D_B DW 1234H D_C DQ 5678H,D_A 0AH 41H 42H 43H D_B 34H 12H D_C 78H 56H 0 0 0 0 0 D_C+7 0,(1)DB定义的数据,每个数据元素占据1个存储单元; DW定义的数据,每个数据元素占据2个存储单元; (2)字数据存储时,低字节存储在低地址单元中, 高字节存储在高地址单元中; (3)字符被存放时为它的ASCII码, 例 A的ASCII码为41H; (4)符号地址具有以下关系: D_B = D_A+4 D_C = D_B+2 = D_A+6,注:,ORG 100H D_E DB 3 DUP(?) EVEN D_F DW D_E D_G DB 2 DUP(1,3,4) D_H DW $+2,变量 内容 偏移地址 D_E ? 100 ? 101 ? 102 103 D_F 00H 104 01H 105 D_G 1 106 3 107 4 108 1 109 3 10A 4 10B D_H 0EH 10C 01H 10D,下一个存储位置从偶地址开始,己定义变量,取该变量偏 移地址,代表当前偏移地址,2.符号定义伪指令,(1) EQU 格式:名字 EQU 表达式,例: VB EQU 641024 ;VB代表数值表达式的值 A EQU 7 B EQU A2,注意: 1. 如果表达式中有变量,应在该语句前给出该变量的定义; 2. EQU语句不能给某一变量重复定义; 3. VB、A、B不占用内存,(2)等号 “=”,格式:名字 = 表达式,功能:与EQU基本相同,区别是它可以对同一个名字 重新定义。 例: COUNT = 10 MOV AL,COUNT ; COUNT = 5 ;可重复定义 ,(3)LABEL,格式:变量/标号 LABEL 类型,功能:定义变量或标号的类型,而变量或标号的段属性和偏移属性由该语句所处的位置确定。,变量的类型有:BYTE、WORD、DWORD、 DQ、DT;标号的类型有:NEAR、FAR。,【例】利用LABEL使同一个数据区有一个以上的类型及相关属性。 AREAW LABEL WORD ;AREAW与AREAB指向相同的数 据区,AREAW类型为字,而 AREAB类型为字节 AREAB DB 100 DUP(?) MOV AX,1234H MOV AREAW,AX ;(AREAW) = 1234H MOV BL,AREAB ;BL = 34H,3.段定义伪指令,段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS,BYTE: B, 即段可以从任何地址开始; WORD: 0B, 即段的起始地址必须为偶地址; PARA: 0000B, 即段从节(PARAGRAPH)边界开始,每16个字节 为1小段,所以,其起始地址必为16的倍数。(缺省值) PAGE: 0000 0000B, 即段从页边界开始,每256个字节为1页,所 以,其起始地址必为256的倍数。,定位类型:说明段的起始地址应有怎样的边界值:,组合类型:说明程序连接时的段合并方法,1 PUBLEC:将同类别名段组装在一起形成一个逻 辑段; 2 STACK: 与PUBLIC一样,只用于堆栈段。在汇 编及连接后,系统自动为SS及SP分配 值,在可执行程序中,SP初值指向栈底。 3 COMMON:同名段从同一个内存地址开始装入。 所以,各个逻辑段将发生覆盖。连接 以后,该段长度取决于同名段中最长 的那个,而内容有效的是最后装入的 那个。,4 MEMORY:与PUBLIC同义,只不过MEMORY定义的 段装在所有同名段的最后。若连接时 出现多个MEMORY,则最先遇到的段按 组合类型MEMORY处理,其他段组合类 型按PUBLIC处理。 5 PRIVATE:不组合,该段与其它段逻辑上不发 生关系,即使同名,各段拥有各自 的段基值。缺省值 6 AT exp:段地址为表达式exp的值(长度为16位)。 此项不能用于代码段。,当几个程序模块进行连接时,其中具有相同类别名的段,按出现的先后顺序被装入连续的内存区。没有类别名的段,与其它无类别名的段一起连续装入内存。,类别:类别的作用是在连接时决定各逻辑段的装入顺序。类别名必须用单引号括起来。,ASSUME 段寄存器名:段名,段寄存器名:段名,ASSUME:用于明确段与段寄存器的关系,说明: 该伪指令出现在代码段中; 本伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。DS、ES的值必须在程序段中用指令语句进行赋值,而CS、SS由系统负责设置,程序中也可对SS 进行赋值,但不允许对CS赋值。,例:ASSUME DS:DSEG,CS:CSEG,ES:ESEG,SS:SESG,例:ASSUME CS:CODE,DS:DATA,ES:DATA,【例】按下面要求,写出程序框架,数据段从0E000H开始,其中有100个字节的数组,其类型属性既是字又是字节; 2. 堆栈段从小段开始,段组(类别)名为STACK; 3. 代码段中指定段寄存器,主程序从1000H开始,给有关段寄存器赋值; 4. 程序结束。,DSEG SEGMENT AT 0E000H D_BYTE DB 100 DUP(?) D_WORD EQU WORD PTR D_BYTE DSEG ENDS SSEG SEGMENT PARA STACK DB 200 DUP(?) SSEG ENDS CSEG SEGMENT ORG 1000H MAIN PROC FAR ASSUME CS:CSEG,DS:DSEG,SS:SSEG,START: PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX RET MAIN ENDP CSEG ENDS END START,4.1.3 汇编语句,语句格式:名字 操作 操作数 ;注释,常量、变量和表达式组成,由常量、变量和运算符组成,1.算术运算符,例(1)ARRAY DW 1*2+3-4,56H MOV AX,ARRAY ;汇编后为:MOV AX,1 (2)MOV AL,7FH MOD 2 ;汇编后为:MOV AL,1 (3)MOV AH,15/4 ;汇编后为:MOV AH,3,2.逻辑运算符,例1: MOV AH,11110000B MOV AL,NOT AH ;MOV AL,00001111B MOV BL,AH OR AL ;MOV BL,11111111B MOV BH,AH XOR AL ;MOV BH,11111111B,例2:从端口86H读取一个字节,高位屏蔽后从端口6送出。 PORT EQU 86H IN AL,PORT AND AL,0FH ;AND为逻辑指令 MOV DX,PORT AND 0FH ;AND为汇编运算符 OUT DX,AL,3.关系运算符,关系运算符两边的操作数必须是两个数值或同一段中两个存储单元地址,运算结果应为逻辑值,结果为真,表示为0FFFFH;结果为假,则表示为0。,例:A EQU 80H B EQU 88H MOV AL,A EQ B MOV AH,A NE B MOV BL,A LT B MOV BH,A GT B MOV CL,A LE B MOV CH,A GE B,4.分析/数值返回运算符,SEG 变量或标号,返回变量或标号的段地址,OFFSET 变量或标号,返回变量或标号的偏移量,TYPE 变量或标号,LENGTH 变量,SIZE 变量,返回变量或标号的类型值,返回DUP定义的数据占据的单元数; 非DUP定义的数据,返回1。,返回DUP定义的数据占据的字节数; 非DUP定义的数据,返回类型值。,变量类型值: DB:1,DW:2,DD:4,DQ:8,DT:10。 标号类型值:NEAR:-1,FAR:-2。,SIZE=TYPE*LENGTH,【例】数据定义如下: DATA SEGMENT AT 2000H BUF1 DB 0,1,2,3,4,5,6,7,8,9 BUF2 DW 5 DUP(0) DATA ENDS 则: SEG BUF1 = 2000H SEG BUF2 = 2000H OFFSET BUF1 = 0000H OFFSET BUF2 = 000AH TYPE BUF1 = 1 TYPE BUF2 = 2 LENGTH BUF1 = 1 LENGTH BUF2 = 5 SIZE BUF1 = 1 SIZE BUF2 = 10,5.汇编运算符(PTR),类型 PTR 变量 / 标号,典型应用之一:重新指定变量类型 例:数据定义如下: BUFW DW 1234H,5678H 则下列指令合法: MOV AX,BUFW ;临时改变BUFW的字属性为字节属性 MOV AL,BYTE PTR BUFW,典型应用之二:指定内存操作数的类型 例:INC BX ;汇编将指示出错 INC BYTE PTR BX ;正确 INC WORD PTR BXSI ;正确,分析:在寄存器间接寻址、寄存器相对寻址、基址变址寻址或相对基址变址寻址等内存寻址方式中,往往很难判断出操作数的类型属性,应对操作数类型加以说明。,典型应用之三:与EQU一起定义一个新的变量 变量或标号 EQU 类型 PTR 表达式,例: BUFW DW 1234H,5678H BUFB EQU BYTE PTR BUFW ;BUFB的类型 ;属性为字节,其它属性与BUFW一样。 MOV AX,BUFW ;AX=1234H MOV AL,BUFB ;AL=34H,6.汇编运算符(THIS),格式:THIS 类型 可以像PTR一样建立一个指定类型的地址操作数,该操作数的段地址和偏移地址与下一个存储单元地址相同。,例: BUFB EQU THIS BYTE BUFW DW 1234H,5678H . MOV AX,BUFW ;AX=1234H MOV BL,BUFB ;BL=34H,BUFB的偏移地址和BUFW完全相同,但它是字节类型;而BUFW则是字类型。,4.2 汇编语言程序实现,汇编程序返回DOS方法,1.标准方法 MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX RET MAIN ENDP,2.DOS功能调用方法 MOV AH,4CH INT 21H,4.3 汇编语言程序设计方法及应用,(1)分析问题 包括找出已知条件、问题特点、问题中的规律并归纳出数学模型。 注意:有些问题不一定非要写出数学模型,或者根本写不出数学模型。但是,当有了一个数学模型之后,就可使用很多行之有效的计算方法。 (2)确定算法 指根据人们在解决实际问题时的逻辑思维中的常规推理,去找算法。如果已有数学模型,可以直接或间接利用一些现有的计算方法。,1.程序设计步骤,4.3.1 概述,(3) 绘制流程图,采用流程图: (1)使解题思路清淅,有利于理解和编制程序; (2)有利于修改程序和减少错误等; (3)对于一个复杂的问题,可以画多级流程图,先画出粗框图,再逐步求精,画出细框图。,流程图是程序算法的图形描述,即用图形的方式把解决问题的先后次序和程序的逻辑结构直观地、形象地描述出来。,(4)分配存储空间及工作单元(包括寄存器),8088/8086存储器结构要求存储空间分段使用。因此,数据段、堆栈段、代码段以及附加段要按需要分别定义。 工作单元既可以设置在数据段或附加段中的某些存储单元,也可以设置在CPU内部的数据寄存器中。,根据流程图和确定的算法逐条语句地编写程序。,(5)编写程序,(6)静态检查,看程序是否具有所要求的功能; 程序是否清晰易读; 选用指令是否合适; 程序语法和格式上是否有错; 指令中引用的符号、标号和变量是否定义正确; 程序执行流程是否符合算法和流程图等等; 适当考虑字节数要少,执行速度要快等。,(7)运行调试,静态检查可以发现一些问题,但毕竟还受到个人主观因素的影响。只有在计算机上运行通过并且结论正确的程序,才是正确的程序。 事实上,即使一个非常有经验的程序员,也不能说程序一编就成功,特别是一些复杂的程序,必须经过调试、修改、再调试、再修改,反复多次之后,才能得到一个比较满意的程序。,【例】编程实现在100个无符号字节整数的数组中找出最大数。,(1)分析问题 本例中,有100个整数的数组,可以把它看作一个集合,记作S。在此集合中找出最大数,记为maxS。 (2)确定解决问题的算法 人工方法:首先从第一个数据开始,一边看一边比较两个数的大小,看到较大数就记下,将较小数丢掉;再将此较大数与下一个数进行比较,始终将比较大的数记下,一直将数组中的数两两比较完毕,就能找到最大数。,首先,建立一个数据指针指向数据区的首地址,将第一个数取到某个寄存器中(例AL),与下一个数相比较,若下一个数大,就将它存到AL中,替换掉原来的数; 然后调整数据指针,将AL的数与此指针所指的数进行比较,再重复上述步骤,两两比较下去,直到比较完毕,结果AL中留下最大数。,(3)算法、流程图,(4)存储设计及数据定义,把数组存放在数据段中,并设置50个字节堆栈空间。利用BX寄存器作数据指针,用CX作计数器,用AL暂存较大数。,DSEG SEGMENT ;定义数据段 ARRAY DB X1,X2 COUNT DW $-ARRAY ;计算数据个数 DSEG ENDS SSEG SEGMENT PARA STACK STACK ;定义堆栈段 SDAT DB 50 DUP(?) TOP EQU LENGTH SDAT SSEG ENDS,CSEG SEGMENT ;定义代码段 ASSUME CS:CSEG,DS:DSEG,SS:SSEG MAIN PROC FAR ;定义过程 START:PUSH DS ;为返回DOS作准备 MOV AX,0 PUSH AX MOV AX,DSEG MOV DS,AX ;设置DS MOV AX,SSEG MOV SS,AX ;设置SS MOV AX,TOP MOV SP,AX ;设置SP初值,MOV BX,OFFSET ARRAY ;设置数据区指针首地址 MOV CX,COUNT ;设置计数器初值 DEC CX ;设置比较次数 MOV AL,BX ;取数入AL AGAIN:INC BX ;指向数据区下一个数据 CMP AL,BX ;两数比较 JAE NEXT ;ALBX,转NEXT MOV AL,BX ;否则,把较大数取入AL NEXT: DEC CX ;全部数据比较完否? JNZ AGAIN ;否,转AGAIN RET ;全部比较完毕,返回DOS MAIN ENDP CSEG ENDS END START,2.结构化程序设计,结构化程序设计的主要观点 (1)程序质量标志“清晰第一,效率第二” (2)程序设计过程“自顶向下,逐步求精” 首先把问题分解为几个大的相对独立的部分,再对每个部分进一步细化,直到成为一个个功能相对简单和易于理解的小问题。 (3)三种基本结构:顺序、分支、循环,三种基本程序结构,顺序结构,分支结构,循环结构,4.3.2 顺序结构程序设计,顺序结构程序:程序中无程序跳转指令、无循环指令,所有指令按其书写顺序逐条顺序执行,程序的执行路径从上到下只有一条。 例4.3将存储单元A中两个压缩BCD数拆成两个非压缩的BCD码,低位BCD数存入C中,高位BCD数存于B中,并将对应的ASCII码存入C1及B1中。,分析:将一个字节中的两位BCD码分开,可采用屏蔽高4位、保留低4位的方法,得到低位BCD;由未组合的BCD码转为ASCII码,只要高4位加30H或“OR 30H”;若将高4位BCD码分离,可以采用逻辑右移4位的方法,左边移入4个0,即可达到目的。 程序流程图:,源程序,DATA SEGMENT ;数据定义 A DB 37H ;被转换数 B DB ? ;安排结果保存空间 C DB ? B1 DB ? C1 DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROG FAR START: PUSH DS MOV AX,0 PUSH AX ;保存返回地址,MOV AX, DATA MOV DS, AX;设置DS MOV AL, A MOV CL, 4 SHR AL, CL MOV B, AL OR AL, 30H ;取高4位,转换成ASCII码 MOV B1, AL ;保存高4位的转换结果 MOV AL, A AND AL, 0FH MOV C, AL OR AL, 30H ;取低4位,转换成ASCII码 MOV C1, AL ;保存低4位的转换结果 RET ;返回DOS MAIN ENDP CODE ENDS END START,4.3.3 分支程序设计,a. 双分支情况之一,b. 双分支情况之二,双分支程序结构:,N,Y,Y,N,图 4.11 双分支程序组成,双分支程序实现,【例4.4】比较两个无符号数,把大数存入MAX单元。,CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG ;给数据段地址赋值 MOV DS,AX MOV AL,NUMBER ;取第一个数X1 CMP AL,NUMBER+1 ;与第二个数X2 JNC BRANCH ;若X1 X2,转BRANCH MOV AL,NUMBER+1 ;否则,第二个数 BRANCH: MOV MAX,AL ;保存较大数 MOV AH,4CH INT 21H CSEG ENDS,DSEG SEGMENT NUMBER DB X1,X2 ;X1和X2为二个无符号数 MAX DB ? DSEG ENDS,数据定义,代码 段,END START ;汇编结束,多分支程序结构,转移表法 地址表法,, 多分支情况之一,实现:,,多分支情况之二,逻辑分解法,实现:,4.3.4 循环结构程序设计,(1)初始化部分 这是循环的准备部分,为程序操作、地址指针、循环计数、结束条件等设置初始值。 (2)循环体,包括以下3个部分: 循环工作部分-这是循环程序的主体,完成程序的基本操作,循环多少次,这部分语句就执行多少次。 循环修改部分-修改循环工作部分的变量地址等,这保证每次重复时,参加执行的数据能发生有规律的变化。 循环控制部分-保证循环条件满足时进入循环;循环结束条件不满足时,退出循环,执行循环体外的后续语句。 (3)循环结束部分 完成循环结束后的处理,如数据分析、结果的存放等。,循环程序典型结构,【例4.8】统计字符串STRING中空格的个数。,数据定义为:,DSEG SEGMENT STRING DB Where there is a will, DB there is a way.$ RESULT DW ? DSEG ENDS,被统计的字符串,设置结果存放单元,CSEG SEGMENT ASSUME DS:DSEG,CS:CSEG START:MOV AX,DSEG MOV DS,AX,给数据段段地址赋值,MOV BX,OFFSET STRING MOV DX,0 NEXT: MOV AL,BX CMP AL,$ JZ FIN CMP AL,20H JNZ CONT INC DX CONT: INC BX JMP NEXT FIN: MOV RESULT,DX MOV AH,4CH INT 21H CSEG ENDS END START,循环程序控制方法之一 :计数法循环(次数已知),1. 正计数法,2. 负计数法,计数器的初值为0,每执行一遍循环,计数器加1,然后与规定的循环次数比较,若相等,则结束循环,否则继续循环。,计数器的初值为循环次数,每执行一遍循环体后,计数器减1,当减为0时,结束循环,否则继续循环。,【例4.9】分别统计COUNT个数据中正、负数的个数。,DATA SEGMENT BUF DB -32,25,36,-18,-64,0,-3 COUNT EQU $ - BUF PLUS DB ? MINUS DB ? DATA ENDS,数据定义如下:,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV BL, 0 MOV DL, 0 MOV SI, OFFSET MOV CX, 0 LOP1: MOV AL, SI CMP AL , 0,JGE NEXT0 INC BL JMP NEXT1 NEXT0: INC DL NEXT1: INC SI INC CX CMP CX,COUNT JL LOP1 MOV MINUS,BL MOV PLUS,DL MOV AH,4CH INT 21H CODE ENDS END START,正 计 数 法,负 计 数 法,循环程序控制方法之二:条件控制,当只知道进入或结束循环的条件,而无法知道循环次数时,可采用条件控制法。,1.精度:对于数值求解问题,有时无法得到精确解。通常的方法是,在迭代计算过程中,把本次迭代结果与前一次迭代结果相比,当符合精度要求时,结束迭代循环。,2.设置结束标志:在数组和表格处理问题中,在数据表格末尾设置一结束标志,作为循环结束条件。,循环程序控制方法之三:逻辑尺,【例4.10】设在数据组X和Y中各存在有10个数据元素。试编写程序计算: Z1=X1+Y1 、Z2=X2+Y2、Z3=X3-Y3、Z4=X4-T4 、Z5=X5-Y5 Z6=X6+Y6、Z7=X7-Y7、 Z8=X8-Y8、Z9=X9+Y9 、Z10=X10+Y10 并把结果存入数组Z中。,数据定义:,DSEG SEGMENT X DW X1, X2, X3, X4, X5, X6, X7, X8, X9, X10 Y DW Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, Y9, Y10 Z DW 10 DUP(?) LR DW 0000 0000 1101 1100B DSEG ENDS,X1+Y1,X3-Y3,逻辑尺,4.3.5 子程序设计,一、 过程定义、过程调用,过程名 PROC 类型 RET 过程名 ENDP,1. 定义,2. 调 用,CALL 过程名,N E A R 子程序书写形式,CODE SEGMENT ASSUME MAIN PROC FAR CALL SUB1 RET SUB1 PROC NEAR CALL SUB2 RET SUB2 PROC NEAR RET SUB2 ENDP SUB1 ENDP MAIN ENDP CODE ENDS,调 用 图 示, CALL SUB1 , CALL SUB2 RET, RET,主程序,子程序SUB1,子程序SUB2,F A R 子程序书写形式,CODE1 SEGMENT ASSUME MAIN PROC FAR CALL SUB1 RET MAIN ENDP CODE1 ENDS CODE2 SEGMENT ASSUME SUB1 PROC FAR RET SUB1 ENDP CODE2 ENDS,CALL指令-段内调用,直接寻址,间接寻址,CALL proc-name,IP入栈; IP IP + 偏移量,例:CALL SUB1,寻址方式,格 式,操 作,注:段内调用,CS不变,CALL r16 / m16,IP入栈; IP(r16)/(m16),例:CALL BX CALL WORD PTR BX,CALL指令-段间调用,直接寻址,间接寻址,CALL FAR proc-name, CS入栈 IP入栈 CS 过程的段地址 IP 过程的偏移地址,例:CALL SUB1,寻址方式,格 式,操 作,注:DWORD PTR表明内存操作数属性为双字,用于段间调用,CALL mem32, CS入栈 IP入栈 IP (EA+1,EA) CS (EA+3,EA+2),例:CALL DWORD PTR BX,远过程名,RET 指令,段内:,RET,RET exp,IP出栈, IP出栈 SP SP + exp,段间 :,RET,RET exp, IP出栈 CS出栈, IP出栈 CS出栈 SP SP + exp,返回类型,格 式,操 作,注:返回类型由调用类型定,子程序参数传递,方法一: 寄存器 方法二: 内存 方法三: 堆栈,参数:,入口参数,出口参数,在子程序中被处理的数据,表示子程序处理结果的数据,软延时:指利用CPU执行指令需要耗费一定时间的特点实施的延时,常用减1循环来实现。,例:8088CPU,主频4.77M,每个时钟周期为:1/4.77M = 0.21s。循环指令LOOP,当CX不为零时,执行循环转移分支,占用17个时钟周期;当CX为零时,退出循环,占用5个时钟周期。如果CX初值是2801时,执行指令WAIT1:LOOP WAIT1,所需时间为:,(0.212801)17 + 0.21 5 10ms,10ms延时子程序,;子程序:DELAY ;功能:实现软件延时,延时单位时间为10ms ;入口参数:BX,延时常数,实际延时时间为:10* BX (ms) ;出口参数:无,DELAY PROC NEAR PUSH BX ;现场保护 PUSH CX WAIT0: MOV CX,2801 ;内循环次数,大小由单位时间定 WAIT1: LOOP WAIT1 ;延时10ms DEC BX JNZ WAIT0 POP CX POP BX RET DELAY ENDP,子程序说明,子程序调用,实现100ms、550延时,CSEG SEGMENT ASSUME CS:CSEG, MAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV BX,10 ;延时100ms,参数赋值 CALL DELAY ;调用延时子程序 MOV BX,55 ;延时550ms,参数赋值 CALL DELAY ;调用延时子程序 RET MAIN ENDP,4.3.6 宏,宏是源程序中一段有独立功能的程序代码。定义一次,便可以多次反复调用,宏定义格式,宏指令名 MACRO 形式参数表 ENDM,宏指令体,【例4.15】完成2个压缩BCD数加法的宏定义,DECADD MACRO OP1,OP2 MOV AL,OP1 ADD AL,OP2 DAA MOV OPR1,AL ENDM,宏调用格式,宏指令名 实参数表,给出了宏调用中要用到的参数,实参数之间用逗号隔开; 实参数和形式参数的顺序一致。 原则上,实参数的个数应和形式参数个数相等,但汇编程序允许它们不等。,例:,DECADD DL,BUFFER DECADD AREA1,AREA2,宏展开:指宏定义体替换宏指令名,并用实参数替换形式参数 。,DECADD DL,BUFFER扩展成: + MOV AL,DL + ADD AL,BUFFER + DAA + MOV DL,AL,注:当宏调用中实参数个数和形式参数个数不等时,若实参数个数大于形式参数个数,在替换时多余的实参数不予考虑。若实参数个数小于形式参数个数,则多余的形式参数作为空(字符)或零(数字)处理。,加号表示该 语句由宏展 开得到。,宏与子程序,(1)宏 由宏汇编程序MASM在汇编过程中进行处理,在每个宏调用处,将相应的宏定义体插入; 子程序 调用指令CALL和返回指令RET则是CPU指令。执行CALL指令时,程序被控制转移到子程序的入口地址处。 (2)宏指令 简化源程序,但不能简化目标程序,汇编以后,在宏定义处不产生机器代码。但在每个宏调用处,通过宏扩展,在目标程序中插入与重复次数一样的目标代码。因此不节省内存。 子程序 在目标程序中定义子程序的地方将产生相应的机器代码,但每次调用时,只需用CALL指令,不再重复出现子程序的机器代码,一般来说可以节省内存单元。,4.3.7 系统功能调用,PC-DOS系统中设置两层内部子程序供用户使用,即DOS功能模块和基本输入输出子程序BIOS。,1.DOS功能调用 DOS共提供了近80个功能调用,大致分为:设备管理、文件管理和目录管理等几类。一般,调用系统功能时总是先采用DOS层功能模块,如果这层模块内容达不到要求,再进一步调用BIOS层的子程序。DOS通过INT 21H为程序员提供一系列的功能调用,并作为应用编程接口。,DOS功能调用方法,(1)根据需要的功能调用设置入口参数。 (2)把功能调用号送AH寄存器。 (3)发软中断指令“INT 21H”。 (4)可根据有关功能调用的说明取得出口参数。,DOS功能调用INT 21H基本功能:,2.BIOS功能调用方法,BIOS常驻ROM,独立于DOS,可与任何操作系统一起工作。它的主要功能是驱动系统所配置的外部设备,如磁盘驱动器、显示器、打印机及异步通讯接口等。通过INT 10HINT 1AH向用户提供服务程序的入口,使用户无需对硬件有深入了解,就可完成对I/O设备的控制与操作。BIOS的中断调用与DOS功能调用类似。,BIOS功能调用 INT 16H基本功能:,BIOS功能调用INT 10H基本功能:,4.4 汇编语言程序设计举例,【例4.16】将5位ASCII码表示的十进制数(注:不大于65535)转换成两字节二进制数。如:12345 110000 00111001,注:两字节无符号二进制数最大表示范围为65535,所以要求被转换的十进制数不大于65535。,DS:RESULT,RESULT+1,DS:ASDEC,12345,4.4.1 数制和代码转换,转换分为两步: 1)把ASCII码转换为BCD数,方法是:各位减30H; 2)将BCD数转换为二进制数。,设5位十进制为d4d3d2d1d0,其中di为十进制数字,这样表示的数其值为: d4 104 + d3 103 + d2 102 +d1 101 + d0 = 0105 + d4104 + d3103 + d2102 +d1101 + d0 = (010 + d4 )10 + d3)10 + d2)10 + d1)10 + d0,由此可见,设最初部分和 AX为0, 最终结果是做5次AX乘以10 + d AX的运算。,DSEG SEGMENT ASDEC DB 12345 COUNT EQU $ - ASDEC RESULT DW ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEG MOV DS,AX MOV SI,OFFSET ASDEC MOV CX,COUNT ;循环计数器赋初值 XOR AX,AX ;部分和AX,初值为0,AGAIN:ADD AX,AX ;AX 10 MOV BX,AX ADD AX,AX ADD AX,AX ADD AX,BX MOV BH,0 MOV BL,SI ;取ASCII码,转换成二进制数 SUB BL,30H ADD AX,BX ;部分和计算 INC SI ;修改数据指针,指向下一个字节 LOOP AGAIN MOV RESULT,AX MOV AH,4CH INT 21H CSEG ENDS END START,【例4.17】将一字节二进制数转换成两位十六进制ASCII码表示的16进制数。 如:01001111B(A6H) A6,数据定义: DSEG SEGMENT BINA DB 10100110B ;定义一字节二进制数 AHEX DB 2 DUP(?) ;定义结果单元 DSEG ENDS,DS:BINA,DS:AHEX,6,A,问题分析:二进制转换成十六进制数是每4位一组,所以转换分两步: (1)把二进制数转换为十六进制数; (2)把十六进制数转换为ASCII码, 方法是:09的数加30H或者与30H或;AF的数加37H。,MOV AL,BINA MOV BL,AL AND AL,0F0H MOV CL,4 SHR AL,CL ADD AL,30H CMP AL,3AH JB NEXT1 ADD AL,7 NEXT1:MOV DI,AL INC DI ;修改数据指针 AND BL,0FH ADD BL,30H CMP BL,3AH JB NEXT2 ;3AH时转NEXT2 ADD BL,7 NEXT2:MOV DI,BL MOV AH,4CH INT 21H,AL取一字节二进制数,截取高4位移到低4位,加30H转换成ASCII码,3AH ?,AL AL + 7,并保存,取数,截取低4位到BL并加30H转换成ASCII码,3AH ?,BL BL + 7,并保存,结 束,Y,Y,N,N,【例4.18】把16位二进制数转换成十进制的ASCII码串。如:0000 0101 0001 1100B(1308D) 01308,0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0,DS:BINA,DS:ADEC,051CH = 0000 0101 0001 1100 = 01308D,0 1 3 0 8,算法思想:转换分2步:1)求出与16位二进制数对应的十进制数的万位、千位、百位、十位、个位上的数;2)把各位上的数转换为ASCII码。实现第1步的方法之一是:通过在原数中分别减万、千、百、十,统计出其中有多少个万、多少个千、多少个百、多少个十,最后减剩下的为个位数。,;数据定义 DSEG SEGMENT BINA2 DW 051CH ADEC DB 5 DUP(?) UNIT10 DW 10000,1000,100,10,1 DSEG ENDS,被转换的二进制数,需要用的常数,开设结果存放单元,MOV SI,OFFSET UNIT10 MOV DI,OFFSET ADEC MOV AX,BINA2 ;取16位二进制数 LOP0:XOR CL,CL MOV BX,SI ;取10i数 LOP1: SUB AX,BX ;减去10i数 JB NEXT ;不够减转NEXT INC CL JMP LOP1 ;重复 NEXT:ADD AX,BX ;不够减时恢复 ADD CL,30H ;转换成对应位ASCII码 MOV DI,CL INC SI INC SI ;修改取10i次方表地址 INC DI ;修改存放结果地址 CMP BX,1 JNZ LOP0 ;不是转LOP0继续 RET,循环变量i赋初值,AX取数,AXAX- 10i,计数器CL清0,够减?,CLCL+1,AXAX+10i,保存CL,ii-1,i=0?,结束,Y,Y,N,N,【例4.18】算法2,将二进制数分别除以10000、1000、100和10,每次的商是一个BCD码数,即为结果的“万位”、“千位”、“百位”和“十位”,最后一次除法的余数就是“个位”,,;- ;子程序名:B2BCDW ;功 能:16位二进制数转换成压缩BCD码。 ;入口参数:AX16位二进制, ; SI=缓冲区首址 ; DI=除数首址 ;出口参数:缓冲区中存放压强BCD码 ;-,B2BCDW PROC NEAR CONT: PUSH CX MOV CX,5 NEXT: CWD DIV WORD PTRDI ADD AL,30H MOV SI,AL INC SI ADD DI,2 MOV AX,DX LOOP NEXT POP CX RET B2BCDW ENDP,;- ;子程序名:B2BCDW ;功 能:16位二进制数转换成压缩BCD码。 ;入口参数:AX16位二进制, ; SI=缓冲区首址 ; DI=除数首址 ;出口参数:缓冲区中存放压强BCD码 ;-,4.4.2 BCD数的算术运算,【例4.19】编写一4字节非压缩BCD码的加法运算。 如: SUM2974 + 7326,算法思想:将4字节的BCD码分为4个单字节数相加,从
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 透析枸橼酸钠抗凝方法
- 高强度间歇训练
- 毕业设计结构设计
- 广告拍摄计划流程
- 腹主动脉瘤内科保守治疗方案
- 射线检测流程标准化实施要点
- 凯迪拉克的车型介绍
- 汽车过户协议书范本
- 2025-2026学年北京市东城区三年级语文上册期中考试试卷及答案
- 北师大版八年级物理上册月考考试试题及答案
- 土地管理法-课件
- 销售人员薪酬体系及晋升通道
- 阿基米德的故事课件
- 【全国旅行社名录(名称、电话、传真、地址、邮编、传真等相关信息)】
- 托管中心消防应急预案
- 2022届上海宝山区中考数学一模试卷及答案
- YY 0299-2016医用超声耦合剂
- GB/T 9695.13-2009肉与肉制品钙含量测定
- GB/T 25067-2020信息技术安全技术信息安全管理体系审核和认证机构要求
- 常用钢材热处理工艺参数
- 非煤矿山建设项目管理办法
评论
0/150
提交评论