欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    微机原理第四章.ppt

    • 资源ID:5349890       资源大小:853KB        全文页数:155页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    微机原理第四章.ppt

    第3章 汇编语言程序设计,3.1概述,一、机器语言、汇编语言和高级语言,1、机器语言 计算机中指令代码以二进制编码表示,这种代码 机器可以识别与执行,把这种机器代码称为机器语言。用机器语言编写的程序称为机器语言程序(或目的程序)。例如 下面的机器代码就是8086CPU的三条机器指令 B8H,00H,30H 4EH,D8H B9H,14H,00H 用机器语言书写的程序人们不易看懂,也不易记忆。看起来非常的乏味。但是计算机却非常熟悉它。,2、汇编语言 用助记符代替操作码,用符号和数字代替地址码(或操作数),这种语言称为汇编语言。用汇编语言编写的程序称为汇编语言源程序。必须经过翻译,转换成机器语言,计算机才能执行。汇编语言人们容易记忆,也容易看懂。例如 用8086CPU的汇编语言可以把上述的机器指令代码写成 MOV AX,3000H MOV DS,AX MOV CX,0014H,3、高级语言 不依赖具体的机器,面向对象的计算机语言称为高级语言。如 BASIC,C,VB,VC等 高级语言易记忆,易懂、便于学习与掌握 汇编语言与高级语言的比较 汇编语言 高级语言 执行速度快,占内存小,执行速度慢,占内存大,实施控制方便,通用性差 通用性好,可移植性强 程序设计效率低,依赖机器 程序设计效率高,不依赖机器 与硬件打交道方便。与硬件打交道不方便。,二、汇编程序 1、汇编程序是用来将汇编语言程序翻译成机器代码的系统(工具)程序。,汇编语言源程序,汇编语言,目标程序文件,源程序列表,.ASM,.OBJ,.LST,翻译,2、在DOS环境下建立和运行汇编语言程序的过程,汇编语言程序的执行过程:,编辑程序,.ASM 文件,汇编程序,.OBJ 文件,连接程序,.EXE 文件,Edit 等,MASM,LINK,3、汇编程序的种类 1.自汇编程序和交叉汇编程序 2.基本汇编、小汇编和宏汇编 3.一次扫描和两次扫描的汇编4、8086/8088宏汇编程序MASM.EXE 宏汇编程序MASM.EXE 5.00以及对应的连接程序LINK.EXE,三、调试与运行,1、源文件编辑 任何文本编辑器均可用于编辑汇编语言的源程序。例如dos下的edit,turbo C集成环境的编辑器,Windows下的记事本、写字板等。汇编语言源程序以ASCII码形式存放于内存中,扩展名应为.ASM,给源文件命名后可存盘,源程序用大写、小写皆可。,2、源文件汇编 用Microsoft 的宏汇编程序(MASM)任何版本汇编皆可。汇编有下列几种方式 方式1:在命令提示符下,键入 MASM 屏幕上会出现如下提示,按照提示键入文件名回车即可。Source filename.ASM:xxx Object filename xxx.OBJ:Source listing nul.LST:xxx Crose-reference nul.CRF:xxx+Bytes symbol space free 0 Warnimg Errors 0 Severs Errors,说明:汇编后生成3个文件,即:目标文件(.OBJ),列表文件(.LST),交叉引用文件(.CRF)。同时告诉程序员汇编有无错误(警告错误和严重错误)。无错,汇编通过;有错,则修改源程序的错误后,再次汇编。方式2 在命令行提示符下键入文件名与逗号和分号 C:MASMMASM ABC;(生成.OBJ文件,不产生.LST和.CRF)C:MASMMASM ABC,;(生成三个文件,名称为ABC).OBJ文件中的地址操作数是可浮动的相对地址。.LST文件把源程序与机器代码(目的程序)都列表,可打印,显示。.CRF是用来对符号进行前后对照的文件,可了解源程序中符号(或变量)定义或引用情况。,3、连接 在命令提示符下,键入LINK,或在Windows下用鼠标直接点击LINK,即可连接。连接时屏幕显示如下:Object Modules.OBJ:ABC Run File ABC.EXE:List File NUL.MAP:ABC Libraries.LIB:(注:MASM中没有库文件,可直接键入回车)Link:Warnimg L4201:no Stack Segment(其中,L4201表示连接程序错误信息代码,4表示警告错误,201为错误号。源程序中没有堆栈段不影响连接。)LINK生成两个文件:.EXE 为可执行文件。.MAP为内存分配图文件,提供了文件中的内存地址分配的一些信息。,4、调试与运行 用DEBUG与Codeview软件都可进行目的代码级程序的调试,对.EXE文件可直接调入DEBUG中跟踪调试。有错误需对源程序中的语句进行修改,汇编中只能发现语法和符号等错误,不能发现编程中的逻辑错误。Codeview窗口调试工具,使用时请参看有关资料。,3.2汇编语言源程序的格式,分段结构汇编语言程序的结构 汇编语言程序也是分段编写的,每段最长64K。8088汇编语言的源程序是由多个段组成的,一个可执行的汇编程序一般至少有一个代码段,其中包含可执行的语句。,例:一个简单的汇编程序,my_data segment(数据段)again:Mov al,siarray1 db 05,a2H,00,10H,85H Inc si n equ 5 Cmp al,50array2 db n dup(?)Jbe next my_data ends Mov di,almy_code segment(代码段)Inc di assume cs:my_code next:dec cx assume ds:my_data jnz againbegin:mov ax,my_data mov ah,4ch mov ds,ax int 21h Lea si,array1 my_code ends Lea di,array2 end begin Mov cx,n,3.2.2 汇编语言语句的类型和组成语句类型指令语句:以8086/8088指令为基本部分,必要时加上标号 及注释构成。每一条语句产生相对应的目标代码。伪指令语句:为汇编程序和连接程序提供一些必要控制 的管理性语句。汇编时,伪指令不产生目标代码。宏指令语句:由标号、宏指令和注释构成。汇编时,将宏指 令展开还原为定义时的多条语句,再逐条汇编。,指令语句及其格式 指令语句即第二章介绍的8086CPU的指令,每一条指令即可构成一指令语句。每一指令都有对应的机器代码。指令语句格式 标号:助记符 操作数,;注释 格式共有四部分:其中标号,操作数,注释可以是任选项;助记符是必选项,该项在一条语句中不可省略。标号后面一定要跟一个冒号;注释前一定加一分号。,2、伪指令语句及其格式 伪指令语句不是真正的指令语句,它不产生机器代码,它是汇编程序要求的,用来指示汇编程序做何种操作,定义代码段、数据段在何处,是否产生列表等。伪指令语句格式 名字 定义符 参数,参数;注释 格式共有四部分:其中名字,参数,注释可以是任选项;定义符是必选项,该项在一条伪指令语句中不可省略。对于有些语句,名字也是必需的。名字后面不要跟冒号:注释前一定加一分号;各个参数之间用,分开。,宏指令语句及其格式 宏指令语句:为了书写方便,把一个重复出现的汇编语句序列用一条指令代替,这种重新定义的指令就称为宏指令。这种由宏指令组成的语句称为宏指令语句。宏指令必须先定义,才能被使用,这称为宏定义;在汇编时,又要把宏指令语句进行宏展开,生成对应的机器代码。宏指令语句格式将在后面应用中介绍。,名字(标识符)汇编语言语句的四个域,一个语句行的基本格式为:标识符 操作符 操作数1,操作数2;注释,标识符、标号(名字)-标号和名字(变量)标识符可由数字、字母和下划线等一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。使用时要注意以下3点:不能以数字开头,数字可用在非开头的其它位置;其最大长度为31个字符。指令语句中的名字(标号)后跟冒号,而伪指令和宏指令的名字之后不跟冒号。,一般说来,名字项可以是标号或变量。它们都用来表示本语句的符号地址,它是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。标号:标号在代码段中定义,后面跟冒号:,它也可以用LABEL或EQU伪操作来定义。此外它还可以作为过程名定义,这将在以后的章节中加以说明。标号经常在转移指令或CALL指令的操作数字段出现,用以表示转向地址。,标号有三种属性:段、偏移及类型。标号实际上是用符号表示的地址(其指令语句的符号地址)。段属性定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。偏移属性:标号的偏移地址是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。类型属性:用来指出该标号是在本段内引用还是在其它段中引用的。如在段内引用的,则称为NEAR,指针长度为2字节;如在段外引用,则称为FAR,指针长度为4字节。,变量:是存放在某些存储单元中的操作数,变量在除代码段以外的其他段中定义,后面不跟冒号。它也可以用LABLE或EQU伪操作来定义。变量经常在操作数字段出现。所有的变量都有一个固定的地址(用变量名代表),它由段和偏移地址组成;同时还有一个类型,变量的类型属性定义该变量所保留的字节数。如BYTE(1个字节长)、WORD(2个字节长)、DWORD(4个字节长)、DQ(8个字节长)、DT(10个字节长),这一点在数据定义伪操作中说明。,在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。在程序中,变量可以使用数据定义伪指令进行初始化,见伪指令一节中的数据定义部分。,操作符 可以是指令、伪指令或宏指令的助记符。3.2.5操作数:可以是常数、寄存器名、标号、变量和表达式。,1、常数可以是二进制、十进制、八进制或十六进制数,也可以是字符串。例如 10100101B;二进常数 256D 或256;十进常数 356Q 或356Q;八进常数 2AFH;十六进常数 0ABCDH;十六进常数,但十六进常数的第一个字符必须是数字。ABCD;字符串常数,汇编后对应为相应的ASCII码:41H44H 1234;数字字符串常数,字符串需用单引号,汇编后为31H34H,2、寄存器 8086/8088的寄存器是程序中最常出现的符号,它可分为字节寄存器和字寄存器,如AX为字寄存器,而AL则为字节寄存器。只有AX、BX、CX、DX可分为字和字节寄存器。3.标号 标号实际上是用符号表示的地址(其指令语句的符号地址),因此它也是由段、偏移地址和类型组成,其类型分为段内(NEAR)和段间(FAR)两种。,实际上是代码段中某一指令的地址,同样具有三个属性:段地址,偏移量与类型。类型有:FAR与NEAR FAR(可在段间或段内引用)NEAR(可在段内引用)注意:常量、变量的名字以及标号不能用宏汇编中的保留字,即:(指令助记符,CPU的寄存器名,伪指令的符号等)例如:AAA:MOV AX,DATA;错误,AAA不能做标号 DAA DB?,?;错误,DAA不能做变量名,通过 SEG 标号 OFFSET 标号可以分别得到标号的段地址和偏移地址。如果是NEAR类型,在程序执行时,只取标号的偏移地址,例如在过程调用(CALL)时,只取IP,而对于FAR类型,则要取段地址和偏移地址,在CALL时要取IP和CS。,4.变量 变量是存放在某些存储单元中的操作数,使用有一定意义的符号来代表这些单元。所有的变量都有一个固定的地址(用变量名代表),它由段和偏移地址组成;同时还有一个类型,它可以是字节(BYTE)、字(WORD)或双字(DWORD)。在程序中,变量可以使用数据定义伪指令进行初始化,见伪指令一节中的数据定义部分。,5、表达式 表达式是常数、寄存器、标号、变量与一些操作符相组合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址。为了能了解表达式的组成,我们先介绍一些常用的运算符。运算符包括算术、逻辑、关系、分析、综合五类运算符。见下表,表 8086汇编语言中的运算符,算术运算符 逻辑运算符 关系运算符 分析运算符 综合运算符,+(加法)AND(与)EQ(相等)SEG(求段基址)PTR-(减法)OR(或)NE(不相等)OFFSET 段属性前缀*(乘法)XOR(异或)LT(小于)TYPE THIS/(除法)NOT(非)GT(大于)SHORTMOD(求余)LE SIZE HIGHSHL(左移)GE LENGTH LOWSHR(右移),(1)、算术运算符 有7 种:+,-,*,/,MOD,SHL,SHR。分别为:加,减,乘,除,模,左移,右移。说明:除法返回的是商,而模返回的是余数。例如:PI EQU 3456/1000;PI=3 PIR EQU 3456 MOD 1000;PIR=456 SHL,SHR是移位运算,一般在建立屏蔽字时使用。例如:MSK EQU 0011 0100B MSK1 EQU MSK SHL 2;低位补2个 0,MSK1=1101 0000BMSK2 EQU MSK SHR 2;高位补2个 0,MSK2=0000 1101B,(2)、逻辑运算符 有4 种:AND,OR,XOR,NOT 逻辑运算符和逻辑运算指令的区别:逻辑运算符在汇编时完成逻辑运算,逻辑运算指令在执行该指令时完成逻辑运算。例如 MSK EQU 0011 0101B MOV AL,4EH AND AL,MSK AND 0FH 汇编时计算出 MSK AND 0FH=05,执行第三条指令时AL=04H。,例:逻辑运算符运用。MOV AX,0F00FH AMD 253BH;AX=200BH MOV AC,0F00FH OR 253BH;AX=F53FH MOV AC,0F00FH XOR 253BH;AX=D534H例 IN AL,VAL OUT VAL AND OFEH,AL 其中VAL为端口号,OUT指令中的表达式说明当VAL为偶数时,输出端口号与输入端口号相同,而当VAL为奇数时,则输出端口号比输入端口号小1。,(3)关系运算符 包括 相等:EQ 大于:GT 不等:NE 小于或等于:LE 小于:LT 大于或等于:GE 关系运算结果只有两个真、假。如果关系是真,则结果为 0FFH(0FFFFH);如果关系是假,则结果为0。例如:MOV BX,DATA1 LT 0010H MOV BX,0FFFFH MOV BX,DATA1 LT 0010H MOV BX,0,当 DATA1 0010H 时,当 DATA1 0010H 时,例MOV BX,(VAL LT 5)AND 20)OR(VAL GE 5)AND 30)则当VAL5时,汇编结果应该是:MOV BX,20否则,汇编结果应该是:MOV BX,30,(4)分析运算符 分析运算在汇编语言程序设计中很重要。存储器地址操作数(变量和标号)具有段、偏移量及类型三种属性,分析运算符用来分离出一个存储器地址操作数的这三种属性,并用数值的方法表达出来。它包括:取存储单元偏移:OFFSET 取存储单元段:SEG 取类型:TYPE 取字节数:SIZE 按类型取长度:LENGTH,求存储器地址操作数的三个属性,求变量的字节数和长度,SEG与OFFSET分析符 分别返回一个变量或标号的段地址和偏移量地址 OFFSET 格式为:OFFSET Variable或label 汇编程序将回送变量或标号的偏移地址值。例 MOV BX,OFFSET OPER_ONE 则汇编程序将OPER_ONE的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入BX寄存器中。所以这条指令与指令 LEA BX,OPER_ONE是等价的。,SEG 格式为:SEG Variable或label 汇编程序将回送变量或标号的段地址值。例 如果DATA_SEG是从存储器的05000H地址开始的一个数据段的段名,OPER1是该段中的一个变量名,则 MOV BX,SEG OPER1 将把0500H作为立即数插入指令。实际上由于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使BX寄存器的内容成为0500H。,TYPE分析符 返回变量和标号的类型。对于变量:类型为字节、字、双字变量分别返回1,2,4。对于标号:类型为NEAR的标号返回-1(0FFFFH),类型为FAR标号返回-2(0FFFEH)。例 ARRAY DW 1,2,3则对于指令 ADD SI,TYPE ARRAY 汇编程序将其形成为:ADD SI,2,表 存储器操作数的类型值,存储器操作数 类型值,字节数据(DB定义)1 字型数据(DW定义)2 双字数据(DD定义)4 NEAR指令单元-1 FAR 指令单元-2,LENGTH 格式为:LENGTH Variable 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数。而对于其他未用DUP说明的情况则回送1。例 FEES DW 100 DUP(0)对于指令MOV CX,LENGTH FEES 汇编程序将使其形成为:MOV CX,100,例 ARRAY DW 1,2,3对于指令 MOV CX,LENGTH ARRAY 汇编程序将使其形成为:MOV CX,1 例 TABLE DB ABCD对于指令MOV CX,LENGTH TABLE汇编程序将使其形成为:MOV CX,l,SIZE 格式为:SIZE Variable 汇编程序应回送分配给该变量的字节数。但是,此值是LENGTH值和TYPE值的乘积。所以:FEES DW 100 DUP(0)MOV CX,SIZE FEES将形成为 MOV CX,200对于:ARRAY DW 1,2,3 MOV CX,SIZE ARRAY将形成为 MOV CX,2 而TABLE DB ABCD MOV CX,SIZE TABLE将形成为MOV CX,1。,LENGTH 和 SIZE 分析符 对于DUP定义的变量:LENGTH 返回的是分配给该变量的元素的个数;SIZE 返回的是分配给该变量的元素的字节数。例如:BUF DW 100 DUP(?)MOV CX,LENGTH BUF;CX=100 MOV CX,SIZE BUF;CX=200(1002)对于其他变量,则返回1(LENGTH),或返回(类型)(SIZE)例如 M1 DW 1,2,3 汇编后形成指令:M2 DB ABCD MOV BL,LENGTH M1 MOV BL,1 MOV AL,LENGTH M2 MOV AL,1 MOV CL,SIZE M1 MOV CL,2 MOV CH,SIZE M2 MOV CH,1,例1:设有数据段中使用 DATA1 DB 05H,A2H,0,10H,85H则 MOV AL,DATA1 可将DATA1中的数传送到AL中,(AL)=05H MOV AX,SEG DATA1可将DATA1的所在段地址传到AX中,(AX)=2000H MOV AX,OFFSET DATA1可将DATA1的偏移地址传入AX中,(AX)=1500H 例2:设有数据段中使用 DATA2 DW 100 DUP(?)定义了100个字单元,则 MOV AX,TYPE DATA2;(AX)=2 MOV AX,SIZE DATA2;(AX)=200 MOV AX,LENGTH DATA2;(AX)=100,05A2001085,DS,CS,DATA1,2000:1500,例:分析运算符应用举例下面定义的数据段DATA,设段基址从40000H开始。DATA SEGMENT V1 DB 2AH,3FHV2 DW 2A3FH,3040HV3 DD 12345678H,12ABCDEFHV4 DW 20 DUP(1)DATA ENDSMOV AX,SEG V1;AX=4000HMOV BX,SEG V2;BX=4000HMOV CX,SEG V3;CX=4000HMOV AX,OFFSET V1;AX=0MOV BX,OFFSET V2;BX=2MOV CX,OFFSET V3;CX=6,2A3F3F2A403078563412EFCDAB12010001000100,40000H,V1,V2,V3,V4,40个字节,MOV AX,TYPE V1;AX=1 MOV BX,TYPE V2;BX=2MOV CX,TYPE V3;CX=4MOV AX,LENGTH V4;AX=20MOV BX,SIZE V4;BX=40而:MOV AH,LENGTH V1;AH=1MOV AL,SIZE V1;AL=1MOV BH,LENGTH V2;BH=1MOV BL,SIZE V2;BL=2MOV CH,LENGTH V3;CH=1MOV CL,SIZE V3;CL=4注:对于形如V1、V2、V3格式定义的变量,运算符LENGTH和SIZE只对DB、DW和 DQ定义的多项逗号分开的数据项的第一项有效。,注意!,上述表达式中运算符的求值的操作不是在程序执行的时候完成,而是在对源程序进行汇编(编译)的时候完成.,PTR 操作符 PTR 用于改变变量或标号的原有属性,PTR本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,保证运算时操作数类型的匹配。常与类型BYTE、WORD、NEAR、FAR连用。格式:类型/距离 PTR 变量或标号 例1 N1 DB 15H,36H N2 DW 1122H LOOP:MOV AX,WORD PTR N1;(AX)=3615H MOV BL,BYTE PTR N2;(BL)=22H 例2 MOV BYTE PTR BX,10H;(BX)10H MOV WORD PTR BX,10H;(BX)0010H,有时指令要求使用PTR操作符。例如用 MOV BX,5 指令把立即数存入BX寄存器内容指定的存储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用PTR操作符来说明属性,应该写明:MOV BYTE PTRBX,5或 MOV WORD PTRBX,5,则语句 MOV AL,DATA2;错而应为:MOV AL,BYTE PTR DATA2,05A2001085,DS,DATA2,例:DATA1 DB 05H,A2H,0,10H,85H DATA2 EQU WORD PTR DATA1 则DATA2和DATA1的段基址和偏移量均相同,但类型不同,DATA1是BYTE型,而DATA2是WORD型。,DATA1,THIS 操作符格式为THIS attribute或type 它可以象PTR一样建立一个指定类型(BYTE、WORD或DWORD)的或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。例如:FIRST_TYPE EQU THIS BYTE WORD_TABLE DW 100 DUP(?)此时FIRST_BYTE的偏移地址值和WORD_TABLE完全相同,但它是字节类型的,而WORD_TABLE则是字类型的。又如:START EQU THIS FAR MOV CX,100 这样,MOV指令有一个FAR属性的地址START,这就允许其他段的JMP指令直接跳转到STAR来。,THIS用来建立新的存储器地址操作数,但不分配存储单元。新的操作数类型在THIS中指定,而其段地址和偏移量就 是汇编时的当前值。用THIS的变量与下一个变量有相同的段基址和偏移量,但两者类型不同。格式为:变量/标量 EQU THIS 类型例如:V11 EQU THIS WORD V1 DB 20H,30H 则:变量V11与V1具有相同的段和偏移量,但V11是WORD型变量,而V1是BYTE型变量。,例:DATA1 SEGMENT WBUFFER EQU THIS WORD BUFFER DB 12H,34H,00H,91H DATA1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1 START:MOV AX,DATA1 MOV DS,AX MOV AL,BUFFER MOV BX,WBUFFER CODE1 ENDS END START,12340091,DS,BUFFER,WBUFFER,AL=12HBX=3412H,段超越操作符 格式:段前缀:变量或地址表达式 说明:段寄存器加冒号为段前缀,即 CS:,DS:,SS:,ES:。该操作符强迫当前指令的操作数寻址不按约定的段进行,而由段超越操作符指定的段寻址。例如:MOV AX,ES:SI;操作数不按约定的DS段,而指定寻址ES段。SHORT操作符 格式:SHORT 标号 说明:用来告诉汇编器转移类指令中转向地址的属性。转移的范围在-128+127。,HIGH和 LOW 称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。例如:CONST EQU OABCDH则 MOV AH,HIGH CONST将汇编成MOV AH,0ABH,运算符与操作符的优先级,3.2.6 注释 注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其它部分的关系,一般写在某语句的后面或某段的开始处,注释的前面由“;”前导,表示后面的内容为注释。如果一行写不下,换行后也要使用“;”前导。,3.3 伪指令及其应用 在8086/8088汇编语言中伪指令是用于诸如数据定义、存储区分配等功能。所谓伪指令是非机器指令,它是在汇编期间进行操作的。,数据定义语句 数据定义语句用于为数据分配相应的存储单元。用一个符号名代表一个或一些单元,并可为这个或这些单元提供初始值。定义数据的操作符有:字节定义DB(每一数据项占一个字节)字定义DW(每一数据项占二个字节)双字定义DD(每一数据项占四个字节)四字定义DQ(每一数据项占八个字节)十字节定义DT(每一数据项占十个字节)重复定义 m DUP(n)(重复m次个数据 n)与数据相联系的符号名称为变量。,数据定义语句的格式为:变量名 操作符 数据项表其中:数据项表由逗号分隔的表达式组成。例:通过下列定义,在存储器中将产生如图所示的结果,以DATA1到DATA5为例:DATA1 DB?;不置初值,为随 机值 DATA2 DW 1000H DATA3 DD 3000A455H DATA4 DB 10,10H DATA5 DW 100,0240H,0360H,DS,随机001055A400300A10640040026003,DATA1DATA2,DATA3,DATA4,DATA5,例 DATABYTE DB 10,4,10H BATAWORD DW 100,100H,5 DATADW DD 3x20,OFFFDH汇编程序可以在汇编期间在存储器中存入数据,例 操作数也可以是字符串,如:MESSAGE DB HELLO则存储器存储情况如图4.3(1)所示而 DB AB和 DW AB的存储情况则分别如图4.3(2)和(3)所示。,例4.3操作数?可以保留存储空间,但不存入数据。如:ABC DB O,?,?,?,0 DFF DW?,52,?经汇编后的存储情况如图4.4所示。,操作数字段还可以使用复制操作符(duplication operator)来复制某个(或某些)操作数。其格式为:repeat_count DUP(operand,operand)其中repeat_count可以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。,例 ARRAY1 DB 2 DUP(0,1,2,?)ARRAY2 DB 100 DUP(?)汇编后的存储情况如图4.5所示。由图可见,例中的第一个语句和语句 ARRAY1 DB 0,1,2,?,0,1,2,?是等价的。,倒45 DUP操作可以嵌套,例如 ARRAY3 DB 100 DUP(0,2 DUP(1,2),0,3)则汇编结果如图4.6所示。,DS,EFCDAB907856341243443132414242413433,例:DATA6 DQ 1234567890ABCDEFH DATA7 DB CD12,AB DATA8 DW AB,34,DATA6,CD12ABBA43,注意:1.用DW语句定义的字符串只允许包含两个字符,若不是两个字符,须用DB语句来定义。1:数据定义语句在存储器中占有相应的单元,而EQU只是定义了一个数据,在汇编后以实际数据的形式体现在程序中。也就是说,EQU语句不会占有存储单元。2:EQU可以用在指令中,而数据定义语句不可以。,DATA7,DATA8,例:重复操作符DUP的应用。格式:DB/DW/DD/DQ/DT DUP(表达式)其中:DUP左边的表达式表示重复的次数,右边的括号中的表达式表示要重复的内容,括号中的表达式可以是:一个问号,表示不置初值,为随机值;一个数据表,将相应单元初始化;,例:DATA SEGMENT ARRAY1 DB 2 DUP(0,1,?)ARRAY2 DW 100 DUP(?)ARRAY3 DB 20 DUP(1,3 DUP(2),5)DATA ENDS,100个空出的字单元,0001-0001-01020202050102020205,ARRAY1,ARRAY2,ARRAY3,重复20次共100个字节,例4.7 OPER1 DB?,?OPER2 DW?,?MOV OPER1,0 MOV OPER2,0 则第一条指令应为字节指令,而第二条指令则应为字指令。,例4.8 OPER1 DB 1,2 OPER2 DW 1234H,5678H MOV AX,OPER11。MOV AL,OPER2 汇编程序在汇编这一段程序时,能发现两条MOV指令的两个操作数的类型属性是不相同的:OPER11为字节类型属性而AX为字类型属性;OPER2为字类型属性而AL为字节类型属性。因而汇编程序将指示出错:这两条MOV指令中的两个操作数的类型不匹配。,符号定义伪操作(Symbol definition)1、赋值语句(EQU)格式:符号名 EQU 表达式 说明:EQU语句给符号定义一个值或其他符号名,甚至定义一条可执行指令等。它把表达式赋给符号名。在程序中,EQU对一个符号名只许定义一次。表达式可以是一个常数,或一个可以求出常数值的表达式,或一个寄存器名,或一个指令助记符。例如 COUNT EQU 20;把常数 20 赋给 COUNTBLOCK EQU$-BUF;把表达式$-BUF 的值赋给BLOCK,例如:PORT EQU 3F8H在程序中可使用 MOV DX,PORT 则等效于 MOV DX,3F8H 又如:STAT_PORT EQU PORT+2 CN EQU CX B EQU DS:BP+20,等号语句(=)格式:符号名=表达式 说明:此语句的功能与 EQU 类似,但该语句在一个程序中可以对同一符号名多次再定义。例如 A1=10;A1 定义为 10A1=100;A1重定义为100A1 EQU 20;出错,因为A1已定义过,不能再用EQU重新定义。,如:X=3 Y=6 Y=Y*Y-X MOV AX,Y 通过上述操作,最后使Y=33,后面的MOV语句中,当生成目标代码时将用33取代Y。即 MOV AX,21H(33D),3、标号定义伪指令LABEL作用:用来在某一变量或标号的基础上定义一个新的类型不 同的变量或标号。格式:变量名或标号名 LABEL 类型其中:变量的类型可用BYTE、WORD和DWORD;标号的类型 有NEAR和FAR。例:VAR1 LABEL WORD VAR2 DB 20 DUP(1)变量VAR1与VAR2有相同的段基址和偏移量,但类型不同。又如:L1 LABEL FAR L2:MOV AX,1000H 标号L1与L2均为指令MOV AX,1000H的符号地址,但类型不同,L1具有FAR类型,L2却是NEAR类型。,例4.9 BYTEARRAY LABEL BYTE WORDARRAY DW 50 DUP(?)这样在100个字节数组中的第一个字节的地址赋于二个不同类型的变量名:字节类型的变量BYTE_ARRAY和字类型变量WORD_ARRAY。指令 MOV WORDARRAY2,0把该数组的第3个和第4个字节置0,而 MOV BYTE_ARRAY2,0则把该数组的第3个字节置0。,定义标号有两种方法,一种是用冒号定义标号(标号名:),这种方法只能定义NEAR属性的标号;另一种就是使用LABEL伪指令定义标号,它可以定义NEAR或FAR属性的标号。例如 FIRST LABEL FAR;定义FIRST为FAR标号。其地址为该语句的下一条语句的地址。NEXT:CALL N-STEP;定义NEXT为NEAR属性的标号。FIRST标号可用于段间转移,而NEXT标号只能用于段内转移。LABEL伪指令用于为标号或变量指明或修改类型属性。,4、段定义语句 格式:段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS 说明:这两个伪操作总是一起出现。该语句将汇编语言源程序分成,如数据段、堆栈段和代码段。段名不能省略,由编程者自己指定段名,两处段名必须一致。方括号中的三项是可选项,是赋给段名的属性。各项顺序不能错,且用空格分开。定位类型 表示此段的起始边界要求,可以是PAGE,PARA,WORD或BYTE之一。它们表示如下的地址要求:,PAGE=0000 0000 B PARA=0000 B(默认值)WORD=0B BYTE=B 它们分别表示以页、节、字、字节为段的地址边界,若项省略,则默认值为PARA(paragraph)。组合类型 用来告诉连接程序(LINK)本段与其他段的关系,分别有 六个选项(NONE,PUBLIC,COMMON,AT表达式,STACK,MEMORY)NONE 本段与其他段逻辑上没有关系,每段都有自己的基地址。(默认值)PUBLIC 把本段与同名同类别的其他段连接成一个段。COMMON 为本段和同名同类型的其他段指定相同的基址。各段会产生覆盖。AT表达式 把本段放在表达式的值所指定的地址上(偏移量按 0 处理),STACK 此段为堆栈段,LINK要求被连接的程序至少有一个STACK段。MEMORY 把本段定位在所有其他段之上。类别 需用单引号括起来,在几个模块连接时才需要,若不准备和其他程序组合,可以不指定类别。,5、段寻址语句(ASSUME)由于段名是任意的,汇编程序并不知道哪个段名对应哪个 段,所以要用ASSUME伪指令来指明段寄存器与段名之间的关系。ASSUME是汇编时进行操作的,它用于在汇编时告诉汇编器,哪个是数据段,哪个是代码段,哪个是堆栈段。,ASSUME伪指令格式:ASSUME 段寄存器:段名,段寄存器:段名,其中:段寄存器:为CS、DS、ES、SS之一段名:为程序中由SEGMENT定义的段之名。注意:每一个汇编源程序必须使用ASSUME伪指令,且ASSUME语句应安排在代码段的开始,但ASSUME伪指令并不实际给段寄存器赋值,必须在程序中用指令的实际操作来给段寄存器赋值,例如:MOV AX,DATA MOV DS,AX,注意:SEGMENT和ENDS前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。对于不同的段定义标号,尽管这些标号可以是任意字串,但为了程序的可读性,应使其有一定的意义。ASSUME语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇编时起作用,在运行时CPU并不知道除CS外的其它段地址,所以必须在程序中用指令进行赋值。首条被执行的语句有一个标号,用以标出这个程序的开始执行处。(在程序的结尾处使用END后跟这个标号)。,例:求出两个16位数M1和M2的积 DATA_SEG SEGMENT M1 DW 0058H M2 DW 012AH M3 DW?M4 DW?DATA_SEG ENDS STACK_SEG SEGMENT S_DATA DB 100 DUP(?)TOP EQU LENGTH S_DATA STACK_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG,58002A0

    注意事项

    本文(微机原理第四章.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开