教学课件-汇编语言程序设计-郭显久_第1页
教学课件-汇编语言程序设计-郭显久_第2页
教学课件-汇编语言程序设计-郭显久_第3页
教学课件-汇编语言程序设计-郭显久_第4页
教学课件-汇编语言程序设计-郭显久_第5页
已阅读5页,还剩491页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

汇编语言程序设计第1章概述第2章8086CPU汇编程序设计环境第3章8086微处理器的指令系统第4章8086汇编语言第5章8086汇编语言基本程序设计第6章输入/输出程序设计第7章32位汇编语言

第1章概述1.1微型计算机发展过程1.2微型计算机特点1.3微型计算机系统1.4计算机语言

1.5计算机中数和字符的表示1.1微型计算机发展过程

微型计算机(Microcomputer),简称µC或MC,是指以微处理器为核心,配上由大规模集成电路制作的存储器、输入/输出接口电路及系统总线所组成的计算机(简称微型机,又称微型电脑)。自从1971年美国Intel公司发明了第一台微处理器以来,已经经历了四十年的历史,微机计算机的发展非常迅速,对于微型计算机的发展,一般以字长和典型的微处理器芯片(Microprocessor)作为划分标志,将微型计算机的发展划分为五个阶段。1.1微型计算机发展过程第一个阶段(1971~1973)主要是字长为4位的微型机和字长为8位的低档微型机。指令系统比较简单,运算功能较差,速度较慢,计算机语言采用的是机器语言或简单的汇编语言。第二个阶段(1973~1978)主要是字长为8位的中、高档微型机。除采用机器语言和汇编语言外,还配有BASIC,FORTRAN,PL/M等高级语言及其相应的解释程序和编译程序,并在后期开始配上操作系统。第三个阶段(1978~1985)主要是字长为16位的微型机。具有丰富的指令系统,采用多级中断系统、多重寻址方式、多种数据处理形式、段式寄存器结构、乘除运算硬件,电路功能大为增强,并都配备了强有力的系统软件。

1.1微型计算机发展过程第四个阶段(1985~2000)主要是字长为32位的微型机。增加了面向多媒体数据处理和网络应用的扩展指令,微机的功能已经达到甚至超过超级小型计算机,多任务、多用户的作业。第五个阶段(2000~)出现了字长为64位的微处理器芯片。采用全新指令架构IA-64,沿用了x86指令体系(一般将自8086以来一直延续的这种指令体系通称为x86指令体系),能够很好的兼容原来的IA-32结构的个人微机系统,具有一定的普及性。

1.2微型计算机特点微型计算机本质上与其它计算机并无太多的区别,除了具有一般计算机运算速度快,计算精度高,有记忆能力和逻辑判断能力为,还有微型计算机自己的特点:(1)体积小,重量轻;(2)价格低;(3)可靠性高,结构灵活(4)应用面广;(5)功能强,性能优越。1.3微型计算机系统微型计算机系统包括硬件系统和软件系统两大部分

计算机系统硬件系统软件系统主机外设外存储器:软盘、硬盘、光盘、优盘等输入设备:键盘、鼠标、麦克风、扫描仪等输出设备:显示器、打印机、绘图仪、音响等操作系统:DOS、Windows、UNIX、Linux等语言处理程序:C、VisualBasic、Java等数据库管理系统:Oracle、SQLServer、Access等实用程序:系统优化和维护软件、杀毒软件等通用应用软件:办公自动化软件、游戏软件等专用应用软件:为不同企业专门开发设计的软件中央处理器(CPU)运算器控制器只读存储器(ROM)随机存储器(RAM)高速缓冲存储器(Cache)内存系统软件应用软件1.3微型计算机系统微型计算机系统包括硬件系统和软件系统两大部分1.3.1计算机硬件系统1.中央处理器中央处理器由运算器和控制器两大部分构成。运算器可实现算术运算、逻辑运算和其它操作2.存储器存储器是计算机记忆或暂存数据的部件。存储器分为内存储器(内存)和外存储器(外存)两种。内存储器(主存储器),简称内存(主存),通常用内存储器存放待执行或正在运行的程序、数据等。这些信息均以二进制代码的形式保存在存储器中。主存储器通常使用半导体存储器,半导体存储器最基本的存储单位为存储元,每一个基本存储元电路可以存放一位二进制代码,而由若干个基本存储元电路构成一个存储单元,每个存储单元可以存放一位或多位存储元(如1、2、8、16等),每个存储单元都有自己的编号,称为地址,地址也是采用二进制表示的。1.3微型计算机系统内存又分为RAM和ROM,RAM称为随机存取存储器,工作时可随时写入和读出;ROM称为只读存储器,工作时只能读出信息。我们通常称内存容量大小主要指RAM而言。RAM断电时内部的信息不保存,而ROM断电时内部的信息不变。外存储器(辅助存储器),简称外存(辅存),常见的外存储器有磁盘、磁带、光盘、优盘等,大量的、需要永久保存的信息一般都存放在外存中,外存保持信息的方式与内存不同。3.输入输出(I/O)设备输入设备是给计算机输入信息的设备。

输入设备的作用是将各种形式的信息转换为计算机所能识别的形式。目前常用的输入设备有键盘,鼠标,扫描仪等。输出设备的作用是将计算机处理的结果转换为人或其它设备所能识别的形式。如显示器,打印机,绘图仪,投影仪等1.3微型计算机系统1.3.2计算机软件系统

。软件系统是指为运行、管理和维护计算机而编制的各种程序、数据和文档的总称。程序是完成某一任务的指令或语句的有序集合;数据是程序处理的对象和处理的结果;文档是描述程序操作及使用的相关资料。计算机软件按其功能分为应用软件和系统软件两大类。1.系统软件系统软件是指控制计算机的运行,管理计算机的各种资源。系统软件通常包括:操作系统、语言处理程序、数据库管理系统、实用程序。2.应用软件通用应用软件是软件公司或用户为解决某类应用问题而专门研制的软件。例如,AutoCAD绘图软件包、通用财务管理软件包、Office软件包等。1.4计算机语言

计算机语言(ComputerLanguage)指用于人与计算机之间通讯的语言。机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。前两种语言是面向机器的,一般称为低级语言。后一种是面向程序设计人员的,一般称为高级语言。1.4.1机器语言

计算机的硬件设备的组成由一系列的各种门电路、触发器、寄存器、计数器、译码器等电路构成,这些电路工作时具有两种状态,即低电平和高电平,分别用“0”和“1”表示。而计算机所使用的就是由“0”和“1”组成的二进制数,处理的是二进制信息,二进制是计算机语言的基础。写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言,就是机器语言。

1.4计算机语言

例1.1计算机要完成100+256的运算,其机器语言代码为:二进制代码:101110000110010000000000000001010000000000000001101000110000000000100000十六进制代码:B86400050001A30020用机器语言编写的程序有以下优点:(1)计算机能直接识别、执行;(2)算法刻画细致; (3)程序紧凑,占内存空间少,执行速度最快;(4)能充分发挥计算机的硬件功能。缺点:(1)机器语言难记,程序难编,易错,调试困难;(2)通用性差。1.4计算机语言

1.4.2

汇编语言用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“ADD”代表加法,“MOV”代表数据传送等等,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。例1.2

计算机要完成100+256的运算,其汇编语言指令为:

MOVAX,100 ADDAX,256 MOV[2000],AX1.4计算机语言

汇编语言与机器语言比较起来,具有以下优点:(1)程序编制容易、出错机会少、调试容易;(2)算法刻画细致;(3)程序紧凑,占内存空间少,执行速度快;(4)能充分发挥计算机的硬件功能。缺点:(1)计算机不能直接识别、执行,必修经过汇编为机器语言程序;(2)通用性差。1.4计算机语言

1.4.3高级语言

这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。如:FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA等。高级语言的优点:(1)程序编制容易、出错机会少、调试容易;(2)容易表达算法;(3)通用性强。1.4计算机语言

高级语言的缺点:(1)计算机不能直接识别、执行,必修经过编译为机器语言程序;(2)占内存空间大,执行速度慢;(3)不能充分发挥计算机的硬件功能。1.5计算机中数和字符的表示

1.5.1

计算机中有符号数的表示。1.机器数和真值-”号,这种符号数值化之后表示的数称之为机器数,即计算机把有符号数给数值化了, 例如:

N1=+1011010N1=-1011010在计算机表示时,用“0”替换“+”号,用“1”替换“-”号,则上面数值表示为:

N1=01011010N1=11011010将机器数所代表的真正数值称为原来数值的真值。机器数在计算机内有不同的表示方法,常见的机器数有三种表示方法:即原码、反码和补码。1.5计算机中数和字符的表示

2.原码在用二进制原码表示的数中,最高位为符号位,符号位后表示该数的绝对值。(1)对于正数:X=+113,X=+1110001B [+113]原=01110001B(2)对于负数:X=-113,X=-1110001B [-113]原=11110001B其中最高位为符号位,若字长为8位,后面的7位是数值(若字长为16位,则后面15位为数值)。原码表示时,+113和-113的数值位相同,符号位不同。1.5计算机中数和字符的表示

说明:①0的原码有两种表示法:

[+0]原=00000000B [-0]原=10000000B②n位(包括符号位在内)原码的表示范围为:1-2n-1~2n-1-1。例如8位原码表示的范围为:-127~+127。原码表示方法简单易懂,与真值之间转换方便。1.5计算机中数和字符的表示

3.反码在反码表示中,最高位为符号位,正数的反码与原码相同,负数的反码为其正数原码按位求反。(1)对于正数:X=+113,X=+1110001B

[+113]反=01110001B(2)对于负数:X=-113,X=-1110001B[-113]反=10001110B1.5计算机中数和字符的表示

说明:①0的反码有两种表示法:[+0]反=00000000B[-0]反=11111111B②n位反码表示的范围为:1-2n-1~2n-1-1;例如8位反码表示的范围为:-127~+127。③符号位为1时,其后不是该数的绝对值。例如反码11100101B的真值为-27,而不是-101。1.5计算机中数和字符的表示

4.补码在补码表示中,最高位为符号位,正数的补码与原码相同;负数的补码为其正数原码按位求反再加1。(1)对于正数:X=+113,X=+1110001B

[+113]补=01110001B(2)对于负数:X=-113,X=-1110001B [-113]补=10001111B1.5计算机中数和字符的表示

说明:①0的补码只有一种表示法:[+0]=[-0]=00000000B;②n位补码所能表示的范围为-2n-1~2n-1-1;例如8位补码表示的范围为-128~+127。③八位机器数中:[-128]补=10000000B,[-128]原,[-128]反不存在。④符号位为1时,其后不是该数的绝对值。例如:补码11110010B的真值为-14,而不是-114。有符号数采用补码表示时,就可以将减法运算转换为加法运算。因此计算机中有符号数均以补码表示。1.5计算机中数和字符的表示

计算机引入了补码编码后,带来了以下几个优点:(1)减法转化成了加法:这样大大简化了运算器硬件电路的设计,加减法可用同一硬件电路进行处理。(2)运算时,符号位与数值位同等对待,都按二进制参加运算;符号位产生的进位丢掉不管,其结果是正确的,这大大简化了运算规则。1.5计算机中数和字符的表示

1.5.2无符号整数我们把最高有效位也作为数值处理,这样的数称之为无符号整数。8位无符号数表示的范围为:0~255,16位无符号数表示的范围为:0~65535,n位无符号数表示的范围为0~2n-1。计算机中最常用的无符号整数是表示存储单元的地址和外设的地址。1.5.3

BCD(BinaryCodedDecimal)码把由四位二进制数表示一位十进制数的编码称为BCD码,也称为二-十进制编码。最常用的BCD编码,就是使用“0”至“9”这十个数值的二进码来表示。这种编码方式,称之为8421BCD码。

除此以外,对应不同需求,各人亦开发了不同的编码方法除此以外,对应不同需求,各人亦开发了不同的编码方法,以适应不同的需求。这些编码,大致可以分成有权码和无权码两种:有权(每一位都有权值)BCD码,如:8421、2421、5421等。无权BCD码,如:余3码、余3循环码,格雷码等。常见的BCD码与十进制数的表示如表所示

十进制数8421码5421码2421码余3码余3循环码000000000000000110010100010001000101000110200100010001001010111300110011001101100101401000100010001110100501011000101110001100601101001110010011101701111010110110101111810001011111010111110910011100111111001010例1.5把十进制32578转换为8421BCD码表示。

(32578)10=(00110010010101111000)BCDBCD表示有两种基本形式:压缩的BCD码和非压缩的BCD。1.压缩的BCD码它是一种用四位二进制数表示十进制数。首先是用四位二制数表示个数,然后用四位二进制数表示十位,然后百位…。例如:251需要三个四位二进制数表示。1表示为0001;5表示为0101;2表示为0010。最后251的BCD数据表示为001001010001。2.非压缩BCD非压缩的BCD码用8位二进制数表示一个十进制数位,其中低4位是BCD码,高4位是0。例如:十进制数78表示成压缩的BCD码为0000011100001000。除此以外,对应不同需求,各人亦开发了不同的编码方法1.5计算机中数和字符的表示

常用的数制有如下几种:(1)十进制数用D(Decimal)表示;(2)二进制数用B(Binary)表示;(3)八进制数用O(Octal)表示,为了防止O和数字0混淆,也采用Q表示。(4)十六进制数用H(Hexadecimal)来表示。例如:十进制数32D;二进制数1010001B;八进制数345Q;十六进制数3ABH,对应二进制数、八进制数、十六进制数表示时后缀字母不可省略,十进制数后缀D可以省略。除此以外,对应不同需求,各人亦开发了不同的编码方法1.5.5非数值数据的表示1.字符编码使用最多、最普遍的是ASCII字符编码,即美国信息交换标准代码(AmericanStandardCodeForInformationInterchange),字符包括一般字符和可控制符,如表1.4所示。在进行汇编程序设计时应注意以下几点:(1)空格SP的ASCII码为20H,换行LF的ASCII码为0AH或10,回车CR的ASCII码为ODH或13。(2)字符0~9的ASCII码为30H~39H,即相应的数字加上十六进制数30H。数字0~9和对应的ASCII之间的转换只要增减30H就可以了。(3)大写字母A~Z所对应的ASCII码为41H~5AH。小写字母的a~z所对应的ASCII码为61H~7AH.因为大写字母和小写字母的ASCII码的编码也是连续编码,所以只要记住大小写字母A的ASCII码,其它字母的ASCII就可以推出。每个大写字母的ASCII码与对应小写字母的ASCII相差十六进制数20H,所以大小写字母转换只要增减20H就可以。除此以外,对应不同需求,各人亦开发了不同的编码方法2.汉字的编码(1)汉字内码。汉字信息在计算机内部也是以二进制形式存放。国标码规定用两个字节的十六位二进制表示一个汉字每个字节都只使用低7位。由于国标码不能直接存储在计算机内,为方便计算机内部处理和存储汉字,又区别于ASCII码,将国标码中的每个字节在最高位改设为1,这样就形成了在计算机内部用来进行汉字的存储、运算的编码叫机内码(或汉字内码,或内码)。(2)汉字输入码。无论是区位码或国标码都不利于输入汉字,为方便汉字的输入而制定的汉字编码,称为汉字输入码。常见的输入码有以下几类:按汉字的排列顺序形成的编码(流水码):如区位码;按汉字的读音形成的编码(音码):如全拼、简拼、双拼等;按汉字的字形形成的编码(形码):如五笔字型、郑码等;按汉字的音、形结合形成的编码(音形码):如自然码、智能ABC。输入码在计算机中必须转换成机内码,才能进行存储和处理。除此以外,对应不同需求,各人亦开发了不同的编码方法(3)汉字字形码。为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。例:用16×16点阵表示一个汉字,就是将每个汉字用16行,每行16个点表示,一个点需要1位二进制代码,16个点需用16位二进制代码(即2个字节),共16行,所以需要16行×2字节/行=32字节,即16×16点阵表示一个汉字,字形码需用32字节。1.5.6逻辑运算计算机系统中除了算术运算以外,还有逻辑运算,包括:与、或、非和异或运算。这些运算时按位操作,即对应的二进制位进行逻辑操作,而与其它位无关。(1)与”运算(AND):只有当两个变量的值都为1时,结果才为1。(2)“或”运算(OR):两个变量中只要有一个为1,结果就为1(3)“非”运算(NOT):1“非”的结果为0;0“非”的结果为1;(4)“异或”运算(XOR):当两个变量的取值相异时结果为1除此以外,对应不同需求,各人亦开发了不同的编码方法第2章8086CPU汇编程序

设计环境2.18086CPU编程结构2.28086存储器结微机构2.38086的I/O接口2.18086CPU编程结构8086/8088微处理器是Intel公司推出的第三代CPU芯片,它们的内部结构基本相同,内部数据总线都是16位,都采用16位结构进行操作及存储器寻址,但外部性能有所差异,8086是16为微型处理器,CPU与外部进行数据交换数据总线采用16位,而8088是准16为微型处理器,CPU与外部进行数据交换数据总线采用16位,最大寻找空间为1M。两者具有类似的体系结构,指令系统、指令编码格式、寻址方式完全相同,两种处理器都封装在相同的40脚双列直插组件(DIP)中。8086/8088CPU编程结构是指从程序员和使用者的角度看到的结构,亦可称为功能结构,其内部结构如图所示。AHALBHBLCHCLDHDL通用寄存器SPBPSIDI数据寄存器指针和变址寄存器内部数据总线(16位)运算寄存器EU控制电路AXBXCXDX标志寄存器执行单元(EU)总线接口单元(BIU)123456指令队列缓冲器(8位)内部寄存器IPESSSDSCSALU∑DB(16位)AB(20位)输入输出控制电路8086总线DB(16位)20位地址加法器按功能可分为两部分:执行单元EU(ExecutionUnit)和总线接口单元BIU(BusInterfaceUnit)。2.1.1执行单元EU执行单元包括算术逻辑单元(ALU),状态标志寄存器(FLAGS),一组通用寄存器组和相应的控制电路,所有寄存器都是16位的,执行单元不直接与外设交换信息,它通过总线接口单元接收指令和数据,可以进行8位和16位算术运算、逻辑运算和移位操作等。2.1.2总线接口单元BIU总线接口单元BIU的功能是负责CPU与存储器、I/O的信息传送。具体功能是根据段寄存器CS和指令指针IP形成的20位物理地址从存储器中取出指令,并暂存在指令队列中,等待执行单元EU取走并执行。总线接口单元由一个指令队列,一组段寄存器(DS、CS、ES、SS),一个指令指针寄存器(IP),地址加法器组成。地址加法器根据EU的请求,形成20位的实际物理地址,完成CPU与存储器或I/O接口的数据交换。8086CPU的指令队列为6个字节(8088为4字节),在执行指令的同时,可从内存中取出后续的指令代码,放在指令队列中,可以提高CPU的工作效率。BIU与EU的动作协调原则:总线接口部件(BIU)和执行部件(EU)按以下流水线技术原则协调工作,共同完成所要求的信息处理任务:(1)每当8086的指令队列中有两个空字节,或8088的指令队列中有一个空字节时,BIU就会自动把指令取到指令队列中。其取指的顺序是按指令在程序中出现的前后顺序。(2)每当EU准备执行一条指令时,它会从BIU部件的指令队列前部取出指令的代码,然后用几个时钟周期去执行指令。在执行指令的过程中,如果必须访问存储器或者I/O端口,那么EU就会请求BIU,进入总线周期,完成访问内存或者I/O端口的操作;如果此时BIU正好处于空闲状态,会立即响应EU的总线请求。如BIU正将某个指令字节取到指令队列中,则BIU将首先完成这个取指令的总线周期,然后再去响应EU发出的访问总线的请求。(3)当指令队列已满,且EU又没有总线访问请求时,BIU便进入空闲状态。(4)在执行转移指令、调用指令和返回指令时,由于待执行指令的顺序发生了变化,则指令队列中已经装入的字节被自动消除,BIU会接着往指令队列装入转向的另一程序段中的指令代码。

总线接口单元由一个指令队列,一组段寄存器(DS、CS、ES、SS),一个指令指针寄存器(IP),地址加法器组成。地址加法器根据EU的请求,形成20位的实际物理地址,完成CPU与存储器或I/O接口的数据交换。8086CPU的指令队列为6个字节(8088为4字节),在执行指令的同时,可从内存中取出后续的指令代码,放在指令队列中,可以提高CPU的工作效率。2.1.38086/8088内部寄存器8086/8088内部的寄存器可以分为通用寄存器和专用寄存器两大类,专用寄存器包括IP、SP和FLAGS三个16位寄存器。1.通用寄存器数据寄存器、指针寄存器和变址寄存器统称为通用寄存器。数据寄存器主要用于保存操作数运算结果等信息,有四个16位的数据寄存器AX,BX,CX,DX可分解成八个独立的8位寄存器,这八个8位的寄存器有各自的名称,分别称为AH,AL,BH,BL,CH,CL,DH,DL,并且均可以独立存取。名称中的字母H表示高,L表示低。如AL表示低8位,AH表示高8位,AH寄存器和AL寄存器的合并就是AX寄存器,其他寄存器类推。即低位字节的寄存器分别称作AL、BL、CL和DL,高位字节的寄存器分别称作AH、BH、CH和DH。AX和AL寄存器又称为累加寄存器(Accumulator)。一般通过累加器进行的操作所用的时间可能最少,此外累加器还有许多专门的用途,所以累加器使用的最普遍。BX寄存器成为基(Base)地址寄存器。他是四个寄存器中唯一可作为存储器基址指针使用的寄存器。CX寄存器称为计数(Count)寄存器。在字符串操作和循环操作时,用它来控制重复循环操作次数。在一位操作时,CL寄存器用于保存移位的位数。DX寄存器称为数据(Data)寄存器。在进行32位的乘除法操作时,用它存放被除数的高16位或余数。它也用于存放I/O端口地址。变址寄存器(SI、DI)和指针寄存器(BP、SP)主要用于存放某个存储单元的偏移地址,或某组存储单元开始地址的偏移量,即作为存储器(短)指针使用。作为通用寄存器,它们也可以保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是需要的存储单元地址的偏移量。注意,16位的变址寄存器和指针寄存器不能分解成8位寄存器使用。SI和DI寄存器在字符串操作中,规定由SI给出源串指针,由DI给出目的串指针,所以SI也称为源变址(SourceIndex)寄存器,DI也称为目的变址(DestinationIndex)寄存器。BP和SP寄存器在对堆栈操作时,BP主要用于给出堆栈中数据区基址的偏移地址,从而方便的实现直接存取堆栈中的数据,所以BP也称为基指针(BasePointer)寄存器。正常情况下,SP只作为堆栈指针(StackPointer)使用,即保存堆栈栈顶地址的偏移。2.段寄存器8086/8088CPU依赖其内部的四个段寄存器实现寻址1M字节的物理地址空间。8086/8088把1M字节地址空间分成若干逻辑段,当前使用段的起始地址(段基址)存放在段寄存器中。由段基址和段内偏移地址形成20位地址,我们将在下节详细介绍形成20位地址的具体方法。8086/8088CPU的四个段寄存器均是16位的,分别称为代码段(CodeSegment)寄存器CS,数据段(DataSegment)寄存器DS,堆栈段(StackSegment)寄存器SS,附加段(ExtraSegment)寄存器ES。段寄存器主要解决20位地址形成和程序中指令代码与数据分开存放,除CS是用于指示指令代码的地址空间之外,其它段寄存器都用于指示数据的地址空间。3.指令指针寄存器IP8086/8088CPU中的指令指针寄存器IP(InstructionPointer)也是16位的,它给出将要从主存中取出指令在代码段中的偏移地址,其值为该指令到所在段基址的字节距离。OFDFIFTFSFZFAFPFCF进借位标志奇偶标志半进借位标志零标志符号标志单步中断中断允许方向标志溢出标志1-有进、借位0-无进、借位1-低4位向高4位有进、借位0-低4位向高4位无进、借位1-结果为00-结果不为04.标志寄存器FLAGS标志寄存器又称为程序状态字寄存器(programstatusword,PSW)。各标志在标志寄存器中的位置如下所示:有些指令的执行受某些标志的影响,有些指令的执行不受标志的影响。所以,程序员要充分注意指令与标志的关系。9个标志可分成两组,第一组6个标志主要受算术运算和逻辑运算结果的影响,称为运算结果标志,第二组标志不受运算结果的影响,称为状态控制标志。(1)运算结果(状态)标志位OF(OverflowFlag)溢出标志:在运算过程中,如操作数超出了机器能表示的范围,则称为溢出。此时OF位置1,否则置0。SF(SignFlag)符号标志:记录运算结果的符号,结果为负时置1,否则置0。ZF(ZeroFlag)零标志:运算结果为0时ZF位置1,否则置0。CF(CarryFlag)进位标志:记录运算时有效位产生的进位值。例如,执行加法指令时,最高有效位有进位时置1,否则置0。AF(AuxiliarycarryFalg)辅助进位标志:记录运算时第3位(半个字节)产生的进位值。例如,执行加法指令时第3位有进位时置1,否则置0。PF(ParityFlag)奇偶标志:用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。2)控制标志位 DF(DirectionFlag)方向标志:在串处理指令中控制处理信息的方向用。当DF位为1时,每次操作后是变址寄存器SI和DI减量,这样就是串处理从高地址向低地址方向处理。当DF为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理。8086/8088提供的专门用于设置方向标志DF的指令是STF,专门用于清除DF的指令时CLD。IF(InterruptFlag)中断向量:当IF为1时,允许中断,否则关闭中断。8086/8088提供的专门用于设置中断允许标志IF的指令是STI,专门用于清IF的指令是CLI。TF(TrapFlag)追踪标志:用于单步操作方式,当追踪标志TF被置1后,CPU进入单步方式。所谓单步方式是指在一条指令执行后,产生一个单步中断,这主要用于程序的调试。8086/8088没有专门设置和清除TF标志的指令,用通过其他方法设置或清除TF。2.28086微机存储器结构2.2.1存储单元的地址和内容计算机存储器以字节为单位存储信息,为了正确的存放或取得信息,每一个字节单元给以一个存储器地址。地址从0开始编号,顺序地每次加1。在机器里,地址也是用二进制数来表示的,它是无符号整数,为了书写和编程方便地址格式一般采用十六进制数表示。从图中可以看到,地址为1001H的字节存储单元中的内容是34H,而地址为200AH的字节存储单元中的内容是78H。分别记为:

(1000H)=33H (200AH)=78H存储器地址┇┇33H1000H34H1001H35H1002H36H10033H┇┇78H200AH89H200BH┇┇8086微机的字长为16位,由2个字节组成一个字,分成低位字节和高位字节。一个字存放到存储器要占用连续的两个字节单元,系统规定,当把一个字节存放到存储器时,其低字节存放在低地址的字节单元中,其高字节存放在高地址的字节单元中。这样二个连续的字节单元就构成了一个字单元,字单元的地址采用它的低地址表示。例如,图中地址1000H的字单元的内容是3433H,而地址为200AH单元的内容是8987H。分别记为:

(1000H)=3433H (200AH)=8978H上述存储原则称为“高高低低”原则。在以字节方式存取字时需要特别注意该原则,当以字方式存取字时,处理器自动采用该原则。2.2.2存储器的分段技术

8086/8088CPU有20根地址线,可直接寻址的物理地址空间为1M字节(=220)。系统存储器由以字节为单位的存储单元组成,存储单元的物理地址由20位二进制数表示,范围是00000H至FFFFFH。而8086/8088内部的ALU每次最多进行16位运算,存放存储单元地址偏移量的指针寄存器(如IP、SP以及BP、SI、DI和BX)都是16位,为了寻址1M的所有单元,8086/8088通过对存储器采用分段技术的方法有效地实现了寻址1M字节物理地址空间。所谓分段技术就是根据需要把1M字节地址空间划分成若干逻辑段。每个逻辑段必须满足如下两个条件:第一,逻辑段的开始地址必须是16的倍数;第二,逻辑段的最大长度为64K,最多有16个逻辑段。按照这两个条件,1M字节地址空间最多可划有64K个逻辑段的起始地址。第一个条件与段寄存器长16位有关;第二个条件与指针寄存器长16位相关。根据编程的需要,由计算机为每一个段规定一个起始地址,即该段的首地址,称为段基址。位于段起始单元的地址应被16整除,它的20位二进制表示的地址的最低4位一定为0,高16位地址放在段寄存器中。每个逻辑段的段内地址是连续的,逻辑段与逻辑段可以相连,也可以不相连,还可以部分重叠。一个程序使用的存储空间可以是一个逻辑段,也可以是多个逻辑段。一般为数据段、代码段、堆栈段和附加段。每个段的起始地址(段的首地址、段的基本地址、段基址)放在对应的段寄存器(DS、CS、SS、ES)中。段寄存器(DS、SS、ES)的内容可以在程序中用数据传送指令设置初值或改变其值,CS的初值不允许用传送指令赋值,CS值的改变只能在段间调用、段间返回、段间转移、中断指令或发生中断时由计算机系统改变。2.2.3物理地址的形成由于段的起始地址必须是16的倍数,所以20位段起始地址有如下形式:

xxxxxxxxxxxxxxxx0000(二进制)用16进制可表示成XXXX0(十六进制)。我们把20位段起始地址的高16位XXXX(十六进制)称为段基址。显然,段起始地址等于段基址乘16(即左移4位)。要访问的某一个存储单元总是属于某个段。我们把存储单元的地址与所在段的起始地址的差称为段内偏移地址,简称偏移地址(偏移量)。在一个段内,通过偏移量可指定要访问的存储单元。在整个1M地址空间中,存储单元的物理地址等于段的起始地址加上偏移量。于是,存储单元的逻辑地址由段基址和偏移量两部分组成,用如下形式表示: 逻辑地址=段基址:偏移量例如:2000H:0080H。根据逻辑地址可方便地得到存储单元的物理地址(实际地址),计算公式如下: 物理地址=段基址×16+偏移量通过移位和算术加法可容易地实现上述公式,例2.1写出逻辑地址2BH:23H和逻辑地址2CH:13H所对应的物理地址逻辑地址2BH:23H的物理地址为:

2B0H+23H=2D3H

逻辑地址2CH:13H的物理地址为:

2C0H+13H=2D3H指令中不使用物理地址,而是使用逻辑地址。2.38086的I/O接口2.3.1输入/输出(I/O)接口主机与外界交换信息称为输入/输出(I/O)。主机与外界的信息交换是通过输入/输出设备进行的。一般的输入/输出设备都是机械的或机电相结合的产物,比如常规的外设有键盘、显示器、打印机、扫描仪、磁盘机、鼠标器等,它们相对于高速的中央处理器来说,速度要慢得多。此外,不同外设的信号形式、数据格式也各不相同。因此,外部设备不能与CPU直接相连,需要通过相应的电路来完成它们之间的速度匹配、信号转换,并完成某些控制功能。通常把介于主机和外设之间的一种缓冲电路称为I/O接口电路,简称I/O接口(Interface)。

2.3.2输入/输出(I/O)端口每个接口电路中都包含一组寄存器,CPU和外设进行信息交换时,各类信息在接口中存入不同的寄存器,一般称这些寄存器为I/O端口,简称为口(Port)。用来保存CPU和外设之间传送的数据(如数字、字符及某种特定的编码等)、对输入/输出数据起缓冲作用的数据寄存器称为数据端口;用来存放外设或者接口部件本身状态的状态寄存器称为状态端口;用来存放CPU发往外设的控制命令的控制寄存器称为控制端口。正如每个存储单元都有一个物理地址一样,每个端口也有一个地址与之相对应,该地址称为端口地址。有了端口地址,CPU对外设的输入/输出操作实际上就是对I/O接口中各端口的读/写操作。接口和端口是两个不同的概念,若干个端口加上相应的控制电路才构成接口。2.3.2输入/输出(I/O)端口的编址8086/8088微型计算机系统I/O端口与内存单元采用独立编址的方式。

在这种编址方式中,建立了两个地址空间,一个为内存地址空间,一个为I/O地址空间。内存地址空间和I/O地址空间是相对独立的,通过控制总线来确定CPU到底要访问内存还是I/O端口。为确保控制总线发出正确的信号,除了要有访问内存的指令之外,系统还要提供用于CPU与I/O端口之间进行数据传输的输入/输出指令。在8086/8088系统中,共有20根地址线对内存寻址,内存的地址范围是00000H~FFFFFH;用地址总线的低16位对I/O端口寻址,所以I/O端口的地址范围从0000H~FFFFH。CPU在访问内存和外设时,使用了不同的控制信号来加以区分。

汇编语言程序设计第1章概述第2章8086CPU汇编程序设计环境第3章8086微处理器的指令系统第4章8086汇编语言第5章8086汇编语言基本程序设计第6章输入/输出程序设计第7章32位汇编语言

第3章

8086微处理器的指令系统3.18086CPU的寻址方式3.28086指令系统3.18086CPU的寻址方式微机中的每条指令由两部分组成:操作码字段和地址码字段操作码字段:指示计算机所要执行的操作,即指令操作的性质。比如加、减运算等。操作数字段(地址码):指出在指令执行操作中所需要的操作对象信息,它既可以是操作数本身,也可以是操作数地址或地址的一部分,还可以是指向操作数地址的指针或其他有关操作数的信息。3.1.1操作数的种类指令中操作数的种类有:(1)立即操作数:指令要操作的数据在指令代码中,称此数据为立即数。(2)存储器操作数:指令要操作的数据在存储器(内存)中,称此数据为存储器操作数。(3)寄存器操作数:指令要操作的数据在CPU的寄存器中,称此数据为寄存器操作数。(4)I/O端口操作数:操作的数据在I/O端口中,称此数据为I/O端口操作数。在8086/8088微机汇编指令中,操作数有零个、一个和两个三种形式。对于有两个操作码的指令,一个称为源操作数,该操作数在指令执行过程中不改变原值。另一个称为目标(目的)操作数,该操作数指令执行后一般被其结果替代。对应只有一个操作数的指令,该操作数为源操作数或为目标操作数。3.1.2与数据有关指令的寻址方式1.立即寻址方式操作数就包含在指令中,它作为指令的一部分,跟在操作码后存放在代码前。这种操作数称为立即数。立即数可以是8位,也可以是16位,如果操作数位16位,操作数代码在存储器单元中存放时按照低地址存放低字节,高地址存放高字节的原则。

操作数(为一常数)直接由指令给出

(此操作数称为立即数)

立即寻址只能用于源操作数2.寄存器寻址方式操作数在CPU内部的寄存器中,指令中指定寄存器号。对于16位操作数,寄存器可以是AX、BX、CX、DX,SI、DI、SP和BP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。3.直接寻址方式操作数在存储器中,指令直接包含有操作数的有效地址(EA)。EA=偏移量操作数一般存放在数据段,所以操作数的地址由DS加上指令中直接给出的16位偏移量得到。如果采用段超越前缀,则操作数也可含在数据段外其他段中。例:设数据段寄存器DS中的内容为1000H,偏移量1234H的字存储单元中的内容为5678H,那么在执行指令“MOVAX,[1234H]”后寄存器AX的内容是5678H,图3.4是此指令的存储和执行情况。例3.3TABLE是在数据段定义的一个字节数组的首地址的变量名,其偏移量为1000H,则指令

MOVAL,TABLE 或MOVAL,[TABLE]或MOVAL,[1000H]上述三种表示方式操作结果相同,一般常用第一种方式表示。4.寄存器间接寻址方式操作数在存储器中,操作数的有效地址在SI、DI、BX和BP这四个寄存器之一中,在一般情况(即不使用段跨越前缀明确指定段寄存器)下,如果有效地址在SI、DI和BX中,则默认以DS段寄存器的内容为段基址;如果有效地址在BP中,则默认以SS段寄存器的内容为段基址。例3.4假设(DS)=2000H,(SI)=1234H,字存储单元(21234H)=5678H,则执行指令MOVAX,[SI]后,AX的内容为5678H。下图表示该指令的存储和执行情况。如果操作数的有效地址不是在默认的数据段中,需要用段跨越前缀指明。例BX表示的是堆栈段的偏移量,为了存取堆栈段中的内容,使用下面指令的寄存器间接寻址表示:

MOVDL,SS:[BX];引用的段寄存器是SS注意在书写表示寄存器间接寻址时,寄存器名一定要放在方括号中

5.寄存器相对寻址操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器的(SI、DI)内容加上指令中给定的8位或16位位移量之和。即:EA=基址寄存器(或变址寄存器)的内容+8位(或16位)位移量有效地址EA的构成有四种组合: ①(BX)+8位(或16位)位移量 ②(BP)+8位(或16位)位移量 ③(DI)+8位(或16位)位移量 ④(SI)+8位(或16位)位移量在一般情况下,如果SI、DI或BX的内容作为有效地值的一部分,那么引用的段寄存器默认是DS;如果BP的内容作为有效地值的一部分,那么引用的段寄存器默认是SS。在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如位移量是8位,则被符号扩展成16位。例3.5假设

(DS)=2000H,(DI)=1234H,字存储单元(23234H)=3456H,则执行指令MOVAX,[DI+2000H]后,AX的内容为3456H。下图表示该指令的存储和执行情况。注意书写时基址寄存器名或变址寄存器名一定要放在方括号中,而位移量可不写在方括号中。下面两条指令源操作数的寻址方式是相同的,表示的形式等价。

MOVAX,[BX+10]MOVAX,10[BX]

也可以用基址寄存器或变址寄存器与单元变量名的组合来表示寄存器相对寻址,设VAR为单元的变量名,有如下表示:

MOVAX,[BX+VAR]

MOVAX,VAR[BX]6.基址变址寻址方式操作数在存储器中,操作数的有效地址由基址寄存器的内容与变址寄存器的内容相加得到。即:

EA=基址寄存器的内容(BX、BP)+变址寄存器(DI、SI)的内容有效地址EA的构成有四种组合:①(BX)+(DI)②(BX)+(SI)③(BP)+(DI)④(BP)+(SI)在一般情况(即不使用段跨越前缀明确指定段寄存器)下,如果BP的内容作为有效地址的一部分,则默认SS的内容为段基址,否则默认DS的内容为段基址。例3.6假设(DS)=1000H,(BX)=1234H,(DI)=2000H,字存储单元(13234H)=4567H,则执行指令MOVAX,[BX+DI]后,(AX)=4567H。下图表示该指令的执行情况。下面指令中,源操作数采用基址变址寻址,通过段前缀来引用段寄存器ES。

MOVAX,ES:[BX+SI]这种寻址方式适用于数组或表格处理。用基址寄存器存放数组首地址,而用变址寄存器来定位数组中的各元素,或反之。由于两个寄存器都可以改变,所以能更加灵活的访问数组或表格中的元素。下面的二种写法方法是等价的。

MOVAX,[BX+DI]MOVAX,[DI][BX]7.相对基址变址寻址操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容与指令中给定的8位或16位位移量相加得到。也即:EA=基址寄存器的内容+变址寄存器的内容+8位(或16位)位移量有效地址EA的构成有四种组合:①(BX)+(DI)+8位(或16位)位移量②(BX)+(SI)+8位(或16位)位移量③(BP)+(DI)+8位(或16位)位移量④(BP)+(SI)+8位(或16位)位移量在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如果位移量是8位,那么被带符号扩展成16位。例3.7假设(DS)=1000H,(BX)=1234H,(DI)=3000H,字存储单元(14232H)=7890H,则执行指令MOVAX,[BX+DI-2]后,(AX)=7890H。下图表示该指令的存储和执行情况,位移用补码表示

相对基址加变址寻址这种寻址方式的表示方法多种多样,下面四种表示方法是等价的。

MOV AX,[BX+DI+1234H] MOVAX,1234H[BX+DI]

MOVAX,1234H,[BX][DI]

MOVAX,1234H[DI][BX]

注意后5种寻址方式都与存储器单元有关,在寻址过程中都要计算存储器单元的有效地址EA,所以它们有时统称为存储器寻址,只是寻址方式不同,得到有效地址EA的方法不同。3.1.3与指令有关的寻址方式与指令有关的寻址方式主要如何去查找下一条将要执行指令的地址。程序正常顺序执行时,每取一条指令执行(IP)+n→(IP),其中n为当前正在执行指令的字节数,下一条将要执行指令的物理地址为: 物理地址=(CS)*16+(IP)根据转移时是否重置代码段寄存器CS的内容,它们又可分为段内转移和段间转移两大类。段内转移是指仅重新设置指令指针IP的转移;段间转移是指不仅重新设置IP,而且重新设置代码段寄存器CS的转移,由于重置CS,所以转移后继续执行的指令在另一段中。无论是段内转移还是段间转移都有直接和间接两种方式,因此有四种转移的寻址方式。1.段内直接寻址转移的有效地址EA是指令中的8位或16为位移量与当前指令指针寄存器IP内容之和,取代当前的IP中的内容。转移的有效地址为:

EA=(IP)+8位或16为位移量→IP当转移的位移量为8位时,EA的转移范围在-128至+127,地址差值只要用一个字节表示,就称为短转移;当转移的位移量为16位时,EA的转移范围在-32768~32767,地址差要用一个字表示,就称为近转移。注意如果短转移以当前执行的转移指令本身的IP为基准,那么短转移的范围则在-126至+129之间;如果短转移以当前执行的转移指令执行完成后的IP为基准,那么短转移的范围则在-128至+127之间,近转移同样如此。短转移和近转移都是相对IP的内容而言,又称相对转移寻址。2.段内间接寻址转移的有效地址EA如果指定的是16位寄存器或字存储单元中的内容表示,则将寄存器或字存储单元的内容取代当前的IP中的内容。转移的有效地址为:EA=16位寄存器或字存储器单元的内容→IP即如果EA由16寄存器给出,则将寄存器的内容替代IP的内容;如果是存储器寻址,将使用存储器的数据寻址方式获得的EA所指定的字存储单元的内容作为转移偏移地址替代IP的内容,将CS的内容乘以16与IP的内容相加得到实际的指令转移地址。3.段间直接寻址该种寻址方式不仅用指令中直接提供的转移偏移地址EA替代IP的内容,而且指令同时直接提供了指令转移目标所在的段基址替代当前CS的内容,实现程序从一个段到另一个段的转移。4.段间间接寻址该种寻址方式是根据存储器的数据寻址方式获得EA,将EA所指定的双字存储单元的内容的替代当前的IP和CS值,即将第一个存储字单元内容替代IP的内容,将第二个存储字单元内容替代CS的内容。注意段内转移的寻址方式只改变IP的内容,而不改变当前段寄存器CS中的内容,即实现段内的64KB范围内的转移;而段间转移的寻址方式不仅改变IP的内容,而且改变当前段寄存器CS的内容,实现段和段之间的转移,转移范围超出64K范围以外,对8086微机而言,可以实现1M范围的任意位置的转移。3.28086指令系统8086/8088的指令系统可分为如下六个功能组: (1)数据传送指令; (2)算术运算指令; (3)逻辑运算指令; (4)串处理指令; (5)程序转移指令; (6)处理机控制与杂项操作指令。对于每一条指令,在学习过程中重点注意以下几点:1)指令的功能和操作过程;2)适用于指令的操作数寻址方式;3)指令对标志的影响;4)使用说明。3.2.1数据传送指令8086/8088有4类传送指令,分别是:①通用传送指令,②累加器专用传送指令,③地址传送指令,④标志传送指令。数据传送指令共有12条:MOV、PUSH、POP、XCHG、XLAT、LEA、LDS、LES、LAHF、SAHF、PUSHF、POPF1.传送指令MOV(move)

指令格式:MOVDEST,SRC

操作:此指令把一个字节或一个字从源操作数SRC送至目标操作数DST。

DEST←(SRC)

受影响的状态标志位:没有说明:(1)指令中DEST和SRC不能同时为存储器操作数(同时为存储器寻址方式得到的操作数,串操作指令除外);(2)CS不能做为目标操作数使用(适合所有指令);(3)段寄存器之间不能互相传送,立即数不能直接送入段寄存器,只能间接传送;(4)要求传送数据的类型一致,即8位之间传送或16位之间传送;(5)立即数永远不能作为目标操作数(适合所有指令);(6)指令指针IP不能作为寄存器使用;(7)两操作数不能同时为立即数。 以上这些说明规定不仅适用于MOV指令,也同样适用于所有涉及到操作数的指令。

例3.8 MOVAH,AL MOVBP,AX MOVAX,CS MOVAL,12H MOVSI,-5 MOVVAR1,123;VAR1是变量名,代表一个存储单元

MOVVAR2,3456H ;VAR2是一个字变量

MOV[SI],6543H如果要在两个存储单元件传送数据,那么可利用通用寄存器过渡的方法进行。例把字变量VAR1的内容送到字变量VAR2中,指令如下:

MOVAX,VAR1 MOVVAR2,AX这种利用通用寄存器间接传送的方法,可以实现段寄存器间的数据传送。例:MOVAX,CS;把CS的内容送到DS MOVDS,AX以下的指令是不正确的。MOV

BL,AX ;操作数的类型不一致MOV

ES,DS ;段寄存器之间不能互相传送MOV

CS,AX ;不能为CS传送数据MOV

DS,100H ;立即数不能直接送入段寄存器MOV

100H,AX ;立即数不能为目的操作数

MOV

VAR1,VAR2;两个操作数不能同时为存储器操作数

MOV[SI],[DI] ;同上2.进栈指令PUSH(pushwordontostack)指令格式:PUSH SRC

操作:(1)堆栈指针寄存器减2 SP←SP-2(2)将给定的操作数存放到由SP指出的栈顶中。

(SP+1,SP)←(SRC)

受影响的状态标志位:没有 说明:PUSH指令的目标地址一定在当前堆栈中。SS内容为段基址,偏移量由堆栈指针寄存器SP给u出。操作数一定是16位的寄存器或存储器操作数。例3.10设当前(SS)=2000H,(SP)=00FEH,执行下列指令:

MOV AX,1234H PUSH AX指令执行后(SS)=2000H,(SP)=00FCH,指令执行过程如图所示。3.出栈指令POP(popwordoffstackintodestination)指令格式:POP DEST操作:(1)将堆栈栈顶中存放的字传送到操作数中。

DEST←(SP+1,SP)(2)堆栈指针寄存器加2 SP←SP+2受影响的状态标志位:没有说明:目标操作数只能是16位的存储器单元或寄存器操作数(CS除外)。例3.11设当前(SS)=2000H,(SP)=00FEH,(200FEH)=5678H,执行下列指令:

MOV CX,1234H POP CX指令执行后(CX)=5678H,指令执行过程的堆栈变化如图所示。除此以外,对应不同需求,各人亦开发了不同的编码方法 4.交换指令XCHG(exchange)指令格式:XCHG DEST,SRC

操作:DEST的内容与SRC的内容互换。

(DEST)←→(SRC)受影响的状态标志位:没有说明:(1)DEST和SRC不能同时为存储器操作数,必须有一个为寄存器操作数;(2)不允许使用段寄存器;(3)可以为立即数之外的任意寻址方式。除此以外,对应不同需求,各人亦开发了不同的编码方法例3.12设(AX)=1234H,(BX)=4567H,则执行指令XCHGAX,BX后,(AX)=4567H,(BX)=1234H。如果不采用交换指令,实现上述操作,则需要三条指令即:

MOVDX,AXMOVAX,BXMOVBX,DX 5.换码指令XLAT指令格式:XLAT

操作:首先将BX中的内容与AL的内容之和作为操作的存储单元的有效地址,然后将该地址单元中的内容送到AL中。

AL←((BX)+(AL))受影响的状态标志位:没有说明:XLAT指令主要用于查表。表的起始地址即表头地址由BX给出,AL中的操作前的内容是要寻址的表中相对于表头起始地址的位移量,规定表中第一个字节的位移量为0。操作结果是把AL的内容作为相对于BX给出表头地址的偏移量所指定单元中的内容送入AL中,BX是基址寄存器,AL是变址寄存器,所以该指令相当于基址变址寻址方式,主要用于代码转换,如字符和对应的ASCII码之间的转换等。

除此以外,对应不同需求,各人亦开发了不同的编码方法例3.13设(DS)=2000H,在TABLE表中存放0~9的ASCII码,若(AL)=3,则通过下列指令可取得3的ASCII码:MOVBX,OFFSETTABLE ;取TABLE变量的偏移地址,(BX)=0040HMOVAL,3XLAT指令执行后(AL)=33H,指令执行过程的操作如图所示。除此以外,对应不同需求,各人亦开发了不同的编码方法6.取有效地址指令LEA(loadeffectiveaddress)

指令格式:LEA DEST,SRC操作:将指令中给出的存储器操作数的有效地址(即地址的偏移量)送到指定的寄存器中。

DEST←EA受影响的状态标志位:没有说明:LEA指令是将源操作数的偏移地址,即有效地址传送到目标操作数中。源操作数必须是一个存储器操作数,即SRC是除立即数和寄存器外的任意一种寻址方式,目标操作数可以是任一16位通用寄存器,该指令通常用来建立串操作指令所须的寄存器指针。

除此以外,对应不同需求,各人亦开发了不同的编码方法7.加载数据段寄存器指令LDS(loaddatasegmentregister)

指令格式:LDSDEST,SRC操作:完成一个地址指针的传送。地址指针包括数据段的段基址和偏移地址。

(1)将双字长存储器操作数中的低地址字传送到指定的寄存器DEST中。

(2)将双字长存储器操作数中的高地址字传送到DS寄存器中。

DEST←(EA),DS←(EA+2)受影响的状态标志位:没有说明:LDS是将SRC指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基址,LDS指令将其传送到数据段寄存器DS中,低位字为偏移地址,传送到由DEST指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器除此以外,对应不同需求,各人亦开发了不同的编码方法8.加载附加段寄存器指令LES(loaddatasegmentregister)

指令格式:LES DEST,SRC操作:完成一个地址指针的传送。地址指针包括附加段的段基址和偏移地址。

(1)将双字长存储器操作数中的低地址字传送到指定的寄存器DEST中。

(2)将双字长存储器操作数中的高地址字传送到ES寄存器中。

DEST←(EA),ES←(EA+2)受影响的状态标志位:没有说明:LES是将SRC指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基址,LES指令将其传送到附加段寄存器ES中,低位字为偏移地址,传送到由DEST指出的一个通用寄存器,指针寄存器或变址寄存器中,但不能是段寄存器。除此以外,对应不同需求,各人亦开发了不同的编码方法9.取标志指令LAHF(loadAHfromflags)

指令格式:LAHF操作:标志寄存器低8位的状态标志位填写在AH寄存器的相应位中。

AH←SF:ZF:×:AF:×:PF:×:CF 受影响的状态标志位:没有说明:此指令在80x86中几乎无用,主要是为了保证与8080/8085向下兼容,才保留了该指令。除此以外,对应不同需求,各人亦开发了不同的编码方法10.存标志指令SAHF(storeAHintoflags)

指令汇编格式:SAHF操作:将AH寄存器中的相应位传送到状态标志寄存器相应位中。

SF:ZF:×:AF:×:PF:×:CF←AH受影响的状态标志位:SF,ZF,AF,PF,CF说明:此指令在80x86中几乎无用,主要是为了保证与8080/8085向下兼容,才保留了该指令。例3.14执行如下指令

MOVAH,0CH SAHF指令执行后CF=1,PF=0,

温馨提示

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

评论

0/150

提交评论