版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课堂练习1、8086/8088系统中,设CS=0914H,共有243字节长的代码段,该代码段末地址的逻辑地址(段地址:偏移地址)和物理地址各是多少?2、若DS=095FH,物理地址是11820H。当DS=2F5FH时,物理地址为多少?3、设SP=0040H,如果用进栈指令存入5个数据,则SP=_____,若又用出栈指令取出2个数据,则SP=______。用机器指令编写的程序叫机器语言程序。机器指令组成的指令系统叫机器语言。用80X86的机器语言编程序,在屏幕上显示“3”。B233B402CD21CD20第2章汇编语言与汇编程序第2章汇编语言与汇编程序用80X86的(小)汇编语言编写实现上述功能的程序MOVDL,33HMOVAH,02HINT21HINT20H这样的指令叫符号指令、汇编指令或助记符指令。第2章汇编语言与汇编程序用汇编语言编写的程序叫汇编语言源程序。把汇编语言源程序翻译成机器语言程序计算机才能执行。把汇编语言源程序翻译成机器语言程序的程序叫汇编程序。翻译过程叫汇编。指令是对数据进行操作的,在计算机中数据又称为操作数。存放操作数的存储单元的地址或寄存器的地址(寄存器名)称为操作数地址。为简化表示,在汇编语言中操作数和操作数地址有时统称为操作数。同一个操作数可以有多种不同的表达方式,这要服从方便程序设计的需要。2.1符号指令中的表达式2.1符号指令中的表达式例如MOVAL,36H可以写成MOVAL,20H+16H还可以写成MOVAL,6*9等等如何表达更能反映程序设计者的意图,就如何表达。2.1.1常量1.常量常量是在程序运行过程中数值不变的量,可以以数值形式出现在符号指令中。称为数值常量。也可以对经常使用的常数预先定义一个名字,然后用该名字表示该常量。称为符号常量。数值常量允许有多种表示形式二进制(以B结尾)十进制十六进制(以H结尾)ASCⅡ码字符(用单引号‘括起来)例如MOVAL,36HMOVAL,00110110BMOVAL,54MOVAL,’6’是等价的符号常量由伪指令EQU或“=”定义,如PEQU314或P=314符号常量不占用存储单元,可改善程序的可度性。2.数值表达式汇编语言允许对常量进行算术(+、-、х、/、MOD)运算,逻辑(AND、OR、XOR、NOT)运算和关系(EQ、NE、LT、GT、LE、GE)运算.由常量和这三种运算符组成的有意义的式子,叫数值表达式。数值表达式的值在汇编时由汇编程序计算,其结果仍是一个常量。2.1.2标号标号是指令地址的符号表示,代表所在指令的地址。指令可以有标号,也可以没有标号,当某条指令作为转移指令的转移目标时,就必须有标号。如:L1:MOVAL,BLADDAL,30H…….JZL1指令的标号后面要有冒号“:”标号也可以是过程(子程序)名,代表过程中第一条指令的地址。例如BCDADDPROCNEARMOVAL,04HADDAL,BLDAARETBCDADDENDPBCDADD是过程名,代表过程中第一条指令(MOVAL,04H)的地址,PROC是过程定义伪指令,伪指令左边的标号(BCDADD)后不加冒号“:”。2.1.3变量1、变量和地址表达式变量与数据区内存单元相对应。变量名即是数据的地址或数据区的首地址。由于存储器是分段使用的,因此变量具有三重属性:段基址、偏移地址和类型。变量的段基址就是变量所在段的起始地址。变量的偏移地址是指变量所在段的段基址到该变量的字节距离。由变量、标号、带方括号的寄存器(SI、DI、BX、BP)、常量和运算符组成的有意义的式子叫地址表达式。2、变量的段基址和偏移地址的指定算符变量的段基址的高16位用算符SEG来指定如:MOVAX,SEGX表示取变量X的段基址到AX变量的偏移地址算符OFFSET来指定如:MOVBX,OFFSETX表示取变量X的偏移地址到BX3、变量的类型属性及变量的定义变量的类型是指存取该变量中的数据所需的字节数。变量的类型可以是字节(byte)、字(word)、双字(dword)、6字节(fbyte)、4字(qword)和10字节(tbyte)。变量用下列数据定义伪指令来定义:DB(定义字节)、DW(定义字)、DD(定义双字)、DF(定义6字节)、DQ(定义4字)、DT(定义10字节)。格式是:[变量名]数据定义伪指令表达式[,….]表达式可以是(1)数值表达式(2)ASCⅡ码字符串,若用DB定义,则按顺序存放,长度不限;若用DW定义,则2个1组。(3)地址表达式(只适用于DW、DD和DF)DW定义一个16位偏移地址来初始化变量DD定义段基址的高16位和一个16位偏移地址来初始化变量DF定义段基址的高16位和一个32位偏移地址来初始化变量(只适用于386及后来机型)。(4)nDUP(表达式)n是重复因子,DUP是重复字句,表达式是重复的内容(5)?表示预留空间(6)以上表达式组成的序列,各表达式用逗号分隔。DATASEGMENTB1DB23H,56,10110011B,’AB$’B2DB2DUP(-5,-1)DB2DUP(10,’E’),’23’,1,4W1DW2345H,‘CD’,’RE’W2DWB2W3DDEWEWDWW1DATAENDS2、变量存储区中数据的存放80X86系列微型机,为了与早期的机器实现软件兼容和移植,存储器按字节编址,可按字节、字、双字等访问(80386以后),数据在数据区的存放如下(以前面的定义为例)DATA0000偏移地址000100020003000400050006000700080009000A000B000C000D000EDATA000F偏移地址0010001100120013001400150016001700180019001A001B001C001D23H38HB3H41H42H24HFBHFFHFFHFBH0AH45H0AH45H32H33H01H04H45H23H44H43H45H52H06H00H1EH00HXXXXDATA001E001F0020002112H00H5.地址表达式类型的变更或临时指定变量和标号都有类型属性,由其组成的地址表达式也有类型属性。地址表达式的类型属性由其中的变量或标号决定。不含变量或标号,仅含寄存器或直接地址形式没有类型属性。在程序设计时有时需要对没有类型属性的地址表达式临时指定合适的类型属性或临时改变原有的类型属性。对没有类型属性的地址表达式指定类型属性例MOVAL,[1000H]MOVAX,[1000H]INC[1000H]хINCBYTEPTR[1000H]临时改变地址表达式的类型属性设变量W1用DW定义为字变量,一次访问一个字(16位),要临时访问它的一个字节,必须改变它的类型属性为字节。
MOVAL,BYTEPTRW1设X是用DB定义的字节变量
MOVAL,X同样也可以把定义为字节的变量临时指定为字,并进行访问。指令中指出操作数及操作数地址或下一条指令地址的方式称为寻址方式.80X86机器指令有0个或多个操作数。某些操作数是显式规定的,有的是指令中隐含的。一个操作数能定位在以下地方之一:(1)指令中(立即数)(2)寄存器(3)存储单元(4)I/O端口2.280X86的寻址方式2.2.1、寄存器(直接)寻址
操作数在CPU内部寄存器中,指令给出寄存器名(地址),称为寄存器寻址方式。例如:MOVAL,BLADDSI,AX2.2.2立即寻址指令所用的8位或16位操作数由指令本身提供(无需再寻,立即可得),这种方式叫立即寻址方式。例如:MOVAL,30HMOVBX,1090H立即数只能是整数,不能是小数、变量或其他类型的数据。立即数只能是源操作数。立即数的大小应于目的操作数相适应MOVAL,120H!!MOVSI,30H2.2.3直接寻址操作数在存储器的某存储单元中,指令直接给出存储单元的有效地址。例如:MOVAL,[1000H]ES:MOVAX,[2008H];ES称为段超越前缀MOVAL,VAR;VAR已定义为字节变量.
MOVAX,Y;Y已定义为字变量.注意:源和目的的类型要一致2.2.4寄存器间接寻址操作数在存储器的某存储单元中,存储单元的有效地址由下列寄存器之一指出(BX,BP,SI,DI),指令给出寄存器名,称为寄存器间接寻址。有以下几点需要说明:1.BX和BP称为基址寄存器,SI和DI称为变址寄存器,SI又叫源变址寄存器,DI又叫目的变址寄存器,使用BX、SI和DI寄存器间接寻址时,默认的段寄存器是DS,使用SI和DI的寄存器间接寻址又叫变址寻址.使用BX寄存器的间接寻址常称为数据段基址寻址。使用BP寄存器间接寻址时,默认的段寄存器是SS。使用BP寄存器的间接寻址常称为堆栈段基址寻址。例如:设SI=1000H,DI=1200H,BX=2000H,BP=1500H,DS=1000H,SS=1100H,分析下列各指令内存操作数的物理地址(PHA)MOVAL,[BX];PHA=?MOVAL,[SI];PHA=?MOVAL,[DI];PHA=?MOVAL,[BP];PHA=?2.2.5基址寻址BX和BP称为基址寄存器,SI和DI称为变址寄存器有效地址由基址寄存器和一个偏移量决定时,称为基址寻址MOVAL,[BX+100H];MOVAL,[BP]+1000H;当基址寄存器为BP时,隐含访问堆栈段。当基址寄存器为BX时,隐含访问数据段。2.2.6变址寻址变址寄存器为SI和DI,SI称为源变址寄存器,DI称为目的变址寄存器,一般情况下两个变址寄存器用法相同,只是在数据串操作时有源和目的之分。MOVAL,100[SI];MOVAX,[DI+200];变址寻址和基址寻址用法相同,通常用来访问一维数组。MOVAL,VAR[SI];VAR是用DB定义的字节数组首地址,SI若等于0,则访问数组的第一个元素,SI若等于1,则访问数组的第二个元素。2.2.7.
基址变址寻址.
将BX、BP和SI、DI寄存器及偏移量组合起来进行寻址称为基址变址寻址。EA={BX或BP}+{SI或DI}+disp可有以下几种组合[BX+SI+disp];[BX+DI+disp];[BP+SI+disp];[BP+DI+disp];基址变址寻址方式地址表达式的几种合法形式MOVAL,100[BX][SI]ADDAL,[BX+SI+100]ADDAL,[BP+DI]+var;设VAR是字节变量ADDAL,[BP+DI]+100ADDAL,[BX]+[SI]+1002.2.8比例变址寻址80386及后继微处理器可用地址表达式中含有变址寄存器和比例因子。比例因子可以是1、2、4、8。不带比例因子的可认为比例因子是1。如MOVEBX,ARRAY[ESI×4]每次操作后,只要使ESI+1,而不是+4,就可以访问下一个双字元素。2.2.9基址比例变址寻址80386及后继微处理器可用80386后的微机,8个32位寄存器EAX….EDI,每一个都可作为基址寄存器,每一个又都可作为变址寄存器,基址比例变址寻址就是两个32位寄存器(其中1个带比例因子)的内容构成地址表达式。例MOVECX,[EDI×4+EAX]MOVEAX,[ESI×4+EBX]在80386~Pentium,8个32位通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP都可以作为地址寄存器。在8086中指令MOVBX,[AX]是非法的,因为只有(SI,DI,BX,BP)可以作为地址寄存器。在Pentium中,MOVEBX,[EAX]是合法的。在8086中movax,bl非法,因为类型不同在Pentium中,允许下列指令MOVZXEAX,BL;BL零扩展后送EAXMOVSXEAX,BL;BL符号扩展后送EAX设BL=80H2.2.10存储器寻址及段基或段选择字的确定1、存储器寻址与地址表达式若指令操作的数据在存储器的数据区,相应的寻址方式叫存储器寻址。包括直接寻址、寄存器间接寻址、基址寻址、变址寻址、基址变址寻址及386后的比例变址寻址和基址比例变址寻址。这个由汇编程序根据寻址方式计算得到的偏移地址通常称为有效地址EA(affectveaddress)。不同的寻址方式都可用用地址表达式概括。2、存储器寻址中段寄存器的确定80X86的存储器总是分段使用的,要指出操作数的地址,除了偏移地址(由寻址方式确定)外,还要由段基址。变量有段属性,当指令中给出变量名时,选择哪个段寄存器的值作为段基址(或段选择字)是由变量定义时确定的,但很多情况下指令中不用变量名访问存储器。选择哪个段寄存器的值作为段基址(或段选择字)呢?80X86有一个基本约定,只要指令不特别说明要超越(临时改变)这个约定,就按这个约定来寻找操作数。取指令:偏移地址IP(EIP)约定段寄存器CS(不允许超越)堆栈操作(PUSH、POP、CALL、RET中断等):偏移地址SP(ESP)约定段寄存器SS(不允许超越)数据存取(地址表达式中不出现BP或EBP寄存器)偏移地址EA约定段寄存器DS(允许超越)例:MOVAL,[1000H]MOVAL,[SI]MOVAL,[DI+100]ADDAL,[BX+SI+100H]数据存取(地址表达式中出现BP或EBP寄存器)偏移地址EA约定段寄存器SS(允许超越)字符串处理指令源串偏移地址SI(ESI)约定段寄存器DS(允许超越)字符串处理指令目的串偏移地址DI(EDI)约定段寄存器ES(不允许超越)如何实现段超越?加段超越前缀,例MOV[DI],ALMOVES:[DI],AL其中ES是前缀字节,译成机器码时,放在指令的前边。MOV[DI],AL的机器码是8805MOVES:[DI],AL的机器码是2688052.3常用指令80X86具有复杂的指令系统其中常用指令分为以下几类:传送指令算术运算指令逻辑运算和移位指令控制转移指令串操作指令2.3.1数据传送类指令数据传送类指令包括通用数据传送指令;扩展传送指令;数据交换指令;堆栈操作指令;地址传送指令;查表转换指令六类。1.)通用传送指令(1)最基本的传送指令MOV指令格式:MOV目的操作数,源操作数目的操作数可以是:累加器、通用寄存器、除CS之外的段寄存器、存储器源操作数可以是:累加器、通用寄存器、段寄存器、存储器、立即数.源和目的类型要一致.源和目的不可同为存储器1.)通用传送指令源为立即数时,目的不可段寄存器用BX、SI、DI间接寻址时,默认的段寄存器是DS,用BP间接寻址时,默认的段寄存器是SS。但可以使用段超越前缀临时改变这种默认。例MOVAX,BXMOVAL,DHMOVCX,DIMOVES,AXMOVBX,CSMOVBP,SIMOVAL,28HMOVBX,1000MOVSI,OFFSETTABLEMOVSP,0A002HMOVAL,XMOVAX,[SI]MOVLAST[BX+DI],DLMOVSI,ES:[BP]MOVDS,100[BX+SI]MOV[1000H],ESMOVALFA,25MOVES:MSM[BP],300AHMOVBYTEPTR[SI],23MOVWORDPTR[2000H],20Hwordptr和byteptr的作用moval,23hmovax,23hmov[si],23hmov[2000h],23hmovbyteptr[si],23hmovwordptr[2000h],23h例判断下列指令是否合法?
MOVAL,BXMOVBX,ALMOVAL,260HMOV[SI],23HMOVDS,2000HMOVAX,CSMOVCS,SIMOVAL,[DX]MOVAX,ARRAY;ARRAY是变量名2、扩展传送指令(80386后)(1)符号扩展传送指令指令格式MOVSXreg,source指令意义,对源操作数中的8位或16位符号数扩展,形成16位或32位补码数例:MOVSXEAX,BX若执行前BX=8765H,执行后,EAX=FFFF8765H(2)零(zero)扩展传送指令指令格式MOVZXreg,source指令意义,对源操作数中的8位或16位无符号数扩展,形成16位或32位无符号数。例MOVZXEAX,BL指令若执行前BL=89H,执行后EAX=00000089H3、数据交换指令(1)字节、字和双字交换指令指令格式:XCHGdest,source将源地址的内容与目的地址的内容交换可以有三种形式XCHGREG,REGXCHGREG,MEMXCHGMEM,REG例交换字变量W1和字变量W2的内容MOVAX,W1XCHGAX,W2MOVW1,AX不用交换指令,程序会长一些MOVAX,W1MOVBX,W2MOVW2,AXMOVW1,BX(2)32位通用寄存器中4字节交换指令(80486以后可用)指令格式BSWAPreg指令的意义是把32位寄存器的第1字节与第4字节交换,第2字节与第3字节交换。例BSWAPEAX若执行前EAX=12345678H执行后EAX=78563412H4、栈操作指令(1)堆栈的概念现代计算机,堆栈是在存储器中开辟的一片数据存储区,这片存储区的一端固定,另一端活动,且只允许数据从活动端进出。堆栈中的数据遵循“先进后出”的原则。堆栈的活动端称为栈顶,固定端称为栈底。对80X86,堆栈必须存放在堆栈段,其段地址存放于堆栈段寄存器SS中。因为栈顶是活动的,所以需要有一个指示栈顶位置的寄存器,叫堆栈指示器,它总是指向栈顶。当堆栈地址长度为16位时用SP作堆栈指示器,当堆栈地址长度为32位时用ESP作堆栈指示器。80X86的堆栈的伸展方向是从高地址向低地址。80X86的堆栈操作是字(16位)操作或双字(32位)操作。把一个数据压入堆栈也称为进栈,进栈时堆栈指示器自动减2或减4。把把一个数据从堆栈中弹出称为出栈,出栈时堆栈指示器自动加2或加4。堆栈的设置主要解决多级中断、子程序嵌套、递归调用等难以处理的实际问题。利用堆栈还可以保护现场,在主程序与子程序之间传递参数等。中断响应时,由中断隐指令自动实现将断点压入堆栈,通过执行中断返回指令,从堆栈中弹出返回地址(恢复断点)。调用子程序时,用CALL指令实现将返回地址压入堆栈,通过执行返回指令,从堆栈中弹出返回地址。若要在中断服务程序保存现场与恢复现场则要使用进栈指令PUSH和出栈指令POP。(2)进栈指令PUSHsourceSource可以是16(32)位通用寄存器、段寄存器、存储器字或双字单元。80386及以后的CPU允许将立即数(用PTR算符说明类型)压入堆栈。例如PUSHAX;设AX的内容是1234H。SP=0040HSP=003EH1234执行前执行后(3)出栈指令POPdest出栈指令的意义:弹出栈顶元素到destdest可以是:字或双字通用寄存器,除CS之外的段寄存器或存储器。如果dest是类型不明的存储器时,需要用PTR算符说明其类型属性。例如POPAXPOPWORDPTR[SI]利用堆栈可以将两个存储字(W1和W2)交换。PUSHW1PUSHW2POPW1POPW2因为W1、W2都有类型属性,不必加PTR算符。(4)全部通用寄存器进栈指令PUSHA/PUSHAD和出栈指令POPA/POPAD(80386后)PUSHA将16位通用寄存器按以下顺序进栈AX、CX、DX、BX、SP(指令执行前的值)、BP、SI、DI。执行后SP-16。PUSHAD将32位通用寄存器依次进栈,进栈顺序是:EAX、ECX、EDX、EBX、ESP(指令执行前的值)、EBP、ESI、EDI。指令执行后ESP-32。POPA将8个栈顶元素(字)按PUSHA指令相反的顺序弹出到8个16位通用寄存器。POPAD将8个栈顶元素(双字)按PUSHAD指令相反的顺序弹出到8个32位通用寄存器。(5)状态标志寄存器的进栈指令和出栈指令PUSHF16位状态标志寄存器进栈POPF16位状态标志寄存器出栈PUSHFD32位状态标志寄存器进栈POPFD32位状态标志寄存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医生8月工作总结和9月份工作计划
- 小学实习班主任年度工作计划范文
- 二年级班主任教学计划
- 2024年度音频节目配音及制作合同3篇
- 理化教研组教学工作计划
- 2024健康教育季度工作计划范例
- 手术室护士个人工作计划范文格式
- 2024年城市更新拆迁居间协议样本版A版
- 2024年度KTV设备采购与维护合同2篇
- 二零二四年度体育赛事转播租赁合同3篇
- 五年级家长会英语老师发言(课堂PPT)
- 深度学习数学案例(课堂PPT)
- hp设备巡检报告
- 卧式钻床液压系统设计课件
- 水库维修养护工程施工合同协议书范本
- 铁路防护栅栏施工组织设计方案最终
- 塑胶材料的特性
- 高处作业教案(共47页)
- MS培养基及配制注意事项
- ASMEB16.5-2003-中文版
- 课程设计 二级直齿圆柱齿轮减速器设计.doc
评论
0/150
提交评论