版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章汇编语言程序设计基本方法3.1汇编语言基本概念3.28086/8088指令系统3.3汇编语言程序设计的基本方法2010.2.2513.1汇编语言基本概念任何一种语言,都规定了一系列用于编写程序的语句和应该遵守的语法规则。汇编语言,根据汇编语言的语句和其语法规则,就可以写出汇编语言程序。3.1.1汇编语言2010.2.2523.1汇编语言基本概念计算机语言的分类 1.高级语言 如c语言、c++、b语言等 2.低级语言 如汇编语言、机器语言3.1.1汇编语言与高级语言2010.2.2533.1汇编语言基本概念1.高级语言与CPU无关3.1.1汇编语言与高级语言的区别2.汇编语言与CPU密切相关汇编语言语句与机器的种类和型号密切相关,需要对处理器的结构有更加深入的了解。2010.2.2543.1汇编语言基本概念3.1.1汇编语言与高级语言的区别例如:X=A+B高级语言(如C语言):X=A+B汇编语言:1.需指出A、B存放在何处2.相加后,结果存放在何处如:MOVAX,A MOBBX,B ADDAX,BX2010.2.2553.1汇编语言基本概念机器语言:
它的每一条语句就是计算机的可以直接执行的指令,这些指令以二进制的形式表示。3.1.1汇编语言与机器语言例如:(AX)+2(AX)其机器语言指令为:0000010100000010
00000000B(050200H)优点:可以直接执行缺点:不易书写,不易检查。2010.2.2563.1汇编语言基本概念汇编语言:
其基本思想是采用一组字母、数字或符号来代替一条二进制码表示的指令。3.1.1汇编语言与机器语言例如:(AX)+2(AX)
ADDAX,02
优点:易书写,易检查缺点:需要汇编成机器代码才能执行。2010.2.2573.1汇编语言基本概念源程序:采用助记符指令(汇编语言)写成的程序。目标程序:源程序翻译成的机器语言程序。汇编过程(汇编):将源程序翻译成目标程序的过程。计算机只能执行二进制的机器语言程序。源程序目标程序汇编ADDAX,020000010100000010
00000000B2010.2.2583.1汇编语言基本概念汇编语言:一种低级语言。有操作符和操作数等汇编语言程序:用汇编语言书写的程序,也叫汇编语言源序。汇编程序:将汇编语言程序翻译成机器语言程序的软件。如MASM。汇编:将汇编语言程序翻译成机器语言程序的过程3.1.1汇编语言与机器语言2010.2.2593.1汇编语言基本概念指令:可由汇编程序翻译成机器语言指令,从而使CPU产生动作,指令在程序执行时才处理的语句。 例如:ADDAX,023.1.1汇编语言与机器语言汇编语句:
1.指令 2.伪指令伪指令:不被翻译成机器语言指令,不产生CPU动作,伪指令是为汇编程序在汇编时候用的。 例如:STRDB‘STUDENT’;定义了一个字符串2010.2.25103.1.2汇编语言语句格式名称空格:操作助记符空格操作数注释;例如:
CYCLE:ADDAX,02 ;(AX)(AX)+2
DATA1DB20H,30H,40H
DISPLAYPROCFAR2010.2.25113.1.2汇编语言语句格式名称空格:操作助记符空格操作数注释;1.名称(非必需) 1.标识符,可由字母(a~z),数字(0~9)及特殊符号(?、·、@、_、$)组成,不分大小写。 如: loop1stude3?.data2010.2.25123.1.2汇编语言语句格式名称空格:操作助记符空格操作数注释;1.名称(非必需) 2.必须由字母打头,若名字有圆点,则圆点有必须用作第一个字符,数字不能做第一个字符。
如: c 2data@string*cccc1proc.2010.2.25133.1.2汇编语言语句格式名称空格:操作助记符空格操作数注释;1.名称(非必需) 3.构成字符的字符总数可多达31个,若超过31个字符,则31个字符以后的字符无效。
cdae123456987777777777777777777(31个)
cdae123456987777777777777777777mm cdae123456987777777777777777777002010.2.25143.1.2汇编语言语句格式名称空格:操作助记符空格操作数注释;名称
名称不是所有语句必需的。大多数情况下,名称表示的是名称后面各项在内存存放的第一个内存单元的地址(段地址和偏移地址)。DATA1DB20H,30H,40H,50H20HDATA12000:0010H30H2000:0011H40H2000:0012H50H2000:0013H假如:(DS)=2000H那么:DATA1表示的地址就是
2000:0010H
名称----空格代表变量冒号代表标号2010.2.2515汇编语言语句格式名称空格:操作助记符空格操作数注释;2.操作助记符(必需)
指明该语句的基本功能。它是语句的必要部分。 操作助记符是汇编语言中规定了明确含义的一组符号,所有不能随意使用。ADD加法助记符DB定义字节变量的伪指令助记符2010.2.2516汇编语言语句格式名称空格:操作助记符空格操作数注释;3.操作数(非必需) 语句中的操作数可以是数据本身,也可以是指出如何获得操作数的信息。例如: ADDAX,2第一个操作数:AX,指出操作数存放在AX中;第二个操作数:2,指出操作数就是数据本身。2010.2.2517汇编语言语句格式名称空格:操作助记符空格操作数注释;3.操作数(非必需)操作数不是语句必需的。若语句为指令,语句中可以没有操作数,也可以有1~2个操作数;若语句为伪指令,可以有多个操作数。当语句中有2个或2个以上操作数时,操作数之间应用逗号分隔,而操作数与助记符之间必须用空格分隔。例如: ADDAX,02 DATA1 DB20H,30H,40H,50H2010.2.2518汇编语言语句格式名称空格:操作助记符空格操作数注释;4.注释注释仅用作语句或程序段的说明,它不是程序的可执行部分,汇编时不形成任何目标码。注释必须以分号开头。它可以作为语句的一部分,也可以作为一个单独的语句。例如:
CYCLE:ADDAX,02 ;(AX)(AX)+2
;thisisasimpleprogram.2010.2.2519汇编语言语句格式名称空格:操作助记符空格操作数注释;总结:只有操作助记符是必须的,而其它都不是必须的。最完整的语言: CYCLE:ADDAX,02 ;(AX)(AX)+2最简单的语言: STD2010.2.25203.1.3汇编语言中的常数和表达式1.常数(1)数值常数:十进制、八进制、十六进制、二进制等,缺省形式是十进制;(2)字符串常数:用单引号括起来。数值常数:10100000B,178D,23H字符串常数:‘welcometoluoyang’2010.2.25213.1.3汇编语言中的常数和表达式字符串是由单引号括起来的,定义时候,一般被存储在数据段,且存储的是每个字符的ASII码。如:‘abc’ 61H,62H,63H‘123’ 31H,32H,33H2010.2.25223.1.3汇编语言中的常数和表达式00001100(ds):000000110001(ds):000100110010(ds):0002字符串是由单引号括起来的,定义时候,一般被存储在数据段,且存储的是每个字符的ASII码。 12 ‘12’2010.2.25233.1.3汇编语言中的常数和表达式需要说明的是: 汇编语言中的数值常数的第一位必须是数字,否则汇编时候将被看成是标示符 例如: 十六进制的FFH,必须写出0FFH。MOVAX,FF00H;将一个变量送入AXMOVAX,0FF00H;将0FF00H送入AX中。2010.2.25243.1.3汇编语言中的常数和表达式2.表达式表达式由操作数和操作符组成,操作数可以是常数,可以是标识符,也可以是子表达式。如:
常数:75+69
标识符:VBLEVA
2010.2.25253.1.3汇编语言中的常数和表达式2.表达式操作符可以分为算术表达式、逻辑表达式和关系表达式等。算术操作符:+、-、*、/、MOD。逻辑操作符:AND、OR、NOT、XOR。关系操作符:EQ、NE、LT、GT、LE、GE。2010.2.2526汇编语言中的常数和表达式
汇编语言中,表达式不能单独成句,只能作为语句的一部分。语句中表达式的求值在对源程序进行汇编连接时完成。
MOVBUF+2,ALADDAL,10+56;在汇编时变成ADDAL,66,然后在变成机器指令JMPAGAIN+3MOVBL,VBLEVA2010.2.25273.1.4标号变量伪指令一、标号
标号是由标识符表示的指令的名称,用以指示对应指令的位置(地址)。
定义方法:在指令的助记符前加上标识符和冒号 如:START:ADDAX,2;其机器指令为:050200h
名称空格:操作助记符空格操作数注释; 名称-----冒号代表标号
空格代表变量2010.2.25283.1.4标号变量伪指令一、标号
标号是由标识符表示的指令的名称,用以指示对应指令的位置(地址)。 如:START:ADDAX,2;其机器指令为:050200h
START表示ADDAX,2指令在内存单元存放的第一个内存单元的地址。05H2000:0010H02H2000:0011H00H2000:0012H假如(CS)=2000H,05H的偏移地址是0010H存储器START表示的是2000:0010H。2010.2.25293.1.4标号变量伪指令一、标号
有三种属性:段地址、偏移地址和类型。
段地址:是指该标号对应的指令所在段的段地址
偏移地址:是指该标号对应的指令在所在段的偏移地址
类型:NEAR和FAR
NEAR:表示该标号在段内使用,默认值
FAR:表示该标号在段间使用START:ADDAX,2;其机器指令为:050200hSTART表示的是2000:0010H。2010.2.25303.1.4标号变量伪指令一、标号的用途名称空格:操作助记符空格操作数注释; 名称-----冒号代表标号
空格代表变量标号可以作为程序转移指令的操作数—即要转向的地址START: ADDAX,2 ……… JMPSTART;表示要跳转到2000:0010处2010.2.25313.1.4标号变量伪指令二、变量变量定义 汇编语言中变量的值在程序运行期间是可以改变的。变量名DB表达式;定义字节变量变量名DW表达式;定义字变量变量名DD表达式;定义双字变量变量名DQ表达式;定义长字变量变量名DT表达式;定义一个十字节变量定义格式 通过伪指令定义的,其格式如下:变量名是一个标识符,后面不能加冒号,只能用空格,变量名不是必要的。变量名的类型跟后面的关键字DB,DW,DD,DQ,DT有关。2010.2.2532变量定义中的表达式可以是:①一个或多个常数或表达式。当为多个时中间用逗号隔开。②带引号的字符串。③一个问号“?”。只留出相应的存储空间,不存入新的值。④重复方式。此时表达式部分的格式为:
重复次数DUP(表达式)3.1.4标号变量伪指令2010.2.25333.1.4标号变量伪指令DATA1DB20HDATA2DW0204H,1000HDATA3DB(-1*3),(15/3)DATA4DD12345HDATA5DB‘0123’DATA6DW‘AB’,’C’,’D’DATA7DB?DATA8DW?DATA9DB2DUP(00)DATA10DW2DUP(?)20H04H02H00H10HFDH05H45H23H01H00H30H31H32H33H42H41H43H00H44H00H???0000????0100:0000H0001H0002H3456789ABCDEF0100:0010H123456789ABCD2010.2.2534标号变量伪指令2.变量的属性段地址(SEG):变量所在段的段地址。偏移地址(OFFSET):变量所在段内的偏移地址。类型(TYPE):变量的类型所定义的每个变量所占据的字节数,对于DB、DW、DD、DQ、DT定义的变量其类型分别为1、2、4、8、10。长度(LENGTH):变量定义时,一个变量名所定义的变量个数。在含有DUP操作符的变量中,变量名所定义的变量个数为定义格式中的重复次数。在其它各种变量定义中,每个变量名所定义的变量个数均为1。大小(SIZE):变量定义语句中,分配给一个变量名的所有变量的总的字节数,其值为该变量的类型与长度的乘积。2010.2.2535属性操作符及表达式1.获取属性的操作符 用下列的操作符来获取变量或标号的属性2010.2.2536属性操作符及表达式举例
例如: SEGDATA1 ;结果为0100H OFFSETDATA1 ;结果为0000H LENGTHDATA6 ;结果为1 TYPEDATA6 ;结果为2 TYPEDATA9 ;结果为1 LENGTHDATA9 ;结果为5 SIZEDATA9 ;结果为52010.2.2537属性操作符及表达式
表达式不能构成单独的语句,只能是语句的一个成分。例如: MOVAX,SIZEDATA9;将data9所占的字节数送AX MOVAX,SEGDATA1;将data1段地址送ax MOVBL,TYPEDATA9;将data9的类型(ax)=5(ax)=0100h(bl)=12010.2.2538属性操作符及表达式还可以如下定义变量DAT1DB02HDAT2DW0F00HDAT3DB5DUP(?)DAT4DBLENGTHDAT3;汇编时,此处的值为将dat3的长度5DAT5DWDAT3;汇编时,此处的值为dat3的偏移地址。 假如offsetdat3=0008h,则此句实际为
DAT5DW0008H2010.2.2539属性操作符及表达式类型:变量的类型:BYTEWORDDWORD
标号的类型:NEARFAR2.PTR操作符格式:类型PTR表达式功能:重新定义已定义的变量或标号的类型。2010.2.2540属性操作符及表达式这样的定义,DAT3是个字变量,0011h必须以字的形式出现。如果用MOVAL,55HMOVDAT3,AL;非法指令例如:DAT3DW0011H11H00H0020:00100020:0011DAT355H00H0020:00100020:0011DAT32010.2.2541属性操作符及表达式用PTR重新定义DAT3:MOVAL,55HMOVBYTEPTRDAT3,AL例如:DAT3DW0011H11H00H0020:00100020:0011DAT355H00H0020:00100020:0011DAT3需指出的是,变量DAT3仅在该语句中作为字节变量使用,DAT3原来定义的字变量类型并没有被修改。2010.2.25423.28086/8088指令系统指令系统是处理器所能完成的所有指令的集合。它在处理器设计时就确定了的,所以不同的处理器,其指令系统是中所包含的具体指令将是各不相同的。2010.2.25433.28086/8088指令系统3.2.1数据传送类指令3.2.2算术运算类指令3.2.3逻辑运算类指令3.2.4移位指令和循环移位指令3.2.5处理机控制类指令 转移和循环控制指令 调用和返回指令 字符串操作指令 输入和输出指令2010.2.2544指令操作数的表达2010.2.2545学习指令的注意事项指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式。指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式。指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响。其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等。2010.2.25463.2.1数据传送类指令14条指令分5组:1.通用数据传送:MOVXCHGXLAT2.堆栈操作:PUSHPOP3.标志寄存器传送:
LAHFSAHFPUSHFPOPF4.地址传送:LEALDSLES5.输入输出:INOUT
把数据从一个位置传送到另一个位置。2010.2.2547重点掌握:MOVPUSHPOP特别熟悉:XCHGXLATLEA一般了解:LAHFSAHFPUSHFPOPFLDSLES以后展开:INOUT3.2.1数据传送类指令本节要求:数据传送是计算机中最基本最重要的一种操作,传送指令也是最常使用的一类指令。除标志寄存器传送指令外,均不影响标志位。2010.2.2548传送指令MOV(move)格式:MOVDST,SRC功能:把一个字节或字的操作数从源地址传送至目的地址。MOVreg/mem,imm
;立即数送寄存器或主存MOVreg/mem/seg,reg
;寄存器送(段)寄存器或主存MOVreg/seg,mem
;主存送寄存器MOVreg/mem,seg
;段寄存器送寄存器或主存操作数存放在:1.指令中,imm2.寄存器中,reg3.存储器中,mem2010.2.2549传送指令MOV(move)MOVAL,4 ;AL←4,字节传送MOVCX,0FFH ;CX←00FFH,字传送MOVSI,200H ;SI←0200H,字传送MOVBYTEPTR[SI],0AH
;DS:[SI]←0AH,BYTEPTR说明是字节操作MOVWORDPTR[SI+2],0BH;DS:[SI+2]←0BH;DS:[SI+3]←00H,WORDPTR说明是字操作注意:要明确指令是字节操作还是字操作。例1:立即数传送MOVreg/mem,imm
;立即数送寄存器或主存2010.2.2550传送指令MOV(move)例2:寄存器传送MOVAX,BXMOVAH,ALMOVDS,AXMOV[BX],ALMOVreg/mem/seg,reg
;寄存器送(段)寄存器或主存2010.2.2551传送指令MOV(move)例3:存储器传送MOVAL,[BX]MOVDX,[BP];DX←SS:[BP]MOVES,[SI];ES←DS:[SI]MOVreg/seg,mem
;主存送寄存器2010.2.2552传送指令MOV(move)例4:段寄存器传送MOV[SI],DSMOVAX,ESMOVreg/mem,seg
;段寄存器送寄存器或主存2010.2.2553举例:MOVAL,4[DI]假如:(DI)=0400H则:EA=0404H传送指令MOV(move)0AH0BH(DS):0404H(DS):0403H(DS):0402H(DS):0405H00001010BAL用逻辑地址来确定内存单元,无需知道ds的值。2010.2.2554举例:MOVAX,[BX+2]假如:(BX)=1000H则:EA=1002H传送指令MOV(move)04H02H(DS):1002H(DS):1001H(DS):1000H(DS):1003H00000010BAH00000100BAL2010.2.2555举例:MOV[BX][DI],DX假如(BX)=0400H (DI)=1000H则:EA=1400H传送指令MOV(move)00H04H(DS):1400H(DS):1401H00000100BDH00000000BDL2010.2.2556传送指令MOV(move)定义如下变量20H(DS):0000HDATA100H(DS):0001H30H(DS):0002H00H(DS):0003H50H(DS):0004HDATA260H(DS):0005H70H(DS):0006H?(DS):0007HDATA3??……….??(DS):0007H(DS):0025H(DS):0026HDATA1(DS):0000HDATA2(DS):0004HDATA3(DS):0007HDATA1DW20H,30HDATA2DB50H,60H,70HDATA3DW10HDUP(?)2010.2.2557传送指令MOV(move)定义如下变量
DATA1DW20H,30HDATA2DB50H,60H,70HDATA3DW10HDUP(?)20H(DS):0000HDATA100H(DS):0001H30H(DS):0002H00H(DS):0003H50H(DS):0004HDATA260H(DS):0005H70H(DS):0006H?(DS):0007HDATA3??……….??(DS):0007H(DS):0025H(DS):0026HDATA1(DS):0000HMOVAX,DATA1等效:
MOVAX,[0000H];默认的是DS20H00HALAH2010.2.2558传送指令MOV(move)定义如下变量
DATA1DW20H,30HDATA2DB50H,60H,70HDATA3DW10HDUP(?)20H(DS):0000HDATA100H(DS):0001H30H(DS):0002H00H(DS):0003H50H(DS):0004HDATA260H(DS):0005H70H(DS):0006HFFH(DS):0007HDATA355H?……….??(DS):0007H(DS):0025H(DS):0026HDATA3(DS):0007H
MOVDATA3,BX等效:
MOV[0007H],BX;默认的是DSFFH55HBLBH2010.2.2559传送指令MOV(move)定义如下变量
DATA1DW20H,30HDATA2DB50H,60H,70HDATA3DW10HDUP(?)20H(DS):0000HDATA100H(DS):0001H30H(DS):0002H00H(DS):0003H50H(DS):0004HDATA260H(DS):0005H70H(DS):0006HFFH(DS):0007HDATA355H?……….??(DS):0007H(DS):0025H(DS):0026HDATA2(DS):0004H
MOVAL,DATA2[DI]
等效:MOVAL,[0005H];默认的是DSAL
假如(DI)=1。则EA=0004H+1=0005H60H2010.2.2560传送指令MOV(move)定义如下变量
DATA1DW20H,30HDATA2DB50H,60H,70HDATA3DW10HDUP(?)20H(DS):0000HDATA100H(DS):0001H30H(DS):0002H00H(DS):0003H50H(DS):0004HDATA260H(DS):0005H70H(DS):0006HDDH(DS):0007HDATA323H?……….??(DS):0007H(DS):0025H(DS):0026HDATA3(DS):0007H
MOVDATA3[SI],DX
等效:MOV[0007H],DX;默认的是DS
假如(SI)=0。则EA=0007H+0=0007HDDH23HDLDH2010.2.2561传送指令MOV(move)定义如下变量
DATA1DW20H,30HDATA2DB50H,60H,70HDATA3DW10HDUP(?)20H(DS):0000HDATA100H(DS):0001H30H(DS):0002H00H(DS):0003H50H(DS):0004HDATA260H(DS):0005H70H(DS):0006H?(DS):0007HDATA3??……….??(DS):0007H(DS):0025H(DS):0026HMOVBX,SIZEDATA3SIZEDATA3=2*10H=20H故(BX)=0020H
MOVSI,OFFSETDATA2OFFSETDATA2=0004H故(SI)=0004HMOVCX,LENGTHDATA3LENGTHDATA3=10H故(CX)=0010H2010.2.2562传送指令MOV(move)操作数的类型: 当操作数是寄存器时,其类型(TYPE)是确定的;
当操作数是立即数、某种方式所指的内存单元时,其类型有时是确定的,有时是不确定的。确定的,如下:例如: DATA3DB02H,03H,04H MOVSI,1 ;操作数是SI,16位。
MOVDATA3[SI],02;操作数类型取决于DATA3,8位 ;SI是寄存器间接寻址,[SI]表示一个偏移地址,没有类型2010.2.2563传送指令MOV(move)操作数的类型: 当操作数是寄存器时,其类型是确定的;
当操作数是立即数、某种方式所指的内存单元时,其类型有时是确定的,有时是不确定的。不确定的,如下: MOV4[DI],02;操作数不确定,是非法指令必须用PTR操作符来指明其操作类型。格式如下:MOVBYTEPTR4[DI],022010.2.2564传送指令MOV(move)当然,操作数和目的操作数必须一致,否则,指令为非法指令。 例如合法指令: MOVAX,BX 非法指令:
DATA1DW05H,15H,20H DATA2DB0FH,10H,0AH DATA3DB5DUP(?) MOVAX,BL
MOVAL,DATA1
MOVBX,DATA3[SI]2010.2.2565传送指令MOV(move)立即数段寄存器DSESSSCSAXAXBX BXCXCXDXDXSISIDIDISPSPBPBP存储器2010.2.2566传送指令MOV(move)操作数存在的地方: 1.立即数;不具有存储功能 2.寄存器;具有存储功能 3.存储器;具有存储功能寄存器: 通用寄存器AX/BX/CX/DX/DI/SI/BP/SP 段寄存器DS/ES/SS/CS
2010.2.2567传送指令MOV(move)合法传送种类通用寄存器 通用寄存器通用寄存器 存储器存储器 段寄存器DS/ES/SS
段寄存器DS/ES/SS 通用寄存器之间立即数 存储器立即数 通用寄存器
CS 存储器
CS 通用寄存器立即数和CS不能作为目的操作数2010.2.2568传送指令MOV(move)非法传送种类存储器 存储器 MOV[2000H],[3000H]
段寄存器 段存储器 MOVDS,ES存储器 立即数 MOV20,[2000H]
通用寄存器 立即数 MOV20,AX
存储器 CS MOVCS,[2000H]
通用寄存器 CS MOVCS,AX
立即数 段寄存器 MOVDS,0056H立即数和CS不能作为目的操作数2010.2.2569传送指令MOV(move)判断是否非法MOV[2200H],[3200H]MOVSS,ESMOV10,[2000H]MOV50,AXMOVCS,[2000H]MOVCS,AXMOVDS,0056H2010.2.2570传送指令MOV(move)例:实现存储器之间的数据传送buffer1单元的数据传送到buffer2单元(buffer1和buffer2都在内存中)buffer1AXbuffer2MOVAX,buffer1 ;AX←buffer1(将buffer1内容送AX)MOVbuffer2,AX ;buffer2←AX;这里buffer1和buffer2是两个字变量;实际表示直接寻址方式2010.2.2571传送指令MOV(move)55HAAH(DS):0000H(DS):00FFHBUFFER1BUFFER2MOVAX,buffer1 55HAAHALAHMOVbuffer2,AX 55HAAHAX2010.2.2572传送指令MOV(move)例:实现立即数给段寄存器赋值 MOVAX,SEGDATA1;这里必须是AX MOVDS,AX;(DS)=2000H55HAAH……………….2000:0000HDATA12010.2.2573传送指令MOV(move)总结: 1.存储器之间不能直接传送数据 2.段寄存器之间不能直接传送数据 3.CS和立即数不能作为目的操作数 4.立即数不能直接给段寄存器赋值2010.2.2574有效地址传送指令LEA(loadEA)格式:LEAr16,mem
;r16←mem的有效地址功能:将存储器操作数的有效地址传送至指定寄存器中例: LEAAX,[2500H]其功能是将[2500H]的有效地址传送给AX,所有执行指令后,AX里的内容(AX)=2500H。注:源操作数只能是存储器寻址方式,不能使立即数和寄存器寻址方式;
目的操作数不能是段寄存器。 LEAAX,2500H ;源操作数是立即数,为非法指令 LEAAX,BX ;源操作数是寄存器,为非法指令 LEADS,[2500H] ;目的操作数为段寄存器,为非法指令2010.2.2575有效地址传送指令LEA(loadEA)格式:LEAr16,mem
;r16←mem的有效地址功能:将存储器操作数的有效地址传送至指定寄存器中区别LEA指令和MOV指令。LEAAX,10H[DI]MOVAX,10H[DI]假如(DS)=0200H,(DI)=0500H,EA=0500H+01H=0510HFFH0200H:0510H00H0200H:0511HLEAAX,10H[DI];(AX)=0510HMOVAX,10H[DI];(AX)=00FFH2010.2.2576练习定义字变量DAT,并赋初值0100H,0210H,3312H将DAT变量的偏移地址送到寄存器SI中利用SI,寄存器相对寻址方式将0210H,送到AXDATDW0100H,0210H,3312HLEASI,DATMOVAX,1[SI]2010.2.2577取地址指针指令(LDS,LES)格式:LDS/LESDST,SRC功能:将源操作数SRC的有效地址所对应的内存单元中的32位内容分别送给DS(或者ES)和指令所指出的寄存器中。注: 源操作数只能是存储器寻址方式,不能使立即数和寄存器寻址方式; 目的操作数不能是段寄存器(因为要存储32位数据)。 LDSDI,2500H ;源操作数是立即数,为非法指令 LESES,BX ;源操作数是寄存器,为非法指令 LDSSS,[2500H] ;目的操作数为段寄存器,为非法指令2010.2.2578取地址指针指令(LDS,LES)有下面的便令定义和指令:TABLEDB10H,20H,30H,40,50HPOINT1DD02001000H
POINT2DDTABLELDSDI,POINT1LESSI,POINT210H0100:0000HTABLE20H0100:0001H30H0100:0002H40H0100:0003H50H0100:0004H00H0100:0005HPOINT110H0100:0006H00H0100:0007H02H0100:0008H00H0100:0009HPOINT200H0100:000AH00H0100:000BH01H0100:000CH指令执行后:(DI)=1000H,(DS)=0200H(SI)=0000H,(ES)=0100H2010.2.2579标志传送指令LAHF,SAHFLAHF;AH←FLAG的低8位送到AH中功能:将标志寄存器的低8位送入寄存器AHSF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意。SFZFAFPFCF765432102010.2.2580标志传送指令LAHF,SAHFSAHF;FLAGS的低字节←AH功能:将AH寄存器内容送FLAGS的低8位。用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志SFZFAFPFCF76543210例如:MOVAH,0FH;(AH)=00001111B SAHF则:CF=1,PF=1,AF=0,ZF=0,SF=02010.2.2581交换指令XCHG(exchange)格式:XCHGDST,SRC
功能:源操作数SRC和目的操作数DST互换例如: MOVAX,0200H MOVBX,2200H XCHGAX,BX;(AX)=2200H.(AX)=0200H2010.2.2582交换指令XCHG(exchange)格式:XCHGDST,SRC
功能:源操作数SRC和目的操作数DST互换该指令是完成寄存器与寄存器或者寄存器和存储器之间内容的互换。但不能是段寄存器。交换指令可以在寄存器与寄存器之间对换数据交换指令可以在寄存器与存储器之间对换数据交换指令不能在存储器与存储器之间对换数据2010.2.2583换码指令XLAT(translate)格式:XLAT ;Al←DS:[BX+AL]功能:将EA(EA=(BX)+(AL))所对应的内存单元的一个字节数据送入AL,从而实现AL中的字节变换。1.换码指令执行前:在主存中建立一个字节表格,内容是要转换成的目的代码,表格的首地址存放于BX,将相对表格首地址的位移量存放在AL。2.然后,执行换码指令XLAT:将AL寄存器的内容转换为目标代码。隐含寻址2010.2.2584换码指令XLAT(translate)516234491826CODE1CODE205809773代码转换如右表:将表中的CODE1转换成代码CODE2。将CODE2的代码依次存入地址连续的内存单元中,其首地址TABLE送入BX中,将需要转换的一个CODE1代码送入AL中,执行XLAT指令后,AL中便是对应的CODE2的代码了。2010.2.2585换码指令XLAT(translate)01020409080605000703TABLETABLEDB05H,08H,06H,04H,09H,01H,02H,03H,00H,07H执行完后,51,(AL)=01H内存单元TABLE+5TABLE+9MOVAX,SEGTABLEMOVDS,AXMOVBX,OFFSETTABLEMOVAL,05XLAT2010.2.2586堆栈操作指令在程序设计中,堆栈是个非常有用的一种结构。在以下情况下会用到堆栈:
1.调用和返回子程序; 2.保存程序中的某些信息; 3.中断响应和返回堆栈是一种暂时保存数据的存储机构。它的操作规则是先进后出,后进先出。2010.2.2587堆栈操作指令堆栈通常是存储器的一部分。如右图,开辟了一个大小为256B(0000H~00FFH)的堆栈。上面是低地址,下面是高地址。堆栈区00FFH0000H0100H栈底高地址低地址SP:堆栈指针,又叫栈顶指针。永远指向栈顶。栈底:00FFH对应的内存单元。栈底是固定不变的。栈顶:SP指向的内存单元。随着数据的进栈出栈,栈顶在不断的移动(SP的值在不断的变化)内存单元SP2010.2.2588堆栈操作指令栈顶指针SP是一个16位的地址寄存器,用来存放堆栈区中栈顶内存单元的偏移地址,而堆栈区默认的段地址保存在SS中。堆栈操作指令只对字进行操作。压栈:首先SPSP-2,然后将数据压入堆栈。(如将8855H压栈。)出栈:首先将数据弹出堆栈,然后SPSP+200H00FFH0100H12HSP(SP)=00FEH(SP)=00FCH55H88H00H00FFH0100H12HSP(SP)=00FEH(SP)=00FEH88H55H压栈顺便表明:高地址对应高字节、低地址对应低字节2010.2.2589堆栈操作指令如右图:在内存中开辟了一个堆栈,其偏移地址为0000H~00FFH(256B)。刚开始,堆栈是空栈,栈顶指针指向0100H。即(SP)=0100H。堆栈区00FFH00FEH00FDH00FCH00FBH00FAH0000H0100H栈底高地址低地址SP01H向堆栈压入0102H。2.(SP)=00FEH,然后再压入0304H。3.(SP)=00FCH04H01H02H03H4.0304H出栈。(SP)=00FEH2010.2.2590堆栈操作指令堆栈的操作堆栈只有两种基本操作:进栈和出栈。对应两条指令:PUSH:压入堆栈指令POP:弹出堆栈指令2010.2.2591堆栈操作指令PUSHr16/m16/seg;进栈指令:;SP←SP-2;SS:[SP]←r16/m16/segPOPr16/m16/seg;出栈指令:;r16/m16/seg←SS:[SP];SP←SP+2堆栈的操作堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP。进栈:先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部;出栈:先把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2。2010.2.2592堆栈操作指令格式:PUSHSRC;(SP)(SP)-2,((SP+1),(SP))(SRC)功能:将操作数的内容送入堆栈,并修正堆栈指针SP的内容。指令操作必须是字操作;SRC可以是通用寄存器和段寄存器,也可以是内存单元,但不能是立即数。PUSH指令对FLAGREG的内容没有影响先修正SP的值,然后把数据压入堆栈2010.2.2593堆栈操作指令格式:PUSHSRC功能:将操作数的内容送入堆栈,并修正堆栈指针SP的内容。举例:PUSHAX;(SP)(SP)-2, ((SP+1),(SP))(SRC)PUSHDSPUSH[2000H]PUSHF;将标志寄存器(FLAGREG) 的内容压入堆栈。非法指令:PUSH2000H;操作数不能是立即数修改:MOVAX,2000H PUSHAX2010.2.2594堆栈操作指令 MOVAX,2000H;(SP)=00FEH PUSHAX首先SPSP-2,(SP+1)(AH),(SP)(AL)。00H00FFH0100H12HSP(SP)=00FEH(SP)=00FCH00H(AL)20H(AH)00FEH00FDH00FCH先修正SP,然后压入堆栈2010.2.2595堆栈操作指令格式:POPDST;(AX)((SP+1),(SP)),
(SP)(SP)+2功能:将SP所指向的栈顶的内容取出,并送入DST所指向的寄存器、内存单元或者标志寄存器,并修正堆栈指针SP的内容。指令操作必须是字操作;DST可以是通用寄存器和除了CS外段寄存器,也可以是内存单元,但不能是立即数。POP指令对FLAGREG的内容没有影响先弹出数据,然后再修正SP的值2010.2.2596堆栈操作指令格式:POPDST功能:将SP所指向的栈顶的内容取出,并送入DST所指向的寄存器、内存单元或者标志寄存器,并修正堆栈指针SP的内容。举例:POPAX;(AX)((SP+1),(SP)) (SP)(SP)+2,POPDSPOP[2000H]POPF;将SP所指向的栈顶内容取出,送入标志寄存器(FLAGREG),并修正SP的值。非法指令:POP2000H;操作数不能是立即数POPCS;操作数不能使CS2010.2.2597堆栈操作指令 POPAX;(SP)=00FCH首先,(SP)(AL),(SP+1)(AH),然后SPSP+2。00H00FFH0100H12HSP(SP)=00FEH(SP)=00FCH00H20H00FEH00FDH00FCHAHAL先弹出数据,再修正SP2010.2.2598堆栈操作指令堆栈用途:保存和恢复寄存器内容MOVSP,0100H ;对SP赋值PUSHAX ;AX内容压栈PUSHBX ;BX内容压栈PUSHCX………POPCXPOPBX ;弹出栈顶内容,送入BXPOPAX ;弹出栈顶内容,送入BX遵循:后进先出的原则。2010.2.2599标志寄存器出入堆栈PUSHF ;保存全部标志到堆栈POPAX ;从堆栈中取出全部标志ORAX,0100H ;设置D8=TF=1, ;AX其他位不变PUSHAX ;将AX压入堆栈POPF 将堆栈内容取到标志寄存器, ;即FLAGS←AX堆栈可用来: 置位单步标志2010.2.25100输入输出指令INAL/AX,i8/DX;AL/AX←I/O端口输入IN指令将外设数据传送给CPU内的AL/AXOUTi8/DX,AL/AX;I/O端口←AL/AX输出OUT指令将CPU内的AL/AX数据传送给外设功能:8086通过输入输出指令与外设进行数据传送。输入输出指令将在第4章详述2010.2.251013.2.2算术运算类指令实现二进制(和十进制)数据的四则运算1.加法运算:
ADDADCINC减法运算:SUB
SBB
DEC
NEG
CMP比较指令:CMP4.乘法运算:MUL
IMUL5.除法运算:DIV
IDIV6.符号扩展:CBW
CWD2010.2.25102四则运算是计算机经常进行的一种操作。算术运算类指令也是经常使用的一类指令。请注意算术运算指令对标志的影响。重点掌握:ADD/ADCSUB/SBBINC/DECCMP比较熟悉:
NEGMUL/IMULDIV/IDIV一般了解:CBWCWD3.2.2算术运算类指令2010.2.25103加法指令ADD(add)格式:ADDDST,SRC功能:(DST)
(DST)+(SRC),SRC保持不变。对标志寄存器有影响。举例:MOVAL,01H ;(AL)=01HMOVBL,02H ;(BL)=02HADDBL,AL ;(BL)=03H(AL)=01HDSTSRCDST+2010.2.25104加法指令ADD(add)SRC:立即数、通用寄存器和内存单元DST:通用寄存器、内存单元,但不能是立即数。合法指令:ADDAL,BLADDCX,08HADDAX,[SI]ADD[BX][DI],AXADDreg,imm/reg/mem
;reg←reg+imm/reg/memADDmem,imm/reg
;mem←mem+imm/reg非法指令:ADD0025H,AX;DST为立即数ADDWORDPTR[2020H],[3000H];两个操作数不能同时在内存单元2010.2.25105加法指令ADD(add)ADDAX,[SI];假如(AX)=004AH,(SI)=0100HEA=0100H0CH(DS):0100H02H(DS):0101H内存单元AX:0000000001001010+00000010000011000000001001010110(AX)=0236H(AX)(AX)+020CHOF=SF=ZF=PF=AF=CF=0010102010.2.25106加法指令ADD(add)需要指出的是:CF位-----无符号数而言OF位-----有符号数而言例如:MOVAX,0FDAAH MOVBX,0FBCEH ADDAX,BX1111110110101010+1111101111001110
11111100101111000OF=CF=01训练2010.2.25107带进位加法指令ADC(addwithcarry)格式:ADCDST,SRC;功能:(DST)(DST)+(SRC)+CF,结果影响标志寄存器DSTSRCDST+CF+例如:ADCAX,BX;(AX)(AX)+(BX)+CF注:CF位是由程序中本指令之前的指令产生的2010.2.25108加法指令ADC(adc)SRC:立即数、通用寄存器和内存单元DST:通用寄存器、内存单元,但不能是立即数。合法指令:ADCAL,BLADCCX,08HADCAX,[SI]ADC[BX][DI],AX非法指令:ADC0025H,AX;DST为立即数ADCWORDPTR[2020H],[3000H];两个操作数不能同时在内存单元ADCreg,imm/reg/mem
;reg←reg+imm/reg/mem+CFADCmem,imm/reg
;mem←mem+imm/reg+CF2010.2.25109带进位加法指令ADC(addwithcarry)无符号双字加法运算例如:MOVAX,0FDAAH MOVBX,0FBCEH
ADDAX,BX;CF=1
ADCAX,0001H1111110110101010+1111101111001110
1111110010111100011111001011110000000000000000001+11111100101111010CF=0训练2010.2.25110减法指令SUB(subtract)格式:SUBDST,SRC功能:(DST)(DST)-(SRC),结果影响标志寄存器DSTSRCDST-例如: MOVAL,05H ;(AL)=05H MOVBL,02H ;(BL)=02H SUBAL,BL ;(AL)=03H2010.2.25111减法指令SUB(subtract)SRC:立即数、通用寄存器和内存单元DST:通用寄存器、内存单元,但不能是立即数。合法指令:SUBAL,07HSUBAL,[200H] SUBAX,BX非法指令:SUBAL,BXSUB[3000H],[200H]SUB20,BXSUBreg,imm/reg/mem
;reg←reg-imm/reg/memSUBmem,imm/reg
;mem←mem-imm/reg2010.2.25112减法指令SUB(subtract)例如: MOVAX,0560H
MOVBX,0012HSUBAX,BX ;(AX)=054EH 0000010101100000 00000000000100100000010101001110OF=SF=ZF=PF=AF=CF=001010训练2010.2.25113带借位减法指令SBB(subtractwithborrow)格式:SBBDST,SRC功能:(DST)(DST)-(SRC)-CF,结果影响标志寄存器DSTSRCDST-CF-注:CF位是由程序中本指令之前的指令产生的2010.2.25114减法指令SBBSRC:立即数、通用寄存器和内存单元DST:通用寄存器、内存单元,但不能是立即数。合法指令:SBBAL,07HSBBAL,[200H] SBBAX,BX非法指令:SBBAL,BXSBB[3000H],[200H]SBB20,BXSBBreg,imm/reg/mem
;reg←reg-imm/reg/mem-CFSBBmem,imm/reg
;mem←mem-imm/reg-CF2010.2.25115带借位减法指令SBB(subtractwithborrow)MOVAL,05H ;(AL)=05HMOVAH,09H ;(AH)=09HSUBAL,AH ;(AL)(AL)-(AH)SBBAL,01H ;(AL)(AL)-01H-CF 0000010105H 0000100109H
111111100FCH-CF 11111100FCH 0000000109H111111010FAH-CF(AL)=FCH,CF=1OF=SF=ZF=PF=AF=CF=001001(AL)=FAH,CF=02010.2.25116带借位减法指令SBB(subtractwithborrow)举例:SBBCX,DATA1DST的寻址方式:SRC的寻址方式:功能:(CX)减去DATA1对应的内存单元中的一个字及CF的当前值,相减后结果返回寄存器CX,并设置标志寄存器的各位。寄存器寻址方式直接寻址方式其功能:(CX)(CX)–1728H-112780006HDATA10007H0008H存储器(CX)=3F50HDATA1对应的字为1728HCF=1.2010.2.25117带借位减法指令SBB(subtractwithborrow)举例:SBBCX,DATA128H(DS):0006H…….17H(DS):0007H内存单元……0011111101010000
000101110010100010010100000100111-CF(CX)=3F50HDATA1对应的字为1728HCF=1.OF=SF=ZF=PF=AF=CF=0010102010.2.25118取负指令NEG(negative)格式:NEGDST功能:(DST)0-(DST)并影响标志位。即将(DST)取负DST:其寻址方式可以是除了立即数外的其他各种寻址方式,但不能是段寄存器。例如1: NEGAX NEGBYTEPTR[DI] NEGDAT1[SI]例如2: NEG2500H NEGDS NEGCS2010.2.25119取负指令NEG(negative)DST如果是: 1.正数——绝对值相同的负数的补码; 2.负数——绝对值相同的正数.MOVAX,FFA0HNEGAX(AX)=0060H00000000000000000000H
1111111110100000FFA0H
10000000001100000
0060H-CF(FFA0)补码=8060H2010.2.25120取负指令NEG(negative)DST如果是: 1.正数——绝对值相同的负数的补码; 2.负数——绝对值相同的正数.MOVAX,0005HNEGAX(AX)=FFFBH00000000000000000000H
00000000000001010005H
11111111111111011FFFBH-CF(FFFB)补码=8005H2010.2.25121增量指令INC(increment)格式:INCDST功能:(DST)(DST)+1,并影响标志位,但不影响CF位DST:其寻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025大学食堂承包合同范本
- 工业生产车间钢结构楼梯施工协议
- 企业国际化发展战
- 住宅小区批荡施工合同
- 餐饮业授权经营的管理办法
- 投标联合体合规协议
- 会计审计合同管理规则
- 零售连锁公司广告牌安装施工合同
- 医疗技术合作保险
- 2024年特种用途树木研发与销售合同范本3篇
- 浙江大学医学院附属儿童医院招聘人员真题
- 2024年江苏省苏州市中考数学试卷含答案
- 软件测试汇报
- 吉林省长春市第一〇八学校2024-2025学年七年级上学期期中历史试题
- 2024年世界职业院校技能大赛高职组“市政管线(道)数字化施工组”赛项考试题库
- 初中《孙中山诞辰纪念日》主题班会
- 5.5 跨学科实践:制作望远镜教学设计八年级物理上册(人教版2024)
- 屠呦呦课件教学课件
- 阿斯伯格综合症自测题汇博教育员工自测题含答案
- 护理肝癌的疑难病例讨论
- 天津市2023-2024学年七年级上学期语文期末试卷(含答案)
评论
0/150
提交评论