微机原理与接口技术.ppt_第1页
微机原理与接口技术.ppt_第2页
微机原理与接口技术.ppt_第3页
微机原理与接口技术.ppt_第4页
微机原理与接口技术.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第四章 汇编语言程序设计,4.1汇编语言源程序,高级语言 高级语言是面向过程的语言,是脱离机器的语言,不用考虑计算机生产厂家,CUP型号。程序语句更接近于自然语言,因而易学、易懂、易掌握,应用也十分广泛。 机器语言 是指各种CPU所能直接识别和执行的二进制代码。这种语言难于记忆、书写和输入。,汇编语言,汇编语言是一种将机器代码指令“符号”化了的编程语言,即每一条指令都用一个助记符来表示,再加上一系列的编程规则。 优点: 源程序采用助记符指令,容易记忆和书写。 源程序经编辑、汇编、连接和调试非常容易形成正确的可执行文件。 执行文件就是CPU能直接识别的二进制代码,因而具有实时、精确、快捷的特点。 不足:因硬件结构不同,汇编语言指令也不同。,4.1.1 汇编语言源程序的结构,一个完整的汇编语言源程序通常由若干个逻辑段(SEGMENT)组成,包括数据段、附加段、堆栈段和代码段。每个逻辑段以SEGMENT语句开始,ENDS语句结束,整个源程序用END语句结束。 段名1 SEGMENT : 段名1 ENDS 段名2 SEGMENT : 段名2 ENDS END,例:完整汇编语言程序的组成结构,-求两个数相加和的程序 DSEG SEGMENT ;定义数据段 DATA1 DW 0F865H ;定义被加数 DATA2 DW 360CH ;定义加数 DSEG ENDS ;数据段结束 ESEG SEGMENT ;定义附加段 SUM DW 2 DUP(?) ;定义存放结果区 ESEG ENDS ;附加段结束 CSEG SEGMENT ;定义代码段 ASSUME CS:CSEG,DS:DSEG,ES:ESEG,接上页程序,START: MOV AX,DSEG MOV DS,AX ;初始化DS MOV AX,ESEG MOV ES,AX ;初始化ES LEA SI,SUM ;SUM偏移地址送SI MOV AX,DATA1 ;取被加数 ADD AX,DATA2 ;两数相加 MOV ES:SI,AX ;和AXES:SI HLT CSEG ENDS ;代码段结束 END START ;源程序结束,412 语句类型及格式,汇编语言分两大类: 指令性语句由指令组成的可由CPU执行的语句 格式如下: 标号:前缀 操作码 操作数 ,操作数;注释 指示性语句只起说明作用,不生成目标代码,也叫伪操作语句(伪指令)。 格式如下: 名字 伪操作 操作数,操作数;注释,4.1.3 操作数,操作数 寄存器 存储器单元 数据项 数据项 常量 标号 变量 表达式,1.常量,数字常量 以字符D结尾- 十进制常量 以字符B结尾- 二进制常量 以字符H结尾- 十六进制常量 字符串常量 如:AB,2.标号符号地址,例: LABLE: MOV AX,NUM1 : JMP NEAR LABLE ; 符号目标操作数 不能与指令助记符或伪指令重名 不允许由数字打头 字符个数不超过31个,标号有三种属性,段:标号所在段的代码段地址 偏移量:标号所在段的段地址到定义该标号的地址之间的字节数 类型:NEAR(段内) 和 FAR(段间),3.变量,变量是某个数据区的名字,在指令中可以作为存储器操作数引用。变量必需以字母开头。 由于数据区内容可以改变,所以变量也可以改变 变量与标号一样也具有三种属性。 段属性是它所在段的段地址,段值在DS或ES寄存器中。 偏移量属性是变量所在段的段地址到变量地址之间的字节数。 变量的类型有BYTE、WORD、 DWORD(双字)、QWORD(4字)、TWORD(十字节)。,变量名与标号名的区别,变量名是变量的符号地址,标号是指令的符号地址。 例如: MOV AX,VAR1 MOV BL,VAR2 JMP DONE DONE:ADD AL,5,4.表达式,表达式不是指令,本身不能执行,汇编时对表达式进行相应的运算,程序执行时表达式已有指定的数值。 表达式常用的运算符有算术运算符、逻辑运算符、取值运算符和属性运算符。,表达式种类,算术运算符: +、-、*、/和MOD(取余数) 例如: N1 DB 45H6+9 MOV AL,8+7 逻辑运算符: AND、OR、XOR、NOT 例如: MOV AL ,0ADH AND 0CCH,取值算术运算符,OFFSET得到一个标号或变量的偏移地址。例如: MOV SI,OFFSET DATA1 将变量DATA1的偏移地址送SI,这条指令与下边的指令执行结果相同。 LEA SI,DATA1 SEG得到一个标号或变量的段地址。例如: MOV AX,SEG DATA ;DATA段地址送AX MOV DS,AX,属性运算符PTR,指定位于其后的存储器操作数的类型 CALL DWORD PTRBX ;存储器操作数为4字节长 MOV AL,BYTE PTRSI ;将SI指向的字节数送AL 如有:VAR DW 1234H MOV AL,VAR MOV AL,BYTE PTR VAR,其他运算符,方括号 在指令中用方括号表示存储器操作数, 中的内容表示操作数的偏移地址,例如: MOV AX,BX 段超越运算符“:” “:”跟在段名之后,表示段超越,用来指明存储器操作数的段属性。例如: MOV AX,ES:DI,4.2 伪 指 令,伪指令:指示性语句中的伪操作命令,在程序中的位置与指令性语句相同。 介绍几种常用的伪操作指令: 数据定义伪指令 符号定义伪指令 设定段寄存器伪指令 过程定义伪指令 宏命令伪指令 模块定义与连接伪指令,数据定义伪指令的一般格式为: 变量名 伪操作 操作数 ,操作数, 常用的数据定义伪操作有5种: DB(Define byte): 定义字节类型的变量 DW(Define word):定义字类型的变量 DD(Define double word):定义双字类型的变量 DQ(Define quad word):定义四字类型的变量 DT(Define ten bytes):定义十字节类型的变量,4.2.1 数据定义伪指令,例如,DATA DB 12,33H NUM DW 100*5+88 STR DB HELLO SUM DQ 0011223344556677H DATA DB 3 DUP(0,1) ABC DT 1234567890H ;连续10个字节的压缩BCD码,EQU 用于给一个表达式赋予一个名字。 名字 EQU 表达式 表达式可以是一个常数、符号、数值表达式、 地址表达式或指令助记符。如: CR EQU 0DH VAR EQU TEN*2+1024 ADR EQU ES:BP+DI+5 GOTO EQU JM,4.2.2 符号定义伪指令,“=”伪指令允许给符号赋一个常量或者结果是常量的表达式。 EQU 与 “=”的区别: EQU不允许对同一个符号重复定义。 “=”伪指令允许对一个符号重复定义。 如:VAR10H ; VAR代表了数值10H VAR25H ;VAR代表了数值为25H,“=”为指令,段定义伪指令用来定义汇编语言程序中的逻辑段,其格式如下: 段名:SEGMENT : 段名:ENDS SEGMENT和ENDS成对出现,缺一不可。 段名必需相同,不能与指令助记符和伪指令重名。,4.2.3 段定义伪指令,4.2.4 设定段寄存器伪指令,该伪指令的一般格式为: ASSUME 段寄存器名:段名 ,段寄存器名:段名, 段寄存器名可以是CS、DS、ES或SS。 在一个源程序中,ASSUME伪指令要放在可执行程序开始位置的前面,例如,CODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:EDATA, SS: STACK MOV AX,DATA MOV DS,AX MOV AX, EDATA MOV ES, AX MOV AX, STACK MOV SS,AX : CODE ENDS 汇编时,系统自动将代码段的段地址装入段寄存器CS所以代码段不需要在程序中初始化,4.2.5过程定义伪指令,过程又叫子程序。在程序中重复使用的程序段可以用一个过程来定义,然后再用CALL指令调用。 过程名 PROC 过程体 RET 过程名 ENDP 过程名为过程入口的符号地址, PROC 和ENDP前的过程名必须相同,中间为过程体。 NEAR为近调用即段内调用,只改变IP。 FAR为远调用,即段间调用,改变CS和IP。,例:在一个子过程中又嵌套了一个过程,NAME1 PROC FAR : CALL NAME2 : RET NAME2 PROC : RET NAME2 ENDP NAME1 ENDP,在程序中多次使用的程序段可以定义为宏指令。然后在需要时,通过宏指令名进行调用(宏调用),避免重复书写。 宏指令名 MACRO 宏体 ENDM 宏指令名指出了宏的名称。同标识符的规定。 形参为可选项,每个参数之间用“,”隔开。 调用时用实际参数代替形式参数。,4.2.6 宏指令,使用方法 宏程序在源程序中可以通过宏指令名进行调用。 子程序要通过CALL指令进行调用,RET返回。 占用内存 宏指令简化了源程序,但不能简化目标程序。汇编後,每个调用处都会宏展开,占用内存。 CALL指令产生相应的机器代码,节省内存。CALL执行过程,如现场保护、参数传递需要堆栈空间。 执行时间 CALL指令需要保护断点和恢复断点,宏不需要。 宏程序用空间换取了时间,子程序用时间换取了空间,宏程序与子程序的差异,宏调用和宏展开的使用,源程序 汇编后的宏展开 ROTATE MACRO START: MOV AL,DL ROL AL,1 + ROL AL,1 ROL AL,1 + ROL AL,1 ROL AL,1 + ROL AL,1 ROL AL,1 + ROL AL,1 ENDM : START: MOV AL,DL MOV AL,BL ROTATE : + ROL AL,1 + ROL AL,1 MOV AL,BL + ROL AL,1 ROTATE + ROL AL,1 : :,程序可以有多个模块组成,用NAME伪指令为模块命名, 用END结束源程序。 标号 : : END 标号 END指示汇编程序停止汇编。后边的标号表示程序执行的开始地址。END伪指令将标号的段值和偏移地址分别提供给CS:IP寄存器。,427 模块定义伪指令,DATA SEGMENT TABLE DB 12H,23H,34H,45H,56H, DB 67H,78H,89H,9AH,0FDH SUM DW ? DATA ENDS STACK SEGMENT DB 50 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK,求从TABLE开始10个无符号字节数和。结果送SUM字单元。,接上页,START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SI,TABLE MOV CX,10 XOR AX,AX NEXT: ADD AL,SI ADC AH,0 INC SI HLT LOOP NEXT CODE ENDS MOV SUM,AX END START,43 DOS功能调用,系统为用户提供了许多可供调用的功能模块,包括控制台输入输出、文件管理、系统测试 。 DOS(Disk Operating System )功能调用,是利用软中断INT 21H指令实现的具有90多个子功能的中断服务程序。上电后已加载到内存,程序的入口也被放到中断矢量表中。在Pentium机上仍能运行,Windows 98也继续提供所有的DOS功能调用。 BIOS(Basic Input and Output System)基本I/O系统功能调用,已固化在ROM中,包括系统测试、初始化引导程序、中断矢量装入程序或外部设备服务程序等。见附录C。,所有的DOS功能调用都是通过指定功能号来调用 INT 21H的不同子功能。 操作如下: 送入口参数给指定寄存器; 子程序的功能号AH; 执行INT 21H指令; 分析出口参数; 下面介绍INT 21H的几个最常用的功能:,DOS系统功能调用的使用方法:,功能号1、7、8都可以接收键盘输入的单字符。 输入的字符以ASCII码形式放在AL中。 7、8号功能无回显,1号功能有回显。 例4-8 从键盘输入字符“Y”的程序段 MOV AH,1 ;有回显键盘输入,功能号1 AL INT 21H ;接收一个键值AL CMP AL, Y ;比较键入的字符是否Y JE YES YES:,1.键盘输入,键盘输入,功能号0AH可以接收键盘输入的字符串。 字符串存放在存储器中。缓冲区 调用功能前先将缓冲区的起始偏移地址预置入DX寄存器中。 缓冲区总长度示意:,1,2,3,最后的字节n2,2.显示字符串,2、6显示单个字符。 用9号功能显示以结尾的一串字符。 例4-10 从键盘上读入一串字符并显示出来。 DATA SEGMENT BUF DB 50 ;最多键入50个字符 ACT DB ? CHARS DB 50DUP(20H) DB DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,接上页,MOV DX,OFFSET BUF ;键入缓冲区 MOV AH,0AH ;字符串输入功能 INT 21H : MOV DX,OFFSET CHARS ;字符串起始地址 MOV AH,09H ;字符串显示功能 INT 21H :,3.返回到DOS,程序执行完,应该将控制权交给DOS 操作系统,为了能使程序正常退出并返回DOS,可使用DOS系统功能调用的4CH号功能完成: MOV AH,4CH ;功能号送AH INT 21H ;返回DOS 或: MOV AX,4C00H INT 21H,4.4汇编语言程序 设计基础,4.4.1 程序设计概述,1程序质量的评价标准,好的程序:正确、好读、高效、节省资源。 程序的正确性和完整性; 程序的易读性; 程序的快速和高效; 程序所占内存的大小。 尽量采用结构化、模块化的设计方法,语句后面加以注释。 考虑程序的响应时间、实时处理能力、输入输出方式和结果占用内存的大小。,汇编语言设计和其他高级语言设计一样可以分成以下几个步骤: 分析问题,确定算法,画出程序流程图。 编写源程序形成扩展名为ASM的源文件。 经过汇编生成扩展名为OBJ的目标代码文件。 经过链接生成扩展名为EXE的可执行文件。 上机调试与修改。,2程序设计的基本步骤,利用编辑工具EDIT或记事本建立和修改扩展名为ASM的源程序文件,然后以ASCII码形式存入磁盘。 利用宏汇编程序MASM.EXE将源程序编译成扩展名为.OBJ的目标文件。 利用链接程序LINK.EXE对目标文件进行链接,形成一个可执行的浮动代码文件,文件的扩展名为.EXE。 对程序进行检验和调试。,3具体操作,任何一个复杂的程序都是由简单的基本程序构成。都有以下基本程序结构: 顺序程序。既无分支、无循环也无转移。 分支程序。根据条件决定程序的执行,相当于高级语言的IF-ELSE两个分支或CASE多分支语句。 循环程序。用于反复执行的程序段。 子程序。又称过程,相当于高级语言中的函数或过程,具有独立的功能模块。,4源程序的基本结构,顺序程序设计是指程序中的每一条指令是按指令的存放顺序执行的,没有分支,没有循环。,4.4.2 顺序程序设计,例4-11,有三个8位无符号数86H、34H和21H,编写S=86H*34H21H的程序。 分析: 有三个数参加运算,所以要定义三个源操作数,由于他们的类型相同,可以只用一条定义伪指令: NUM DB 86H ,34H, 21H 定义一个变量存放结果,因为运算中有乘法,所以结果变量应伪16位: RESULT DW ? 两个乘数均为无符号数,所以选用指令MUL,DATA SEGMENT NUM DB 86H,34H,21H ;定义源操作数 RESULT DW ? ;定义结果存放单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;DS指向DATA段 LEA SI,NUM ;NUM的偏移地址送SI LEA DI,RESULT ;RESULT偏移地址送DI MOV AL,SI ;(AL) 86H,程序,程序,MOV BL,SI+ 1 ;(BL) 34H MUL BL ;(AX) 86H*34H MOV BL,SI+2 ;(BL) 21H MOV BH,0 ;(BH) 0 SUB AX,BX ;(AX) 86H*34H-21H MOV DI,AX ;结果S送RESULT单元 MOV AH,4CH ;返回DOS INT 21 H CODE ENDS END START,例412,内存自TABLE开始的连续16个单元中存放着015的平方值(称平方表),查表求DATA中任意数X(0X15)的平方值,并将结果放RESULT中.,程序,DSEG SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121 DB 144,169,196,225 ;定义平方表 DATA DB ? RESULT DB ? ;定义结果存放单元 DSEG ENDS SSEG SEGMENT STACKSTACK DW 100 DUP(?) ;定义堆栈空间 SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG,BEGIN:MOV AX,DSEG ;初始化数据段 MOV DS,AX MOV AX,SSEG ;初始化堆栈段 MOV SS,AX LEA BX,TABLE ;置数据指针 MOV AH,0 MOV AL,DATA ;取待查数 ADD BX,AX ;查表 MOV AL,BX MOV RESUlT,AL ;平方数存RESULT CSEG ENDS END BEGIN,程序,4.4.3 分支程序设计,Jcc L1 cc不成立的程序段 JMP L2 L1: cc成立的程序段 L2: 后续语句,cc,cc成立则,cc不成立则,后继语句,Y,N,例4-13,编写程序,将数据区中以字节变量BUFFER为首地址的100个单元清零。 分析: 这是一个有两个分支的分支程序,00H送BUFFER起始的每个单元,每次判断计数值100?,不等则继续,否则停止。,程序,DATA SEGMENT BUFFER DB 100 DUP(?) COUNT DB 100 ;定义地址区长度 DATA ENDS STACK SEGMENT DW 32 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,程序,START: MOV AX,DATA MOV DS,AX ;初始化数据段 MOV AX,STACK MOV SS,AX ;初始化堆栈段 MOV CL,COUNT ;置单元长度 LEA BX,BUFFER AGAIN: MOV BYTE PTR BX,0 ;100单元清零 INC BX CMP BX,CX INT 21H JB AGAIN CODE ENDS MOV AH,4CH END START,4.4.4 循环程序,初始化,循环体,循环控制,N,Y,(a)后判断条件,条件成立?,L1: 循环体 Jcc L1,CX存入循环次数 L1: 循环体 LOOP L1,初始化,循环控制,条件成立?,循环体,N,Y,(b)先判断条件,L2: Jcc L1 循环体 JMP L2 L1: 后续语句,注:cc为条件的否定,循环嵌套,在一个程序中,如果一个循环体内还包含另一个循环,称为双重循环,如果有几个这样的循环嵌套,称为多重循环。 例如:一个从大到小的排序过程:,例4-15,把从MEM单元开始的l00个16位无符号数按从大到小的顺序排列。,DSEC SEGMENT MEM DW l00 DUP(

温馨提示

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

评论

0/150

提交评论