资源预览内容
第1页 / 共54页
第2页 / 共54页
第3页 / 共54页
第4页 / 共54页
第5页 / 共54页
第6页 / 共54页
第7页 / 共54页
第8页 / 共54页
第9页 / 共54页
第10页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第七章 汇编语言程序设计的基本方法和技巧,7.1 概述 7.3 8086汇编语言程序设计的基本语法 7.4 汇编语言程序设计的基本方法和技巧 7.7 IBM-PC-DOS系统的功能调用,可执行目标文件:“.EXE”,目标代码文件:“.OBJ”,没有确定的物理地址,“.ASM”若有错,给出信息,源程序文件:“.ASM” “.asm” 编辑edit,汇编,得到结果,观察结果是否正确,错误,链接,若干.OBJ,调试,MS-DOS下,7.1 概述,7.3 8086汇编语言程序设计的基本语法,指示性语句与指令性语句: 指令性语句是用指令系统中的指令构成的语句。 格式:标号: 操作码助记符 操作数 ;注释 指示性语句是指示汇编程序进行汇编的操作(伪指令和宏指令)。 格式:名字 定义符 参数 ;注释,指示性语句与指令性语句区别 一个程序经汇编,连接和装入内存后,在执行程序之前: 指示性语句的功能已经完成,故又称伪操作。 而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。,一、源程序语句的组成,助记符由指令系统规定。 定义符由汇编程序规定。 都称为关键字或保留字,不能用作标号、名字、变量名。,二、操作数和参数,可以是常量、变量、寄存器、标号和表达式,不止一个,用,分开,1. 常量,在指令性语句中可以做立即数,也可以做偏移量,e.g. MOV AL, 5AH MOV AX, SI+66H,在指示性语句中一般作为参数或数据项,e.g. ABC DW 1357H ;定义字,2. 变量,代表存放在某存储单元的数据,若变量在名字中出现,称为对变量的定义,就是给变量分配存储单元,且对这个存储单元赋一个符号名变量名。同时将这些存储单元预置初值,可以通过DB、DW、DD等对变量定义。,3. 表达式与运算符,(1) 算术运算符, +、-、*、/:参加运算的数和结果均是整数,除法运算的结果只取整数部分 e.g. 80/9的值为8, MOD:除法取余 SHL/SHR:逻辑左/右移,最右/左边以0补,当移位次数16时,结果恒为0, 表达式1表达式2 下标运算符,表示加法,把表达式1和表达式2相加形成一个存储器(内存)地址 e.g. MOV AX, DATA110H MOV AX, DATA1+10H,等价,(2) 逻辑运算符 AND、OR、XOR、NOT,注:有些运算符与指令助记符是相同的,但是概念不同 在语句中所处的字段不同,指令位于操作码段,运算符位于操作数段 指令在程序运行时执行,运算符在运算在汇编时完成 指令操作对象是操作数,运算符处理对象是某一个具体的数,AND AL,24H AND 0FH,(3) 关系运算符 EQ、NE、LT、LE、GT、GE,关系运算符连接两数(这两个数必须同时是数字或同一段内的两个地址)组成一个判定式,若判定式正确(为真),运算结果为0FFFFH,若为假,则运算结果为0000H,e.g. (PORT)=25 MOV AX, 25 EQ PORT 汇编“MOV AX, 0FFFFH” MOV AX, 25 NE PORT 汇编“MOV AX, 0000H”,(4) 分析运算符, SEG 符号名 ;求段基址e.g. 标号SLAB处于数据段,且段基址为46FFH,则 MOV AX, SEG SLAB ;(AX)=46FFH, OFFSET 符号名 ;求段内偏移量 e.g. 标号SLAB处于数据段,且与数据段基址的距离为10H MOV SI, OFFSET SLAB ;(SI)=0010H, TYPE 符号名 ;求符号名类型值 e.g. DATA1 DB 12H, 34H, 56H DATA2 DW 7890H MOV AX, TYPE DATA1 ;(AX)=1 MOV BX, TYPE DATA2 ;(BX)=2, SIZE 符号名 ;求为符号名分配的字节数 e.g. DATA1 DB 50 DUP (0) DATA2 DD 20 DUP (0) MOV AX, SIZE DATA1 ;(AX)=1*50=50 MOV AX, SIZE DATA2 ;(AX)=4*20=80,必须是用“DUP( )”定义的数据项, LENGTH 符号名 ;求为符号名分配的项数 SIZE、LENGH、TYPE之间的关系: SIZE 符号名=(LENGTH 符号名)*(TYPE 符号名) e.g. 对于“ABC DW 100 DUP (?)” TYPE ABC ;汇编结果为2 LENGTH ABC ;汇编结果为100 SIZE ABC ;汇编结果为200,必须是用“DUP( )”定义的数据项,(5) 属性运算符, 类型 PTR 符号名 ;将符号定义为新类型,BYTE、WORD、DWORD、NEAR、FAR等,SUB WORD PTR ALPHABXDI, 512H;, THIS 类型 ;指定新类型,规定它所定义的符号名和相邻的下一个语句的符号名具有相同的物理地址e.g. LABC EQU THIS BYTE LABD DW 1357H, 2468H MOV AL, LABC ;(AL)=57H MOV AX, LABD+1 ;(AX)=6813H, SHORT 标号 ;指出JMP指令的转向地址是在下一条指令的127个字节范围内,(5) 分离运算符, LOW 表达式 ;取低字节 HIGH 表达式 ;取高字节 e.g. SSY=1234H, 则 MOV AL, LOW 5678H ; (AL)=78H MOV AH, HIGH SSY ; (AH)=12H,7.4 汇编语言程序设计的基本方法和技巧,一、概述 (一) 判断程序质量的标准 程序的正确性 程序的可读性 程序的执行时间 程序所占内存大小,(二)汇编语言的程序设计步骤如下: 1建立数学模型; 2选择算法; 3绘制流程图; 4分配存储空间和工作单元; 5根据流程图编制程序; 6上机调试程序。,7.4 汇编语言程序设计的基本方法和技巧,顺序结构 分支结构 循环结构 子程序结构,(三)几种程序结构,7.4 汇编语言程序设计的基本方法和技巧,1. 顺序程序设计,例 从标号为ADD-BUF的存储单元开始连续存放着两个单字节数,将两数相加,结果送到SUMBUF存储单元中(不考虑进位)。,2. 分支程序设计,选择分支,简单分支,多分支,例 比较两个一字节无符号数X1和X2的大小,把大数存入MAX单元。,分析:比较两个无符号数,可将两数相减,然后根据CF标志位来判断大小。,3. 循环程序设计,WHILE-DO型循环图,REPEAT-UNTIL型循环图,(1)初始化部分 这是循环的准备部分,为程序操作、地址指针、循环计数、结束条件等设置初始值。 (2)循环体,包括以下3个部分: 循环工作部分-这是循环程序的主体,完成程序的基本操作,循环多少次,这部分语句就执行多少次。 循环修改部分-修改循环工作部分的变量地址等,这保证每次重复时,参加执行的数据能发生有规律的变化。 循环控制部分-保证循环条件满足时进入循环;循环结束条件不满足时,退出循环,执行循环体外的后续语句。 (3)循环结束部分 完成循环结束后的处理,如数据分析、结果的存放等。,例 从XX单元开始的10个连续单元中存放有10个无符号数,从中找出最大者送入YY单元。,分析:根据题意,把第一个数先送入AL,将AL中的数与后面的9个数逐个比较,如果AL中的数较小,则两数交换位置,如果AL中的数大于或等于相比较的数,则两数位置不变,在比较过程中,AL中始终保持较大的数,比较9次,则最大者必在AL中,最后把AL中的数送入YY单元。,循环工作部分,循环修改部分,循环控制部分,循环修改部分,初始化部分,循环结束部分,7.7 DOS功能调用,PCDOS是IBM PC微型计算机的磁盘操作系统。它为用户提供了许多命令,也有80多个子程序可供用户调用。 这些子程序的功能主要是实现对存储器和基本I/O设备的管理等。为了便于调用将所有子程序顺序编号。 如PC DOS2.0有87个子程序,编号从0开始到57H。,用户编程原则: 尽可能使用DOS的系统功能调用,提高程序可移 植性。 在DOS功能不能实现情况下,考虑用BIOS功能调 用。 在DOS和BIOS的中断子程不能解决问题时,使用 IN/OUT指令直接控制硬件。,1. 调用方法,使用DOS功能调用还要注意下列问题: (1)从键盘输入的字符由系统自动转换为ASCII 码,在进行数据处理时要特别注意; (2)需要在屏幕上显示的字符要在程序中将其转 换为ASCII码。 例:实验中的3+4=7,2、DOS功能调用要注意的问题,1. 显示单字符 ( 02H功能 ) 入口参数 DL = 要显示字符的ASCII 码 功能号 AH=02H 类型号 INT 21H 出口参数 无 实现功能 显示指定字符,光标随动。 例 显示字符A MOV DL, A MOV AH, 02H INT 21H,二、DOS系统功能调用 (21H类型中断调用),在DOS中断服务程序中,功能最多的是矢量号为21H的矢量中断,入口参数 定义要显示的字符串,字符串尾 应为$,作为结束显示的标志。 DS : DX = 字符串的首地址 功能号 AH = 09 H 类型号 21H 出口参数 无 实现功能 显示字符串,遇 $ 停止显示,光 标随动。,2. 显示字符串 ( 09H功能 ),3.键盘输入一个字符 ( 01H功能 )将其ASCII字符代码送AL寄存器,同时送显示器显示。如:MOV AH,01H INT 21H,例:MOV AH,4CH INT 21H,4.终止程序,返回DOS(4CH号),二、汇编语言程序设计举例,例1:试设计一个对两个32位二进制数相加的程序。设被加数2A3B078EH和加数4C508F55H从数据段的BGS单元(令BGS=2000H)开始依次存放,要求将两数和放在加数之后。 分析:这是一个简单的加法问题,因为数据不长,可采用顺序程序设计方法。 因为是两个32位数相加,应先加低16位,再加高16位,加高16位时还要考虑低16位相加产生的进位,应选用带进位加法指令。还要注意,多字节数在内存是放在连续的存储单元中,且高字节放高地址单元,低字节放低地址单元。,内存单元分配如下:,BGS=2000H,8EH,07H,3BH,2AH,55H,8FH,50H,4CH,被加数,加数,和,2004H,2008H,DATA SEGMENT ORG 2000H BGS DD 2A3B078EH,4C5D8F55H DD ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ORG 1000H START:MOV AX,DATA MOV DS,AX,MOV AX,BGS ADD AX,BGS+4 MOV BGS+8,AX MOV AX,BGS+2 ADC AX,BGS+6 MOV BGS+0AH,AX MOV 0AH,4CH INT 21H CODE ENDS END START,低16位,高16位,返回DOS,同一问题,若数据很长,或采用字节加法,则重复很多次,可考虑采用循环程序设计方法:,DATA SEGMENT ORG 2000H BGS DB 8EH, 07H, 3BH, 2AH DB 55H, 8FH,5DH, 4CH DB 4 DUP( ?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ORG 1000H START:MOV AX,DATA MOV DS,A
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号