南邮微机原理课件第3章.ppt_第1页
南邮微机原理课件第3章.ppt_第2页
南邮微机原理课件第3章.ppt_第3页
南邮微机原理课件第3章.ppt_第4页
南邮微机原理课件第3章.ppt_第5页
已阅读5页,还剩174页未读 继续免费阅读

下载本文档

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

文档简介

第3章 指令系统,3.1 概述 3.2 80486寻址方式 3.3 80486标志寄存器 3.4 汇编语言语法规则之一 3.5 80486基本集指令,3. 概述,指令:通知 CPU执行某种操作的“命令”,CPU全部指令的集合,称为指令系统,指令的书写格式 目标指令(机器指令)用一串0,1代码书写 注意:硬件只能识别,存储,运行目标指令 符号指令:用规定的助记符,规定的书写格式书写的指令,大多数指令由操作码和地址码2部分组成 操作码:通知CPU执行什么操作(唯一) 地址码:指令的操作对象所存放的位置(根据操作对象的多样性其表现形式很多) 教材上把地址码称为操作数,3.指令的组成,相应的编码规则对指令进行编码 操作码的编码 地址码的编码,80486符号指令与机器指令对照表,MOV: MOVE传送 ADD:加 SUB:减 RET:RETURN 返回,4.目标程序的生成,汇编 源程序,编辑、汇编、链接,可执行的机器指令 程序(目标程序),5.指令长度 486指令长度(机器指令长度)为116字节 规定:多字节指令占用连续的内存单元,存放指令第一字节的内存地址,称为“指令地址”。,CPU只能识别,存储,运行目标指令,而用机器指令编程非常困难。于是早期的专家们发明了符号指令,再经过软件把符号指令机器指令。图示如下:,6.指令存放,如:12345H单元中有一条指令 MOV AX,6789H,67H,89H,B8H,12345H:,MOV AX,6789H,先写操作码,再写操作数。多字节操作数连续存放。存放规律: 低位字节存放在低地址单元,高位字节存放在相邻的高地址单元,7. 符号指令的 书写格式,如:NEXT: ADD AX , BX ;AX+BX AX INC SI ;SI+1 SI,标号:以字母开头,后跟字母,数字,下划线,长度31字符 标号又称符号地址,代表该指令的逻辑地址。可有可无,设置是为了程序的转向,注解:以“ ;”开头,不执行,打印程序清单时照原样打印,“系统保留字”不能做标号。,3.2 486寻址方式,操作数是指令的操作对象,寻址方式与地址码有密切关系。形成操作数地址码的过程就是寻址。,“寻址方式”:通俗的讲,就是通知CPU本条指令的操作数在哪儿?或者说用什么方式才能得到操作数。,微机系统有3类操作数: 立即数:操作数包含在本条指令中,是指令的一部分。 寄存器操作数:CPU内部的通用寄存器,段寄存器内容。 内存操作数:操作数在存储单元中。,486有3类7种寻址方式 立即寻址方式:获得立即数 寄存器寻址方式:获得寄存器操作数 存储器寻址方式:获得存储器操作数(内存操作数),学习重点:怎样在符号指令中,正确的描述各种寻址方式,1.立即寻址操作数包含在本条指令中,是指令的一部分,完整地取出该条指令,也就获得了操作数。,操作码,34H,12H,代码段,低,高,DX,DL,DH,DX,34,12,例:MOV DX,1234H,0,15,立即寻址方式示意图,如:MOV EAX,12345678H MOV BL,10101010B ;AAH BL MOV CL, 4 ;FCH CL MOV DL,A ;41H DL ADD AL,0C8H MOV SI,3*5 ;15 SI,上例源操作数即为立即寻址, 立即数书写规定: 立即数以数字开头,以开头的16进制数,必须前缀0。,程序员可以按自己的习惯书写立即数,各种合法的立即数经汇编后,一律自动转换成等值的二进制数,负数用补码表示。,立即数的数制用后缀表示,B表示二进制数,H表示十六进制数, D或缺省为十进制数,单引号括起来的字符编译成相应的ASCII码 。,可以用+ * / 组成立即数表达式,2. 寄存器寻址操作数在CPU的某个寄存器中,符号指令中直接写出寄存器名称。,如: MOV AX , DS ;DS内容 AX INC SI ;SI+1 SI (Increase 增量) DEC DI ;DI 1 DI (Decrease 减量),如:下述条指令,目标操作数即为寄存器寻址 MOV EAX,12345678H MOV BL,10101010B ;AAH BL MOV CL, 4 ;FCH CL MOV DL,5 ;35H DL ADD AL,0C8H MOV SI,3*5 ;15 SI,3.存储器操作数寻址方式 重申: 在读写内存操作数之前,CPU必须知道相关存储单元的物理地址。,程序员的责任仅在于正确的书写逻辑地址表达式,然后由CPU自动运算以求出物理地址。,由于CPU对存储器采用分段管理, 因此指令格式中只能写出存放操作数的内存单元的“逻辑地址”。,存储单元逻辑地址表达式的一般形式,段寄存器:,偏移地址,实模式下,物理地址=段寄存器24 +偏移地址,(1) 直接寻址 地址表达式的格式1:段寄存器:偏移地址,地址表达式的格式2: 段寄存器:变量名 用变量名代表存储单元的有效地址,如:MOV AL, ES:2CH 从ES附加段偏移地址为2CH的单元取数AL,如:MOV AX, DS:1234H 从数据段偏移地址为1234H的单元取一字AX 这种格式很少使用, 通常情况下,程序员不知道某单单元的偏移地址(本书仅在P349有过一次应用),操作码,34H,12H,50H,30H,代码段,低,高,DS,00,50,AX,AL,AH,例: MOV AX, DS:1234H,直接寻址方式示意图,50000H,0,50000H,+ 1234H,51234H,51234H,数据段,设数据段XX字节单元的内容为11H ES附加段YY字单元的内容为2233H MOV AL, DS:XX ;取数据段XX字节单元的内容AL 或 MOV AL, XX ; AL=11H MOV AX, ES:YY ;取ES附加段YY字单元的内容AX 或 MOV AX, YY ; AX=2233H,说明: 汇编语言允许为某单元起一个“名字”,这个名字就称为该单元的“变量名”,经汇编之后,变量名有段基址和偏移量两种属性。 变量名是唯一的,程序中不能有重复的变量名, “段寄存器:”可以省略。,(2)寄存器间接寻址 寄存器间接寻址又称间接寻址,间址 什么是间接寻址? 操作数在内存单元,该单元的段基址在段寄存器中 有效地址在间址寄存器中,CPU首先进行地址计算, 间接寻址的地址表达式 段寄存器:间址寄存器 某单元的物理地址=段寄存器内容16+间址寄存器, 访问约定的逻辑段,间接寻址的地址表达式简化为: 间址寄存器 某单元的物理地址=约定的段寄存器内容16+间址寄存器,操作码,30H,代码段,低,高,DS,5 0 0 0,30,例: MOV AX , BX,间接寻址方式示意图,50000H,0,51000H,数据段,1 0 0 0,H,H,5 1 0 0 0 H,BX,+,50H,50,AX, 间址寄存器 和约定访问的逻辑段 486规定:,举例: 设数据段BUF字节单元的内容为55H,取出该数 AL,解1:用BX间址 MOV AX , 数据段段基址 MOV DS , AX MOV BX , BUF单元的有效地址 MOV AL , DS:BX ;AL=55H 等价于: MOV AL , BX 由于BX间址,约定访问的是数据段, “DS:”可省,解2:用BP间址 MOV AX , 数据段段基址 MOV DS , AX MOV BP , BUF单元的有效地址 MOV AL , DS:BP ;AL=55H 不能写成: MOV AL , BP 由于BP间址约定访问的是堆栈段, “DS:”不可省,解3:用变量名直接寻址 MOV AX,数据段段基址 MOV DS,AX MOV AL, BUF ;AL=55H,(3)基址寻址 在基址寻址中,有效地址由两部分组成。一部分在基址寄存器中,另一部分为常量 。, 基址寻址的地址表达式: 段寄存器:基址寄存器+位移量 物理地址=段寄存器内容16+基址寄存器+位移量, 访问约定的逻辑段,简化的地址表达式: 基址寄存器+位移量 物理地址=约定的段寄存器内容16+基址寄存器 +位移量,操作码,30H,代码段,低,高,DS,5 0 0 0,AL,例: MOV AL,BX+2,基址寻址方式示意图,50000H,0,51002H,数据段,1 0 0 0,H,H,5 1 0 0 2 H,+BX,02H,0 2,+,H, 基址寄存器和约定访问的逻辑段, 举例 设数据段BUF单元依次有:78H,56H,34H,12H 则: MOV AX , 数据段段基址 MOV DS , AX MOV BX , BUF单元有效地址 MOV DH , BX+1 ;DH=56H MOV DX , BX+2 ;DX=1234H,12H,34H,56H,78H,BUF,(4) 变址寻址 有比例因子的变址寻址其地址表达式为 段寄存器:比例因子*变址寄存器+位移量 物理地址=段寄存器16+比例因子变址寄存器 +位移量,没有比例因子的变址寻址其地址表达式为: 段寄存器:变址寄存器+位移量 访问约定的逻辑段可简化为 : 变址寄存器+位移量 物理地址=约定的段寄存器16+变址寄存器+位移量, 变址寄存器与约定访问的逻辑段,说明:比例因子只能是1、2、4、8,因此:MOV AL, 8*SI+15;非法,16位寻址不能使用 比例因子 MOV AL , 10*ESI+5 ;非法指令,比例因子错了 MOV AL , ES:SI ;访问附加段 MOV AL , SI ;访问数据段,(5) 基址加变址寻址,存储单元的有效地址由3部分组成 有比例因子的基址加变址的地址表达式为: 段寄存器:基址寄存器+比例因子*变址寄存器+位移量,访问约定逻辑段其地址表达式简化为: 基址寄存器+比例因子*变址寄存器+位移量,操作码,30H,代码段,低,高,DS,5 0 0 0,AL,例: MOV AL,BX+SI+0250H,基址+变址寻址方式示意图,50000H,0,53250,数据段,2 0 0 0,H,H,5 3 2 5 0 H,+SI,50H,0 2 5 0,+,H,1 0 0 0,H,+BX,02H,无比例因子基址加变址 地址表达式: 段寄存器:基址寄存器+变址寄存器+位移量 访问约定逻辑段: 基址寄存器+变址寄存器+位移量,基址加变址寻址是基址寻址和变址寻址的组合,要求 基址寄存器和变址寄存器都是16位或都是32位,否则(16位寻址和32位寻址混合使用)是非法指令 默认的段寄存器不一致,这样的组合虽然是合法,但容易出错,如:BP+SI,BP+DI BP约定的逻辑段为堆栈段,而SI、DI约定的逻辑段为数据段,它们组合之后约定访问的逻辑段是谁?,实验证明是堆栈段,这样的组合最好要加段前缀。,寻址方式的学习要点: 1.访问内存操作数由5种寻址方式 直接寻址、间址、基址、变址、基址加变址,2.关于16位寻址和32位寻址 16位寻址:采用16位间址、基址、变址、基址加变址 32位寻址:采用32位间址、基址、变址、基址加变址,3.在实模式下,一个逻辑段的体积最大为64K,存储 单元的有效地址为16位,不可能超过FFFFH,在实模式下运行的程序通常采用16位寻址,4.关于段约定和段超越,在用间址、基址、变址、基址加变址寻址内存操作数时,其地址表达式都有2种书写格式有段 前缀和无段前缀,如用BP、EBP、ESP参与寻址,CPU自动认为是访问堆栈段, 段超越前缀“SS:”可省,MOV AL , SS:BP ;访问SS段,用BP间址 MOV AL , BP,如用BP、EBP、ESP参与寻址非堆栈段,必须明确写出段超越前缀,如:,MOV AL , DS:BP ;访问堆栈段,用BP间址 MOV AL , ES:BP+2,如用BX、SI、DI、EAXEDX、ESI、EDI参与寻址, CPU自动认为是访问数据段,“ DS:”可省,如:MOV AL,DS:BX MOV AL,BX, 如用BX、SI、DI、EAX、EDX、ESI、EDI参与寻址非数据段,必须明确写出段超越前缀,如:,MOV AL, ES:BX MOV AL, FS:SI+2,5使用段约定访问内存操作数是最常用的编程风格,假设 BP=1000H,BX=1000H,SI=2000H 偏移地址=0016H 说明下面几条指令的源操作数的寻址方式、偏移地址及结果 (1)MOV BX,1000H (5) MOV AL,SI+0016H (2) MOV AL,DS:2000H (6) MOV AL,BP+0016H (3) MOV AX,BX (7) MOV Al,BX+SI+0016H (4) MOV DL,BX,12H,34H,56H,78H,1000H,1016H,2000H,2016H,3016H,数据段,21H,43H,65H,87H,1016H,2000H,3016H,堆栈段,1000H,9AH,A9H,2016H,3.3 标志寄存器,80486标志寄存器为32位,实际使用15位 15位标志分为两类:状态标志和控制标志 状态标志记录了当前指令执行后的状态信息 控制标志用来控制微处理器操作,本节首先介绍6种状态标志 一状态标志,1. C标志进位/借位标志 字节加/减,最高位(D7)产生进位/借位时: C标志置1,否则置0 字加/减,最高位(D15)产生进位/借位时: C标志置1,否则置0 双字加/减,最高位(D31)产生进位/借位时: C标志置1,否则置0,2. A标志辅助进位/辅助借位标志,字节加/减,D3位产生进位/借位时: A标志置1,否则置0,字加/减,D7位产生进位/借位时: A标志置1,否则置0 双字加/减,D15位产生进位/借位时: A标志置1,否则置0,3. S标志符号标志,字节运算后,结果的最高位D7位为1, S标志置1,否则置0 字运算后,结果的最高位D15位为1, S标志置1,否则置0 双字运算后,结果的最高位D31位为1, S标志置1,否则置0,4. Z标志结果标志 运算结果为全0时,Z标志置1,否则置0,5.P标志奇偶标志(实际上是偶标志) 运算结果中,“1”的个数为偶数个(没 有“1”也是偶数),P标志置1,否则置0,6. O标志溢出标志 运算结果产生溢出,则O标志置1,否则置0,二 .复习:有关溢出的几个概念 1. 什么是溢出? 运算结果超出寄存器能表示的范围,称为溢出。 溢出和操作数的性质有关。,8位无符号数运算, 结果255 有溢出 16位无符号数运算, 结果65535 有溢出 32位无符号数运算, 结果 232_1 有溢出 8位有符号数运算, -128结果127 有溢出 16位有符号数运算, -32768结果32767 有溢出 32位有符号数运算, -231结果 231_1 有溢出,2. CPU如何判断溢出 由于溢出和操作数的性质有关,而操作数的性 质是由程序员定义的。CPU只能默认一种选择, 即CPU一律 默认操作数是有符号补码数,并以此 来设置溢出标志。,3.程序员如何判断溢出 有符号数运算,判O标志,O标志为1,有溢出 无符号数加/减,判C标志,C标志为1,有溢出,AL=90H,如果C8H为无符号数(值=200),则有溢出。如果C8H为有符号数(值=-56),则无溢出。 这6个标志中,C.O.P.S.Z可为程序的转移提供测试条件。,3.4 汇编语言语法规则,为了在介绍指令的过程中,穿插一些例题,有必要先介绍一些汇编语言的语法规则,本节内容参看教材4.1,4.2,4.3,4.4节。,一.概述 1.可执行文件的生成 编辑, 编译, 链接,2.源程序中的语句类型 一个完整的源程序应包含2类语句: 符号指令、汇编伪指令(伪语句),标号名、变量名、段名、过程名命名规则:以字母开头,后跟字母、数字长度31个字符,符号指令:经汇编后,其目标指令通知CPU进行什么操作 伪指令:为汇编程序,链接程序提供汇编链接信息,二.常用的伪指令 1.字节字义伪指令 变量名 DB 一串用逗号间隔的单字节数,说明: DB Define Byte 的缩写,“定义字节”。 ? 随机数, Dup Duplicate(重复) 3 Dup(?) 代表3个用逗号间隔的随机数 5 Dup(A)代表5个用逗号间隔的A的ASC码,如: N1 DB 12H,64,-1,3*3 DB 01010101B, A , B DB 0A6H, HELLO N2 DB ?,?,? ;与下条等价 N2 DB 3 DUP(?),功能: 通知汇编程序把DB后跟的单字 节数,依次存入从变量(如N1) 开始的单元,负数用补码表示, 单引号中的字符翻译成ASC码。,如: N1 DB 12H,64,-1,3*3 DB 01010101B, A , B DB 0A6H, HELLO N2 DB ?,?,? ;与下条等价 N2 DB 3 DUP(?),如: N1 DB 12H,64,-1,3*3 DB 01010101B, A , B DB 0A6H, HELLO N2 DB ?,?,? ;与下条等价 N2 DB 3 DUP(?),功能: 用DB定义的这些内存单元(N1 N1+12, N2 N2+2)的属性均为“字节型”。,2.字定义伪指令 变量名 DW 一串用逗号间隔的双字节数,如: WNUM DW 1234H,12, AB, C DW ?,? DW 2 DUP(?),说明: DW Define Word “字定义” ? 双字节随机数 单引号中只能是一个或两个字符,功能: 通知汇编程序把DW后跟的双字节数, 依次存入从变量名开始的单元,每一个数 占2个字节,低位字节低址单元, 高位字节相邻的高址单元。,功能: 用DW定义的这些单元的属性都是“字型”, 如上例, WNUM WNUM+11这12个单元的属性都是“字型”。,功能: 通知汇编程序把DD后跟的数存入变量名开始的单元, 每一个数占4个字节,低位字节低址单元,高位字节高址单元。,用DD定义的这些单元的属性都是“双字型”,上例DNUM DNUM+3单元,这些单元都是双字型单元,3. 双字定义伪指令 变量名 DD 一串用逗号间隔的4字节数 如: DNUM DD 12345678H,5. 等值伪指令 符号常数 EQU 表达式 如: NUM EQU 33,功能: 定义符号常数NUM的值为33,6. 等号伪指令 符号常数=表达式 如: NUM = 33 功能:定义符号常数NUM的值为33,4. 多字节定义伪指令 变量名 DF 一串用逗号间隔的6字节数 变量名 DQ 一串用逗号间隔的8字节数 变量名 DT 一串用逗号间隔的10字节数,功能: 通知汇编程序为DF/DQ/DT后跟的每一个数,分配 6/8/10个单元。,三. 常用运算符 1. 算术运算符: +, -, *, /,2. 关系运算符: EQ(等于), NE(不等于), GT(大于),LT(小于), GE(大于或等于),例如: NUM EQU 33 MOV AL, NUM ;该指令与下条指令等价 MOV AL , 33,区别: 用EQU定义的符号常数,其值在后继语句中不能更改;用“=”定义的符号常数,其值在后继语句中可以重新定义,应用: $运算符紧跟在 DB、DW、DD伪指令之后,统计字符串的长度。,例如数据段有: BUF DB THE QUICK BROWN FOX ;字符串长度19 LLL EQU $-BUF 汇编后 符号常数LLL的值即为19,3. $运算符 汇编程序对源程序是逐行汇编的,$运算符可以返回 汇编计数器的当前值。,如: MOV AX, SEG DATA MOV DS, AX 设“DATA”是数据段的段名,上述两条指令算出数据段的段基址,先赋给AX,再转赋DS。,5.OFFSET运算符 格式:OFFSET 变量名或标号名 功能:算出某个变量或标号名所在单元的偏移地址(有效地址)。,4. SEG运算符 格式: SEG 段名或变量名或标号名 功能: 计算某一逻辑段的段基址,设以“DATA”为段名的数据段中,存在 BUF DB 12 ,34 ,56 代码段: MOV AX,SEG DATA MOV DS,AX MOV BX,OFFSET BUF MOV AL,BX ;AL=12,以下两条指令等价的: MOV BX,OFFSET BUF LEA BX,BUF,6. PTR运算符 格式: 类型说明符 PTR 地址表达式,功能: 在本条指令中临时修改地址表达式的属性, BYTE(字节) WORD(字) DWORD(双字) FAR(远) NEAR(近),PTR运算符使用规则 (1) 指令的操作数至少有一个类型属性要确定,否则必须用PTR运算符说明其中的内存操作数的类型 (2)若两个操作数的类型属性都确定,则必须保持一致。否则必须用PTR运算符改变其中的内存操作数的类型,以保持前后属性一致。,类型属性确定的操作数: 寄存器 用变量名直接寻址的内存操作数,类型属性不确定的操作数: 立即数 间址、基址、变址、基址+变址寻址的内存操作数,应用:在下列指令中必须用PTR临时修改或者显示说明 内存单元的属性 在双操作数指令中(如:MOV,ADD,SUB,CMP) 源操作数为立即数,目标为直接寻址的内存操作数, 但立即数超过内存操作数范围,后者必须用PTR临时修改 其属性 。 一操作数为寄存器,另一为直接寻址的内存操作数, 但两者属性不一致,后者必须用PTR临时修改 其属性 。 源为单字节/双字节立即数,目标为间址、变址、基 址或基址加变址寻址的内存操作数,后者必须用PTR显 示说明其属性,以便和源操作数属性一致。,在单操作数指令中(如:INC,DEC) 操作数为间址、变址、基址或基址加变址寻址的内 存操作数,必须用PTR说明是字节操作?字操作?还 是双字操作?,举例:设数据段有: BUF DB 11,22,33,44 WBUF DW ?,? XX DB 0FFH,0 YY DB 0FFH,0FFH,0,0 ZZ DB 0FFH,0FFH,0FFH,0,代码段:, MOV BUF,12H ,举例:设数据段有: BUF DB 11,22,33,44 WBUF DW ?,? XX DB 0FFH,0 YY DB 0FFH,0FFH,0,0 ZZ DB 0FFH,0FFH,0FFH,0,举例:设数据段有: BUF DB 11,22,33,44 WBUF DW ?,? XX DB 0FFH,0 YY DB 0FFH,0FFH,0,0 ZZ DB 0FFH,0FFH,0FFH,0,7.方括号 用方括号括起来的地址表达式是访问内存操作数常用的寻址方式,方括号的另一用途是标注数组元素的下标,下标从0开始。,代码段: MOV AL,BUF3 ;AL=44,1。已知数据段12345H单元内容为55H,X单元内容为66H,连续执行下列指令后,AL=?,X单元的内容=? MOV AX,1000H MOV DS,AX MOV BX,2345H MOV AL,BX MOV SI,X单元的有效地址 MOV SI,BL,2。已知DS=3000H,ES=4000H,BX=1000H 内存单元地址 内容 31000H 34H 31001H 12H 41000H 78H 41001H 56H 请问执行 MOV AX,BX AX=? MOV AX,ES:BX AX=? MOV AH,ES:BX AX=?,3。一个有16个字的数据区,它的起始地址为70A0:DDF6H,请写出这个数据区首末字单元物理地址,4。BUF DB THE QUICK BROWN FOX LL EQU $-BUF S DB HELLO LLL EQU $-S LLLL EQU $-BUF 分别写出LL=? LLL=? LLLL=?,5。BUF DB THE QUICK BROWN FOX LL EQU $-BUF S DB HELLO LLL EQU $-S LLLL EQU $-BUF 分别写出LL=? LLL=? LLLL=?,3.5 80486基本集指令,分6类,为讲授方便,用,N 代表立即数,N8、N16、N32代表8、16、32位立即数 R 代表寄存器操作数,R8、R16、R32代表8、16、32位寄存器操作数 M 代表内存操作数,M8、M16、M32代表8、16、32位内存操作数 S 代表段寄存器,总说明:,源、目操作数不可同为内存操作数 源、目操作数属性一致(长度相同) 当目标操作数为间址、变址、基址、基+变址的内存操作数,而源操作数为单字节/双字节立即数,则目标操作数必须用PTR说明类型,若操作数为间、变、基、基+变的内存操作数,则必须用PTR说明类型,2. 对于单操作数指令(如:I NC,DEC),1. 于双操作数指令(如:MOV,ADD,CMP),第一类、 传送类,本类指令执行后,不影响状态标志,1. 通用传送,CS不能做目标,不能向段寄存器写入立即数 禁止2个内存单元直接传送 源、目属性要一致,说明:,为了深入理解数值定义伪指令、学习PTR运算符的使用,请仔细阅读以下例题。,【例】阅读以下程序,写出指令执行后的目标操作数。,代码段: MOV AX,SEG 数据段段名 MOV DS,AX ;对DS初始化 MOV BL,BNUM ;BL=?,所以,BL=12H,数据段经过汇编之后,,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX MOV BX,WNUM+2 ;BX=?,数据段经过汇编之后,,所以,BX=3344H,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX MOV EBX,DNUM+4 ;EBX=?,数据段经过汇编之后,,所以,EBX=87654321H,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX MOV BL,BYTE PTR DNUM ;BL=?,数据段经过汇编之后,,所以,BL=68H,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX ;对DS初始化 MOV BX, WORD PTR BNUM+1 ;BX=?,所以,BX=5634H,数据段经过汇编之后,,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX ;对DS初始化 MOV EBX , DWORD PTR WNUM+1 ;EBX=?,所以,EBX=66334411H,数据段经过汇编之后,,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX, SEG 数据段段名 MOV DS, AX MOV BX, WORD PTR DNUM 3 ;BX=?,数据段经过汇编之后,,所以,BX=2113H,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX ;对DS初始化 MOV BX, WORD PTR FNUM ;BX=?,所以,BX=5566H,数据段经过汇编之后,,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX ;对DS初始化 MOV BX, 3 MOV BL,BNUM BX ;BL=?,所以,BL=78H,数据段经过汇编之后,,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,代码段: MOV AX,SEG 数据段段名 MOV DS,AX ;对DS初始化 MOV SI, OFFSET BNUM MOV BX, SI+1 ;BX=?,所以,BX=5634H,数据段经过汇编之后,,设数据段: BNUM DB 12H,34H,56H,78H,90H WNUM DW 1122H,3344H,5566H DNUM DD 13572468H,87654321H FNUM DF 112233445566H,说明:源操作数字长要小于或等于目标寄存器字长,功能:,源操作数不变 MOVSX 源操作数符号位向高位扩展,再送给目标 MOVZX 源操作数高位补零,再送给目标,功能:计算内存单元的有效地址(不是其中的操作数)目标,LEA BX , BUF;将BUF单元的有效地址BX LEA BX , SI+5 ;将数据段SI+5变址的那个单元的有效地址BX,注:有效地址就是偏移地址,LEA指令等效与OFFSET运算符 LEA BX,BUF 等效于 MOV BX,OFFSET BUF,功能:完成2个操作数互换,功能:DS:BX+ALAL或DS:EBX+ALAL,例:查找NUM单元中的数所对应的数码管字型码,数码管字型码:,设D7D0位依次驱动 h g f e d c b a 段,则:,的字型码为:0 0 1 1 1 1 1 1 = 3FH,的字型码为:0 0 0 0 0 1 1 0 = 06H,的字型码为:0 1 0 1 1 0 1 1 = 5BH,的字型码为:0 1 1 0 0 1 1 0 = 66H,的字型码为:0 1 0 0 1 1 1 1 = 4FH,的字型码为:0 1 1 1 1 1 0 1 = 7DH,的字型码为:0 1 1 0 1 1 0 1 = 6DH,的字型码为:0 0 1 1 1 0 0 1 = 39H,的字型码为:0 1 1 1 1 0 0 1 = 79H,的字型码为:0 1 1 1 0 0 0 1 = 71H,的字型码为:0 1 1 1 1 1 1 1 = 7FH,的字型码为:0 1 1 0 1 1 1 1 = 6FH,的字型码为:0 1 1 1 0 1 1 1 = 77H,的字型码为:0 1 1 1 1 1 0 0 = 7CH,的字型码为:0 1 0 1 1 1 1 0 = 5EH,的字型码为:0 0 0 0 0 1 1 1 = 07H,解:编程时,按09、AF的规律,将相应的字型码设置在数据段中:,TAB DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H NUM DB ;015中的一个数,代码段:,MOV AX , SEG TAB MOV DS , AX MOV BX , OFFSET TAB MOV AL , NUM XLAT TAB ;AL=相应的字型码,数据段:,2. 堆栈操作指令,例:农民存储粮食用的 “粮垛”就是一个堆栈,计算机中的堆栈是人为设置的 一片连续内存区,用来存放数 据,所存数据按先进后出规律 存取。,栈顶和栈底:,栈顶:栈区的低地址 栈底:栈区的高地址,堆栈段寄存器SS:存放堆栈段段基址,堆栈指针ESP(SP):存放栈顶单元的偏移地址,SS、ESP(SP)初值,由程序员赋值或DOS系统自 动赋值,数据进栈过程(以16位操作数进栈为例),双字节操作数,高字节,低字节,SP,X X H,X X H,高8位SS:SP1,1 2 H,3 4 H,堆栈区,数据进栈过程(以16位操作数进栈为例),X X H,X X H,1 2 H,SP,高8位SS:SP1,低8位SS:SP2,双字节操作数,高字节,低字节,堆栈区,1 2 H,3 4 H,数据进栈过程(以16位操作数进栈为例),高8位SS:SP1,X X H,X X H,1 2 H,低8位SS:SP2,3 4 H,SP,SP2SP,双字节操作数,高字节,低字节,堆栈区,1 2 H,3 4 H,数据进栈过程(以16位操作数进栈为例),高8位SS:SP1,X X H,X X H,1 2 H,低8位SS:SP2,3 4 H,SP,SP2SP,双字节操作数,高字节,低字节,堆栈区,1 2 H,3 4 H,高字节,低字节,堆栈区,X X H,X X H,1 2 H,3 4 H,SP,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,7 8 H,5 6 H,16位目标寄存器,3 4 H,7 8 H,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,高字节,低字节,堆栈区,X X H,X X H,SP,SS:SP+1目标高8位,1 2 H,16位目标寄存器,5 6 H,高字节,低字节,堆栈区,X X H,X X H,1 2 H,SP+2SP,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,SS:SP+1目标高8位,SP,16位目标寄存器,34 H,5 6 H,高字节,低字节,堆栈区,X X H,X X H,3 4 H,1 2 H,SP+2SP,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,SS:SP+1目标高8位,SP,16位目标寄存器,(2) 堆栈指令,进栈指令,PUSH 源操作数 N16 / N32 S / R16 / R32 / M16 / M32,说明:非直接寻址的内存操作数,必须用PTR说明属性, 出栈指令,POP 目标操作数 R16 / R32 / M16 / M32 S(CS非法),说明: 非直接寻址的内存操作数,必须用PTR说明属性, 32位寄存器进栈/出栈,PUSHAD ;依次把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI压栈 (共48字节) POPAD ;从栈顶弹出48字节依次放入EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX,第二类、算术运算,1. 二进制加法: ADD 目标操作数 ,源操作数 2. 二进制减法: SUB 目标操作数 ,源操作数 3. 二进制加进位:ADC 目标操作数 ,源操作数,4. 二进制减进位: SBB 目标操作数 ,源操作数 R/M , N/R R , M,注:此四种操作都影响A、C、O、P、S、Z标志,12H可以理解为是0012H,或00000012H,汇编程序无法肯定它的具体长度,故要用PTR说明,例:实现下列多字节数运算(以232为模),5 6 7 8 8 7 8 5 H + 7 8 9 A 8 7 8 5 H,设数据段:,FIRST DD 56788785H SECOND DD 789A8785H SUM DD ?,0,F,0,3,1,F,C,H,A,经汇编之后:,FIRST,SECOND,5. 二进制加1 : I NC 目标操作数 6. 二进制减1 : DEC 目标操作数 7. 二进制求补 : NEG 目标操作数 R / M,N DB 0FFH, 0FFH , 0 , 0 MOV BX , OFFSET N INC BX INC BYTE PTR BX ;N单元为0 INC WORD PTR BX ;N、N+1单元都为0 INC DWORD PTR BX ;N、N+1单元都为0 ;且N+2单元为1,NEG的应用:求出目标操作数的负值,数据段:,代码段:,不等价,执行结果不同,MUL默认乘数、被乘数、乘积为无符号二进数 I MUL默认乘数、被乘数、乘积为有符号二进数 高位积为0,则C标、O标=0,否则为1 乘数、被乘数等长,乘积为双倍长,8. 无符号二进数乘法:M U L 乘数,9. 有符号二进数乘法,格式1:I M U L 乘数,格式2:I MUL 目 ,源操作数 R16 , R16 / M16 / N16 / N8 M16 , R16 R32 , R32 / M32 / N32 / N16 / N8 M32 , R32,说明:源、目不能同为M,功能:源目目,格式3: I MUL 目 , 源 ,立即数 R16 / R32 , 与目等长的R/M , 不超过目长的N,功能:源立即数目,例:实现15000012,10. 无符号二进数除法:DIV 除数,11. 有符号二进数除法:I DIV 除数,功能:, 被除数应为除数的双倍长, 如除数太小,使商值超出范围,屏幕显示: Divided overflow 然后自动返回DOS,12. 比较指令,CMP 目标操作数 , 源操作数 R/M , 与目标等长的R / M 不超过目标长的立即数,由此可见,一串0、1代码,是二进数还是BCD码 数,是由程序员定义的,CPU并不理解。, 指令格式中怎样表述BCD码数(在内存区如何定义BCD码数)?, 假设N=01101001 若N是二进数,则N=(105)10 若N是BCD码数,则N=(69)10,13. BCD码调整指令,(1) 基本概念, 组合/未组合BCD码数(即压缩/未压缩BCD码数),注意:10101111不是BCD码,组合BCD码:一字节中含有2位BCD码,未组合BCD码:一字节中含有1位BCD码(高4位为0),8位,十位,个位,组合BCD码,8位,未组合BCD码,如:69的BCD码数应写成69H 即:MOV AL, 69H ;则AL=0110,1001 或:MOV AL ,09H ;则AL=00001001 MOV AH ,06H ;则AH=00000110 若:MOV AL , 69 ;则AL=0100,0101,如:69的BCD码数定义在内存单元时 即:BUF DB 69H 或:BUF DB 09H,06H 若:BUF DB 69 则错, BCD码数的加减运算,BCD码数是用4位二进数代表1位十进数 其运算法则应是:“逢十进一,减一当十”,假设:N1=(0110 , 1001)BCD N2=(0000 , 1001)BCD 则:N1+N2=69+09=78 即结果应当等于(0111 , 1000)BCD, 如何实现BCD码数的加法呢?,指令系统中没有实现BCD码数加法的指令,只能借用ADD、A

温馨提示

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

评论

0/150

提交评论