ch02 汇编语言基础C_第1页
ch02 汇编语言基础C_第2页
ch02 汇编语言基础C_第3页
ch02 汇编语言基础C_第4页
ch02 汇编语言基础C_第5页
已阅读5页,还剩371页未读 继续免费阅读

下载本文档

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

文档简介

第二章

汇编语言基础

第二章汇编语言基础2.1

汇编语言概述2.2

8086/8088微处理器编程结构

2.3

汇编语言上机调试2.4

汇编语言源程序组织2.5

汇编语言中的操作数2.68086/8088寻址方式2.78086/8088指令系统2.8基本I/O功能调用机器语言BASICC/C++JAVA...汇编语言高级语言2.1汇编语言概述计算机程序设计语言机器语言(MachineLanguage)A0102002061120A21220汇编语言(AssemblyLanguage)MOVAL,[2010H]ADDAL,[2011H]MOV[2012H],AL高级语言(High-levelLanguage)

二进制编码的机器指令用助记符表示的指令类似自然语言和数学描述语言什么是汇编语言以助记符形式表示计算机指令助记符是便于人们记忆、并能描述指令功能和指令操作数的符号助记符是表明指令功能的英语单词或其缩写汇编格式指令以及使用它们编写程序的规则就形成汇编语言(AssemblyLanguage)汇编语言程序:用汇编语言书写的程序汇编程序:将汇编语言程序“汇编”成机器代码目标模块的程序

汇编语言程序与汇编程序是两个概念汇编语言的特点汇编语言的优点:使用助记符表示的指令,易于编写、调试和维护直接控制计算机硬件部件编写“时间”和“空间”两方面最有效程序汇编语言的缺点:与处理器密切有关需要熟悉计算机硬件系统、考虑许多细节编写繁琐,调试、维护、交流和移植困难汇编语言和高级语言的混合编程汇编语言的优点使得它在程序设计中占有重要的位置,不可被取代汇编语言的缺点使得人们主要采用高级语言进行程序开发工作有时需要采用高级语言和汇编语言混合编程,互相取长补短,更好地解决实际问题混合编程取长补短汇编语言的应用场合(1)对软件的执行时间或存储容量有较高要求的场合。操作系统核心程序,智能化仪器仪表的控制系统,实时控制系统等(2)需要提高大型软件性能的场合。通常把大型软件中执行频率高的子程序(过程)用汇编语言编写,然后把它们与其他程序一起连接。(3)软件与硬件关系密切,软件需要直接和有效控制硬件的场合。如设备驱动程序,I/O接口电路的初始化程序段等。(4)没有合适的高级语言的场合或只能采用汇编语言的时候。开发最新的处理器程序时,暂时没有支持新指令的编译程序。(5)其它,如系统的底层软件、加密解密软件、分析和防治计算机病毒软件等。2.28086/8088微处理器编程结构编程结构:是指从程序员和使用者的角度看到的结构,与芯片内部的物理结构和实际布局有区别。2.2.18086/8088的功能结构2.2.28086/8088的存储器组织2.2.38086/8088的寄存器结构

两大独立部分:BIU(BusInterfaceUnit)

总线接口单元由5个主要部件构成EU(ExecutionUnit)

执行单元由4个主要部件构成?2.2.1

8086/8088的功能结构总线接口部件BIU构成部分4个16位段寄存器:CS,DS,ES,SS16位IP指令指针寄存器20位地址加法器6字节的指令队列(8088的指令队列为4字节

)总线控制电路主要功能负责与存储器、I/O接口传递数据,完成所有的访问操作具体完成:(1)计算形成20位物理地址(2)从内存预取指令,送到指令队列;

(3)与内存或外设交换数据:读/写操作数、执行结果送至内存或外设(4)总线控制:响应外部中断请求执行部件EU构成部分8个16位寄存器:AX、BX、CX、DX、SP、BP、DI、SI1个标志寄存器PSW1个算术逻辑运算部件ALU数据暂存器EU控制器主要功能负责指令的译码、执行。具体完成:(1)从指令队列中取指令(2)指令译码(3)执行指令(4)指令执行结果→BIU取指执行取指执行取指执行取指执行取指取指取指取指取指执行执行执行执行BIUEU时间时间8086/8088流水线执行方式非流水执行方式8086之前,CPU串行方式工作8086并行方式工作——首次引入指令流水线

BIU和EU并行工作的方式取指、执指二级流水线BIU与EU的操作协调(1)(1)执行单元EU并不直接与外部发生联系,而是从总线接口单元BIU的指令队列中源源不断地获取指令并执行。每当指令队列中存满一条指令后,EU就立即开始执行。(2)每当指令队列中有2个空字节时,BIU就会自动地寻找空闲的总线周期进行预取指令操作,直至填满为止。其取指的顺序是按指令在程序中出现的先后顺序。(3)每当EU准备执行一条指令时,它会从BIU部件的指令队列前部取出指令的代码,然后用几个时钟周期去执行指令。在执行指令的过程中,如果必须访问存储器或者I/O端口,那么EU就会请求BIU进入总线周期,并形成有效地址EA送给BIU,由BIU的地址加法器形成物理地址PA从存储器或I/O端口取回操作数送给EU,完成访问内存或者I/O端口的操作。如果此时BIU正好处于空闲状态,会立即响应EU的总线请求;如果BIU正将某个指令字取到指令队列中,则BIU将首先完成这个取指令的总线周期,然后再去响应EU发出的访问总线的请求。BIU与EU的操作协调(2)(4)每当EU执行一条转移、调用或返回指令后,BIU清除指令队列缓冲器,并从新的目标地址开始预取指令送入指令队列,此时EU才能继续执行指令,实现程序执行的转移。这时EU和BIU的并行操作显然要受到一定的影响,但只要转移、调用指令出现的概率不是很高,EU和BIU间相互独立又相互配合的工作方式仍将大大提高CPU的工作效率。(5)当指令队列已满,且EU又没有总线访问请求时,BIU便进入空闲状态。Intel808616条数据线(16位机)20条地址线(寻址能力220=1MB)Intel8088与外部交换数据的数据总线

8条数据线(准16位机)20条地址线重要差别

8086/8088两者内部结构基本相同

8086指令对列为6字节,若出现2字节空闲,则预取指令。

8088指令对列为4字节,若出现1字节空闲,则预取指令;8086CPU与8088CPU的区别8086/8088CPU分为哪两大部件?其各自的主要功能是什么?8086与8088CPU的区别有哪些?总结2.2.28086的存储器组织存储器:用来存放程序、数据。存储器以字节(8bit)为单位存储信息每个字节的存储单元有一个地址地址用二进制数表示(无符号整数,通常写成十六进制形式)多字节数据在存储器中占连续的多个存储单元:存放时,高字节存入高地址,低字节存入低地址;表达时,用它的低地址表示多字节数据占据的地址空间。

80x86系统采用“高高低低”原则存储,称为“小端方式LittleEndian”。相对应还存在“大端方式BigEndian”。存储器地址

8086具有20位地址总线,可寻址220=1MB存储空间,存储器的每一个存储单元(每一个字节)与一个20位地址相对应,称为物理地址。

物理地址:信息在存储器中实际有效的地址单元号,

CPU访问内存是按物理地址寻址的。

例如:1234H以不同方式存储时的情况。

2FFFH3000H3001H3002H3003H34H12H小端方式12H34H大端方式2FFFH3000H3001H3002H3003H12345678H34H12H低高双字数据56H78H

数据存储格式(00002H)=12H,或[00002H]=12H(00003H)=34H,或[00003H]=34H

字数据3412H

=(00002H)双字数据78563412H

=(00002H)存储器的分段管理8086CPU有20条地址线可寻址空间从00000H~FFFFFH,即220=1MB存储系统中,对应每个物理存储单元的一个唯一的20位编号,就是物理地址8086机器字长16位仅能表示地址范围0000H~FFFFH(64KB)存储器的逻辑分段每个段最大限制为64KB,段地址的低4位为0000B分段后编程时采用逻辑地址,形式为

段地址:

段内偏移地址8086首次引入存储器分段管理机制,可分为4种分工不同、相对独立的逻辑段:代码段:存放程序的指令和常数数据段:存放数据堆栈段:用于保护数据、传递数据、保存返回地址附加段:存放数据,可以作为数据段的扩展;用于串操作存储器的分段管理存储器分段示意每个段可安排在1MB空间的任何位置段与段之间是相互独立的段的排列非常灵活,可以连续、分开、重叠段内地址是连续的

每个段最大空间为64KB

每个逻辑段的起始地址16的倍数低4位为0000Bxxxx0H代码段起始地址堆栈段起始地址数据段起始地址附加段起始地址10550H250A0H8FFB0HEFF10HCS1055H250AH8FFBHEFF1HSSDSES段基址段寄存器8086/8088规定段起始地址必须是模16地址:xxxx0H,省略低4位0000B,段地址就可以用16位数据表示用16位段寄存器来存放段基址说明逻辑段在内存中的起始位置

段起始地址确定了逻辑段在整个内存空间的位置(逻辑段定位);偏移地址确定了要寻址的内存单元在本逻辑段中的位置。段起始地址和偏移地址,共同确定了要寻址的内存单元在整个内存空间的位置

每个逻辑段不超过64KB,偏移地址也可用16位数据表示,存放在地址寄存器或直接提供程序中出现的地址是逻辑地址。物理地址和逻辑地址

物理地址:信息在存储器中实际有效的地址单元号,

CPU访问内存是按物理地址寻址的。逻辑地址段基址保存在段寄存器

偏移地址保存在地址寄存器逻辑地址的表示方法段基址:偏移地址由地址寄存器提供或直接提供由段寄存器提供

8086微处理器20位物理地址的产生过程

问题:8086具有20位地址总线,可寻址220=1MB存储空间,而8086CPU的寄存器为16位,如何寻址20位地址?

CPU执行程序时,需要将逻辑地址转换为物理地址,称为地址重定位

逻辑地址:段基址、偏移地址

20位物理地址与逻辑地址的关系(计算)物理地址=(段基址)×10H+偏移地址解决:将段寄存器中的段基址左移4位,扩展成20位;用20位地址加法器,将段基址与偏移地址相加,形成20位物理地址。

20位物理地址计算例题

设(CS)=1200H,(IP)=0200H,求待取指令存放的物理地址物理地址=(CS)×10H+(IP)

=1200H×10H+0200H=12200H该物理地址可表示为(CS):(IP)或1200H:0200H(区别?)访问代码段一定是用逻辑地址(CS和IP)寻址物理地址=(段基址)×10H+偏移地址

某数据所在数据段(DS)=1350H,偏移地址=0020H,求存放该数据存储单元的物理地址物理地址=(DS)×10H+0020H=1350H×10H+0020H=13520H访问数据段时,偏移地址表示比较灵活,可以存放在地址寄存器SI、DI、BX中,也可以在指令中直接给出数据段中可以定义变量,变量具有偏移地址属性物理地址=(段基址)×10H+偏移地址一个存储单元具有一个唯一的物理地址,一个物理地址可对应多个逻辑地址逻辑地址 2012:3042、2002:3142物理地址 23162H23162H20120H+3042H23162H20020H+3142H23162H段地址左移4位加上偏移地址得到物理地址图2‑68086微处理器如何计算20位物理地址?8086开机或复位时,设(CS)=FFFFH,(IP)=0000H,复位后CPU执行第一条指令所在的物理地址?总结思考题:8086开机或复位时设(CS)=FFFFH,(IP)=0000H,复位后CPU执行第一条指令所在的物理地址?

物理地址=(CS)×10H+(IP)

=FFFFH×10H+0000H=FFFF0H

FFFF0H~FFFFFH,存储BIOS,16字节,转移指令书P57102.2.38086/8088的寄存器结构共14个16位寄存器

1.通用寄存器8086有8个通用的16位寄存器(1)数据寄存器:AXBXCXDX(2)变址寄存器:SIDI(3)指针寄存器:BPSP(1)数据寄存器AX称为累加器(Accumulator)使用频度最高。用于算术、逻辑运算、与外设传送信息等BX称为基址寄存器(BaseaddressRegister)常用做存放存储器地址CX称为计数器(Counter)作为循环和串操作等指令中的隐含计数器DX称为数据寄存器(Dataregister)常用来存放双字长数据的高16位,或存放外设端口地址4个数据寄存器还可以分成高8位和低8位两个独立的寄存器,这样又形成8个通用的8位寄存器,8位寄存器只能存放数据。例:汇编指令中寄存器的使用INAX,28H将(28H)端口数据传送到AX(2)变址寄存器16位变址寄存器SI和DI常用于存储器变址寻址方式时提供地址SI是源变址寄存器(SourceIndex)DI是目的变址寄存器(DestinationIndex)串操作指令:MOVSdest,scr目的操作数源操作数MOVAX,BX操作码操作数指令的一般格式DS:SIES:DI(3)指针寄存器指针寄存器用于寻址内存堆栈内的数据SP为堆栈指针寄存器(StackPointer),指示堆栈段栈顶的位置(偏移地址)BP为基址指针寄存器(BasePointer),表示数据在堆栈段中的基地址SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址SS:SPSS:BP关于堆栈(Stack)10500H10502H10504H10506H10508H1050AH堆栈段存取原则:LIFO(后进先出)双字节(字)操作高位字节对应高地址,低位字节对应低地址堆栈向低地址方向生成

入栈SP-2,出栈SP+2堆栈总满

SP所指示的栈顶已有数据用SS和SP(BP)寻址栈生成方向

堆栈?像装糖豆儿的小盒特点:先进后出,后进先出2.段寄存器8086有4个16位段寄存器,可同时使用4种逻辑段CS(代码段寄存器)指明当前代码段的起始地址CPU利用CS:IP取得将要执行的指令。SS(堆栈段寄存器)指明当前堆栈段的起始地址PUSH和POP指令,利用SS:SP寻址栈顶单元数据。DS(数据段寄存器)指明当前数据段的起始地址CPU利用DS:EA读写内存数据段数据ES(附加段寄存器)指明当前附加段的起始地址CPU利用ES:EA读写内存附加段数据每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途3.指令指针寄存器IPIP(InstructionPointer)为指令指针寄存器,存放即将执行指令的偏移地址(有效地址EA)。IP寄存器与CS段寄存器联合使用以确定下一条指令的存储单元地址(CS:IP)

IP寄存器是一个专用寄存器,在程序执行过程中,自动修改。注意:不能用指令直接读取或设定IP的值,但是可以通过某些指令的执行而自动修改IP值。(例如转移控制类指令)4.标志寄存器(FLAGS/PSW)(1)状态标志(记录程序中运行结果的状态信息)OF

溢出标志SF

符号标志ZF

零标志CF

进位标志AF

辅助进位标志PF

奇偶标志(2)控制标志用于控制处理器执行指令的方式DF

方向标志IF

中断标志TF

陷阱标志OF111512DF10IF9TF8SF7ZF65AF43PF21CF0符号标志SF(SignFlag)运算结果最高位为1,则SF=1;否则SF=0

有符号数据用最高有效位表示数据的符号所以,最高有效位就是符号标志的状态CF:进位/借位标志位当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0ZF:零标志位若运算结果为0,则ZF=1;否则ZF=0奇偶标志PF(ParityFlag)当运算结果最低字节中“1”的个数为零或偶数时,PF=1;否则PF=0

PF标志仅反映最低8位中“1”的个数是

偶或奇,即使是进行16位字操作溢出标志OF(OverflowFlag)若有符号数运算的结果有溢出,则OF=1;否则OF=0所谓溢出,就是当对有符号数进行运算时,字节运算的结果超出-128~+127的范围,或字运算的结果超出-32768~+32767的范围时,称为溢出。因为这时运算结果已超出目标单元所能表示的数值范围,从而会丢失有效数字,出现错误结果。方向标志DF(DirectionFlag)用于串操作指令中,控制地址的变化方向:设置DF=0,存储器地址自动增加;设置DF=1,存储器地址自动减少CLD指令复位方向标志:DF=0STD指令置位方向标志:DF=1中断允许标志IF(Interrupt-enableFlag)控制可屏蔽中断是否可以被处理器响应:设置IF=1,则允许中断;设置IF=0,则禁止中断CLI指令复位中断标志:IF=0STI指令置位中断标志:IF=1陷阱标志TF(TrapFlag)用于控制处理器进入单步操作方式:设置TF=0,处理器正常工作;设置TF=1,处理器单步执行指令单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断这种内部中断称为单步中断所以TF也称为单步标志利用单步中断可对程序进行逐条指令的调试这种逐条指令调试程序的方法就是单步调试溢出的判断当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,则不会产生溢出.最高两位转换为使10进制数,看运算结果是否超出取值范围例1:3AH+7CH=B6H 溢出例2:AAH+7CH 无溢出例3:3AH-7CH 无溢出例4:AAH-7CH=2DH 溢出关于CF与OF?那是不一样滴,hoho……

10000100111010010111010010001101110010CF=1,OF=1CF=0,OF=1CF=1,OF=0

010000110111CF=0,OF=0思考题:以下的几个4位十六进制数相加,会使得8086状态寄存器的以下几位为什么值?CFPFAFZFSFOF8000H8000H+0000HC000HC000H+8000H4008H4008H+8010H0808HC000H+C808H110101110010001011000010总结段基址:偏移地址,基本搭配?举例如下,具体取决于指令中的寻址方式段寄存器和相应存放偏移地址的寄存器之间的默认组合

段偏移CSIPSSSP或BPDSAX、BX、CX、DX、DI、SIESDI(用于串指令)如何判断运算结果是否溢出?标志寄存器中进位标志与溢出标志的区别?CFPFAFZFSFOF8000H8000H+0000HC000HC000H+8000H4008H4008H+8010H0808HC000H+C808H2.3汇编语言程序的开发过程编辑文本编辑器,如EDIT.COM源程序:文件名.asm汇编汇编程序,如ML.EXE目标模块:文件名.obj连接连接程序,如LINK.EXE可执行文件:文件名.exe调试调试程序,如DEBUG.EXE应用程序错误错误错误错误编辑源程序

EDIT

HELLO.ASM汇编源程序MASM

HELLO.ASM形成目标程序

HELLO.OBJ连接目标程序

LINK

HELLO.OBJ有连接错误信息?形成可执行程序

HELLO.EXE装入可执行程序到内存,并执行HELLO下一程序用DEBUG调试可执行程序DEBUG

HELLO.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?D:\MASM>EDIThello.asm↙D:\MASM>MASMhello;↙

有语法错,回EDIT下修改该程序D:\MASM>LINKhello;↙

有错,回EDIT下修改程序D:\MASM>hello↙

运行结果错,回EDIT下修改程序或在DEBUG下调试,找原因。D:\MASM>DEBUGhello.exe↙任何一个文本编辑器可以实现源程序文件的编辑:DOS中的全屏幕文本编辑器EDIT其他程序开发工具中的编辑环境(记事本或写字板)源程序文件要以ASM为扩展名EDIThello.asm↙过程1:源程序的编辑汇编是将源程序翻译成由机器代码组成的目标模块文件的过程

MASMhello.asm↙

或MASMhello↙;后缀可以省略如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(*.obj);否则MASM将给出相应的错误信息,这时应根据错误信息,重新编辑修改源程序后,再进行汇编。过程2:源程序的汇编连接程序能把一个或多个目标文件和库文件合成一个可执行程序(.EXE、.COM文件):LINKhello.obj↙

LINKhello↙;后缀可以省略如果没有严重错误,LINK将生成一个可执行文件(*.exe);否则将提示相应的错误信息,这时需要根据错误信息重新修改源程序后再汇编、链接,直到生成可执行文件过程3:目标模块的连接经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行:hello↙操作系统装载该文件进入主存,并开始运行如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误采用DEBUG.EXE调试程序:

DEBUGhello.exe

↙过程4:可执行程序的运行调试DSEG

SEGMENT

;数据段开始

STRING DB0DH,0AH,'Hello,Assembly!',0DH,0AH,'$'DSEG

ENDS

;数据段结束CSEG

SEGMENT

;代码段开始

ASSUMECS:CSEG,DS:DSEG

;设定段寄存器与逻辑段的关系START:MOVAX,DSEG MOVDS,AX;设置数据段段地址

MOVDX,OFFSETSTRING

;为DOS调用设置入口参数

MOVAH,9

;为DOS功能调用设置功能号

INT21H

;DOS功能调用,显示字符串

MOVAX,4C00H;为DOS功能调用设置功能号和入口参数

INT21H;DOS功能调用,返回DOS操作系统CSEG

ENDS

;代码段结束

ENDSTART

;汇编结束[例2-1]源程序:hello.asm,在屏幕上显示字符串“Hello,Assembly!”。汇编连接运行文件路径目录(Directory):管理磁盘上文件的文件夹路径(Path):分区:\根目录\子目录\文件名绝对路径:文件的完整路径d:\masm\hello.asm相对路径:相对当前目录的路径转换分区d:↙进入当前目录(CurrentDirectory)cd\masm↙调试程序DEBUGDEBUG.exe

是DOS提供的一个调试汇编语言程序的程序。每个版本的DOS都带有该程序,在windows\system32文件夹下。

DEBUG程序采用的是命令行方式使用不方便,但实用性强。是学习汇编语言程序、计算机硬件等课程的有效工具。DEBUG程序的具体作用

查看/修改寄存器,内存单元的内容;

学习寻址方式和指令系统;

了解计算机取指令,执行指令的工作过程;

调试有问题的汇编语言程序。DEBUG主要命令DEBUG下符号与标志的对应关系D:\MASM>DEBUG

;进入DEBUG-R

;查看当前各寄存器的内容AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0100NVUPEIPL

NZ

NAPONC1271:0100B83412MOVAX,1234-D0:0

;查看0:0~7FH内存块的内容0000:00009E0FC90065047000-1600EB0765047000e.pe.p.0000:00106504700054FF00F0-587F00F0F5E700F0e.p.T...X…、、、、、、-UFFFF:0

;反汇编FFFF:0处的指令FFFF:0000CD19INT19FFFF:0002E000LOOPNZ0004、、、、、、课后可参照下列步骤做实验:-A

;汇编一条指令

1271:0100MOVAX,12341271:0103-T=100

;执行该指令

AX=1234BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0103NVUPEIPLNZNAPONC1271:0103E9C300JMP01C9-R

;查看指令执行后结果

AX=1234BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1271ES=1271SS=1271CS=1271IP=0103NVUPEIPLNZNAPONC-Q

;退出DEBUGD:\MASM>高级语言程序、汇编语言程序与机器语言程序的关系源程序***.ASM目标程序***.OBJMASM进行汇编可执行程序可执行程序***.EXEGO!LINK连接2.4汇编语言源程序组织2.4.1

汇编语言的语句格式2.4.2

汇编语言源程序格式2.4.1汇编语言的语句汇编语言源程序由语句序列构成.每条语句一般占一行。语句有两种:指令语句(表达硬指令的执行性语句)伪指令语句(表达伪指令的说明性语句)汇编语言的语句格式⑴指令语句——汇编后翻译为机器指令,产生目标代码;

执行性语句,用于表达处理器指令(也称为硬指令)。指令与具体的处理器有关、与汇编程序无关

⑵伪指令语句——没有对应的机器指令,不产生目标代码;说明性语句,用于指示汇编程序对源程序如何汇编、定义常量、变量、逻辑段,设置过程等

伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令

标号:

指令助记符操作数,操作数

;注释符号名

伪指令助记符

参数,参数,……

;注释NEXT:MOVYY,AL;YY←(AL)PORTEQU33H;令PORT=33H指令与伪指令指令(Instruction)——与机器指令一一对应,在程序执行时才处理的指令,表明CPU所执行的具体操作

指令与具体的处理器有关、与汇编程序无关

MOVADDJMP伪指令(Directive)——没有与其对应的机器指令,在程序执行前指示汇编程序所作处理的说明性指令

伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令

EQU

DBPTR

指令和伪指令采用助记符表达操作数和参数指令的操作数可以是常数操作数、寄存器操作数和存储器操作数指令语句中,操作数可以是1个、2个或没有,用,隔开伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔不需要操作数隐含操作数双操作数指令/二地址指令OPdest,src单操作数指令/一地址指令

OPdest无操作数指令/零地址指令

OP标号表示一条指令的符号地址(后一定有“:”)一般用于主程序或程序模块的开始

JMP/CALL标号符号名可以是常量名、变量名、段名、过程名表示一条伪指令的符号地址(后没有“:”)符号化的偏移地址

PORTEQU33H;令PORT=33H

注:第1个字符不能是数字字符串长度不能超过31个不能是系统保留字,如:指令名、寄存器名、伪指令名等在汇编语言中,下列符号可以做标识符(标号或符号名)字母:A~Z,a~z

数字:0~9

特殊字符:?,@,$,_,!,%MOV、ADDAX、CSDB、DW

汇编语言不区别大小写注释语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性,说明语句或程序的功能汇编程序在翻译源程序时将忽略注释部分,不对它们做任何处理分隔符语句的4个组成部分要用分隔符分开标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符多个空格和制表符的作用与一个相同MASM支持续行符“\”标号:

指令助记符操作数,操作数

;注释符号名

伪指令助记符

参数,参数,……

;注释2.4.2汇编语言源程序格式完整的汇编语言源程序由逻辑段组成包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内完整汇编语言源程序格式(1)处理器选择伪指令(2)逻辑段定义伪指令(3)段使用设定伪指令(4)程序开始(5)程序终止(6)汇编结束完整汇编语言程序框架一.8086 ;(1)处理器选择伪指令data1SEGMENT ;(2)数据段定义,(可据需要设定,也可无)…… ;常量、变量定义data1ENDSdata2SEGMENT ;附加段定义(可据需要设定,也可无)……data2ENDScodeSEGMENT;代码段定义

ASSUMECS:code,DS:data1,ES:data2;(3)设定段寄存器与逻辑段关系start:MOVAX,data1 ;(4)起始点,MOVDS,AX ;设置段寄存器、、、 ;程序主体部分、、、

MOVAX,4C00H ;(5)结束点,返回DOS

INT21HcodeENDS

ENDstart ;(6)汇编结束(1)处理器选择伪指令.386.386P.486.486P.586.586P.686.686P.386表示程序选用80386的基本指令集,

.386P表示选用80386的基本指令和保护模式下的特权指令。缺省的处理器选择伪指令是.8086(2)逻辑段定义伪指令段名SEGMENT 定位

组合

使用

'类别' ... ;语句序列段名ENDS逻辑段的名称,用户确定,具有段属性和偏移属性段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有‘code’类别,其他为可选属性参数如果不指定,则采用默认参数;但如果指定,注意要按照上列次序各个逻辑段用“段定义伪指令”SEGMENT和ENDS一对伪指令定义,必须成对出现需要配合ASSUME伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段段名由用户定必须成对出现且必须一致段定位(align)属性指定逻辑段在主存储器中的起始边界,告诉连接程序逻辑段的起始位置;可为:

BYTE:字节地址开始,任何地址开始(xxxxxxxxb)

WORD:字边界开始,偶数地址(xxxxxxx0b)

DWORD:双字边界开始,4倍数地址(xxxxxx00b)

PARA:小段边界开始,16倍数地址(xxxx0000b)

PAGE:页边界开始,256倍数地址(00000000b)默认定位属性是PARA段组合(combine)属性告诉连接程序各个逻辑段如何连接,指定多个逻辑段之间的关系,可为:PRIVATE 本段不与其他模块中同名段合并,每段都有自己的段地址。这是完整段定义伪指令默认的段组合方式。PUBLIC 本段与所有同名同类型的其他段相邻地连接在一起,合成一个大的物理段,指定一个共同的段地址。原段间存在小于16B的间隙。COMMON

同名段重叠在一起,形成一个段,内容为排在最后的段的内容。STACK 将所有STACK段按照与PUBLIC段的同样方式进行无缝合并。这是堆栈段必须具有的段组合使用类型(use)属性为支持32位段而设置的属性USE16:使用16位寻址方式,段长不超过64K。USE32:使用32位的寻址方式,段长可达4GB。默认类型为USE16段类别(class)属性段类别可以是任意名称,但必须位于单引号中当连接程序组织段时,将类别名相同的段存入到存储器中的连续区域大多数MASM程序使用'code'、'data'和'stack’来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续(3)段使用设定伪指令ASSUME段寄存器:段名[,段寄存器名:段名,...]ASSUME伪指令一般放在代码段的开始通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的对应关系ASSUME是伪指令,只是通知汇编程序:段寄存器和逻辑段的对应关系,并没有将逻辑段的段基址存入段寄存器在初始化程序中,要对段寄存器赋初值,将段基址存入段寄存器ASSUMECS:code,DS:data1,ES:data2;(4)程序开始为了指明程序开始执行的位置,需要使用一个标号(如:采用start标识符)连接程序会根据程序起始点正确地设置CS和IP值,根据程序大小和堆栈段大小设置SS和SP值连接程序没有设置DS和ES值。程序如果使用数据段或附加段,必须明确给DS或ES赋值大多数程序需要数据段,程序的执行开始应是:start: MOVAX,data1

;data1表示数据段的段地址

MOVDS,AX

;设置DS(5)程序终止应用程序执行结束,应该将控制权交还操作系统汇编语言程序设计中,有多种返回DOS的方法,但一般利用DOS功能调用的4CH子功能实现,它需要的入口参数是AL=返回数码(通常用0表示程序没有错误)应用程序执行结束,返回DOS的代码就是:

MOVAX,4C00H INT21H(6)汇编结束汇编结束表示:汇编程序将源程序翻译成目标模块代码的过程到此结束源程序的最后必须有一条END伪指令

END[标号]“标号”参数:程序开始执行点(如:start标识符),结束将源程序翻译成目标模块代码的汇编过程;连接程序将将标号所指单元的段基址和偏移量自动装入CS和IP中

————不要糊涂————程序终止和汇编结束是两码事汇编语言的源程序采用分段结构,框架:DATA

SEGMENT

┊DATA

ENDSCODE

SEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVAX,4C00H INT21HCODE

ENDS

ENDSTART总结源程序:hello.asmDSEG

SEGMENT

;数据段开始

STRINGDB0DH,0AH,'Hello,Assembly!',0DH,0AH,'$'DSEG

ENDS

;数据段结束CSEG

SEGMENT

;代码段开始

ASSUMECS:CSEG,DS:DSEG

;设定段寄存器与逻辑段的关系START:MOVAX,DSEG MOVDS,AX;设置数据段段地址

MOVDX,OFFSETSTRING

;为DOS调用设置入口参数

MOVAH,9

;为DOS功能调用设置功能号

INT21H

;DOS功能调用,显示字符串

MOVAX,4C00H;为DOS功能调用设置功能号和入口参数

INT21H;DOS功能调用,返回DOS操作系统CSEG

ENDS

;代码段结束

ENDSTART

;汇编结束[例2-1]在屏幕上显示字符串“Hello,Assembly!”。2.5汇编语言中的操作数常量:作为硬指令的立即数或伪指令的参数变量:主要作为存储器操作数2.5.1常量常量表示一个固定的数值,它又分成多种形式常数字符串符号常量数值表达式(1)常数指由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数十进制由0~9数字组成,以字母D(d)结尾(缺省情况可以省略)100,255D十六进制由0~9、A~F数字组成,以字母H(h)结尾。为避免与标识符混淆,以字母开头的常数需要加一个前导064H,0FFH,0B800H二进制由0和1两个数字组成,以字母B(b)结尾01100100B(2)字符串字符串常量是用单引号或双引号括起来的单个字符或多个字符其数值是每个字符对应的ASCII码值例如:

‘d’(等于64H)

‘AB’(等于4142H)

‘Hello,Assembly!’(3)符号常量经常使用的常数,可通过给一个符号名赋值来表示符号常量定义伪指令有“EQU”和“=”两种: 符号名EQU

数值表达式 符号名=数值表达式例:DATEQU99;等值语句

NUM=100;等号语句EQU用于数值等价时不能重复定义符号名,“=”允许有重复赋值。例如:

X=7; X=X+5 ;“XEQUX+5”是错误的汇编时,对EQU定义的符号名用对应的表达式进行“替换”。例如:NUM EQU 215MOD15ERR_MSG EQU “DataOverride”MESSAGE DB ERR_MSG

;等价于MESSAGEDB“DataOverride”MOV CX,NUM+1

;等价于MOV CX,215MOD15+1(4)数值表达式数值表达式一般是指由运算符连接的各种常量所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符例如:movax,3*4+5 ;等价于:movax,17构成数值表达式可使用以下几类运算符:算术运算符(+,-,*,/,mod)逻辑运算符

(shl,shr,and,or,xor,not)关系运算符

(gt,ge,eq,le,lt,ne)地址运算符

(seg,offset)类型运算符

(type,length,size)【例2‑5】数值表达式及其应用;汇编语言指令

MOVDH,01100100BSHR2MOVBL,8CHAND73HMOVAH,8CHOR73HMOVAX,10HGT16 MOVBL,6EQ0110B

MOVBX,32+((13/6)MOD3) ;汇编后形成的指令;MOVDH,19H;MOVBL,0;MOVAH,0FFH;MOVAX,0;MOVBL,0FFH

;MOVBX,0022HMOVAX,BX+2需要把BX的值与常数2相加并存入AX的操作只能在程序执行阶段由以下两条指令完成:MOV AX,BX;BX寄存器值存入AX寄存器ADD AX,2 ;AX寄存器的值加2,结果存AX√×不良用法2.5.2变量变量实质上是指内存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变变量需要事先定义才能使用变量定义伪指令为变量申请以固定长度为单位的存储空间,并可以同时将相应的存储单元初始化定义后的变量可以利用变量名等方法引用其中的数据,即变量的数值1.变量的定义变量定义的汇编语言格式为:

变量名伪指令初值表变量名为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。初值表是用逗号分隔的参数,主要由常量或“?”组成。其中“?”表示未赋初值多个存储单元如果初值相同,可以用复制操作符(重复定义符)DUP进行定义:

重复次数DUP(重复参数)变量定义伪指令DB(DefineByte):每个数据占用一个字节(8b)

DW(DefineWord):每个数据占用一个字(16b)

DD(DefineDoubleWord):每个数据占用一个双字(32b)DQ(DefineQuartWord):每个数据占用8个字节(64b)DT(DefineTenByte):每个数据占用10个字节(80b)【例2‑3】变量定义举例DSEG SEGMENT BVARDB1,-2,'AB',3DUP('a'),? ;字节变量,8项

WVARDW1,-2,'AB',3DUP('a'),? ;字变量,7项

DVARDD1,-2,'AB',3DUP('a'),? ;双字变量,7项

VAR1DWWVAR,DVAR,DVAR-WVAR,VAR1-DVAR ;字变量,4项

VAR2DDWVAR,DVAR,DVAR-WVAR,VAR1-DVAR ;双字变量,4项

VAR3DBDVAR-WVAR,VAR1-DVAR ;字节变量,2项DSEG ENDS

有符号数用它的补码存储字符用ASCII代码存储DB定义的数据在[-128~255]之内变量名代表首个单元的地址DW定义的数据在[-32768,65535]内出现在参数部分的变量名用这个变量的偏移地址代替多字节数据的存放:

“高高低低”(小端方式)存储区域分配(1,-2,'AB',3DUP('a'),?)2.变量和标号的属性变量和标号都表示存储单元。变量表示的存储单元中存放数值标号表示的存储单元中存放指令代码。变量和标号具有如下三种属性:①段属性(SEG):变量或标号对应存储单元所在段的段地址。②偏移地址属性(OFFSET):变量或标号对应的首个存储单元的段内偏移地址。③类型属性(TYPE):变量的类型属性指的是变量占用存储单元的字节数。属性值由变量定义伪指令来决定。主要的变量和标号类型属性及返回值变量

/标号

/常数

DBDWDDDFDQDTNEARFAR常数

1246810-1-203.析值运算符析值运算符也称为数值回送运算符,把一些特征或存储器地址的一部分作为数值回送。常用析值运算符SEG

名字/标号返回名字或标号的段地址OFFSET

名字/标号返回名字或标号的偏移地址TYPE

名字/标号返回变量或标号的类型,类型用数值表示LENGTH

变量名返回利用DUP定义的变量中元素的个数,即重复操作符DUP前的重复次数值,其它情况回送1SIZE

变量名返回LENGTH×TYPE的值数值回送操作符:

OFFSET、SEG、TYPE、LENGTH、SIZESIZE变量功能:LENGTH*TYPEOFFSET/SEG

变量/标号功能:回送变量或标号的偏址/段地址TYPE

变量

/标号

/常数

DBDWDDDFDQDTNEARFAR常数

1246810-1-20LENGTH变量功能:回送由DUP定义的变量的单元数,其它情况回送1MOVAX,LIST MOVAX,OFFSETLIST设变量LIST定义在DATA段中,

DATASEGMENTLISTDW10,20,30DATAENDS下面三条指令都是把DATA段的段基址装入AX:MOVAX,DATA;DATA代表该段的段基址,是一个立即数MOVAX,SEGDATA;取DATA的段基址,结果是立即数MOVAX,SEGLIST;取LIST的段基址,结果是立即数对比:;取出变量LIST第一个元素送入AX;取变量LIST的偏移地址送入AXADB “ABCDE” ;TYPE=1,LENGTH=1,SIZE=1BDW 3DUP(5),4DUP(-1);TYPE=2,LENGTH=3,SIZE=6CDD 34,49,18 ;TYPE=4,LENGTH=1,SIZE=4MOVAX,TYPEA ;AX=1MOVBX,LENGTHB ;BX=3MOVCX,SIZEC ;CX=44.属性运算符提高访问变量、标号和一般存储器操作数的灵活性常用属性运算符类型PTR

变量名/标号临时指定或临时改变变量和标号的使用类型THIS

类型用于创建采用当前地址但为指定类型的操作数SHORT

标号将标号作为短转移处理段寄存器

:用来给一个存储器操作数指定一个段属性,

即段超越5.变量的应用变量具有存储单元的逻辑地址指令语句中通过变量名引用其指向的首个数据通过变量名加减位移量存取以首个数据为基地址的前后数据伪指令语句中主要是在另一个变量定义语句中作为参数部分出现。MOVAL,BVAR ;AL←1MOVBL,BVAR+3 ;BL←‘A’类型限定操作符PTR类型限定操作符对类型属性进行设置

类型名PTR名字/标号类型名可以是BYTE、WORD、DWORD(依次表示字节、字、双字)等,或者是NEAR、FAR(分别表示近、远)等例: MOVAX,BVAR

MOVAX,WORDPTR

BVAR

×√【例2‑3】变量应用举例;代码段MOVCL,BVAR ;BVAR第1个数据送CL,(CL)=01HMOVCH,BVAR+2 ;BVAR第3个数据送CH,(CH)=41HMOVBX,WVAR ;WVAR第1个数据送BX,(BX)=0001HMOVSI,WVAR+2 ;WVAR第2个数据送SI,(SI)=0FFFEH(-2)MOVDX,WORDPTRDVAR ;DVAR第1个数据低字送DX,(DX)=0001HMOVAX,WORDPTRDVAR+2 ;DVAR第1个数据高字送AX,(AX)=0000HMOVDI,VAR1+4 ;VAR1第3个数据送WVAR第7个数据单元。MOVWVAR+12,DI6.变量的定位汇编程序按照指令的先后顺序一个接着一个分配存储空间,按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置(包括偏移地址)定位伪指令ORG控制数据或代码所在的偏移地址

ORG

参数ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如:

ORG100h

;从100H处安排数据或程序

ORG$+10

;偏移地址加10,即跳过10个字节空间汇编语言程序中,符号“$”表示当前偏移地址值例:变量定位DATASEGMENT

ORG10HVAR1DB1,'A'ORG$+2VAR2DW1234H,$-VAR1DATAENDS2.68086/8088的寻址方式

寻找指令所需的操作数或操作数地址的方法2.6.1立即寻址

MOVAX,3069H2.6.2寄存器寻址

MOVAL,BH2.6.3直接寻址

MOVAX,[2000H]2.6.4寄存器间接寻址

MOVAX,[BX]2.6.5寄存器相对寻址

MOVAX,06H[SI]2.6.6基址变址寻址

MOVAX,[BP][DI]2.6.7相对基址变址寻址

MOVAX,06H[BX][SI]操作数位于存储器考核要点寻址方式能够识别指令中操作数采用的寻址方式能够根据寻址方式确定操作数的来源能够在指令中正确地使用各种寻址方式2.6.1立即寻址特点:操作数以常量形式出现在指令中(立即寻址、立即数)操作码之后,存放在代码段中立即数可以是16位或8位例:MOVAX,1234H12H34HAHALOP代码段┇

AX低地址高地址1.指令在代码段的存储形式2.指令的运行结果立即数寻址只能用于源操作数位置,不能用于目的操作数位置指令中立即数长度应与其他操作数保持一致MOVAH,-40

;MOVAX,-40

;MOVAX,‘A’;MOVBL,‘B’;MOVAX,34D8H

;MOVAL,1234H;

常用于给寄存器或存储单元赋初值

(段寄存器、标志寄存器除外)MOVAX,1234H;MOV5,AL

立即寻址只能用于源操作数√D8HAHFFD8HAX0041HAX42HBL34HAH,D8HAL2.6.2寄存器寻址特点:操作数存放在CPU寄存器中,指令指定寄存器名寻址在CPU内部进行,指令执行速度快例:MOVBX,AX

AX

BX

DX

CX例:MOVAH,BL;(BL)-->AHMOVDX,AX;(AX)-->DX操作数可以是8位,也可以是16位,但SRC和DST的字长要一致。由这个段跨越前缀指明源操作数存放在附加段存储器操作数2.6.3直接寻址特点:操作数位于存储器中在指令中直接给出操作数所在存储单元的偏移地址将该存储单元作为起始位置,取出数据,8位或16位分两种情况(1)系统默认操作数存放在数据段(段基址存放在DS)例:MOVAX,[1200H][]内:是偏移地址!不是立即数(有效地址EA)(2)操作数存放在其他逻辑段应在指令中指定段跨越前缀例:MOVAX,ES:[1200H]操作数的物理地址=(ES)×10H+1200H设(DS)=3000H,则该数据段起始地址为:30000H22H11H31200H操作数所在存储单元的物理地址AHAL┇

11数据段30000

温馨提示

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

评论

0/150

提交评论