《第2章数据定义与传送108.ppt》由会员分享,可在线阅读,更多相关《第2章数据定义与传送108.ppt(91页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、新新新新 编编编编汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计1 1第二章第二章 数据定义与传送数据定义与传送2.1 2.1 数据的定义数据的定义2.2 2.2 数据的传送数据的传送 2.3 2.3 汇编语言上机操作汇编语言上机操作 习题二习题二2 22.12.1 数据的定义数据的定义2.1.1 2.1.1 数据段数据段2.1.2 2.1.2 数据定义数据定义 3 3汇编语言程序定义的汇编语言程序定义的“数据数据”:(1)变量(Varible)有有一一个个名名字字,运运行行过过程程中中值值可可能能发发生生变变化化,可可以以有有“初始值”。(2)常数(Constant)常数可
2、以直接写在指令内,也可以存放在数据段内。常数可以直接写在指令内,也可以存放在数据段内。(3)缓冲区(Buffer)从从输输入入设设备备输输入入若若干干数数据据时时,在在数数据据段段里里事事先先留留出出必必要要的存储单元,称为的存储单元,称为“输入缓冲区”。输输出出一一批批数数据据时时,把把输输出出内内容容事事先先存存放放在在若若干干内内存存单单元元中,称为中,称为“输出缓冲区”。4 42.1.1 2.1.1 数据段数据段DATASEGMENT;在这里定义数据;在这里定义数据;DATAENDSDATA:程序员给这个段起的名字。程序员给这个段起的名字。SEGMENT:保留字,说明一个段从这里开始。
3、保留字,说明一个段从这里开始。ENDS:保留字,说明保留字,说明一个段到此结束。一个段到此结束。;分号后面的文字是分号后面的文字是“注释注释”,不参加汇,不参加汇编编伪指令:说明性的语句:说明性的语句语句:由一行文字构成,是由一行文字构成,是一条指令,或者定义一条指令,或者定义一组数据,或者是一一组数据,或者是一条条“伪指令伪指令”。5 52.1.2 2.1.2 数据定义数据定义数据定义伪指令数据定义伪指令:变量名变量名数据定义伪操作数据定义伪操作数据数据,数据,数据数据定义伪操作:数据定义伪操作:DB(DefineByte):):每个数据占用一个字节(每个数据占用一个字节(8b)DW(Def
4、ineWord):):每个数据占用一个字(每个数据占用一个字(16b)DD(DefineDoubleWord):):每个数据占用一个双字每个数据占用一个双字(32b)DQ(DefineQuartWord):):每个数据占用每个数据占用8个字节个字节(64b)DT(DefineTenWord):):每个数据占用每个数据占用10个字节(个字节(80b)6 6DATA SEGMENTXdb-1,255,A,3+2,?db“ABC”,0FFH,11001010BYdb3dup(?)DATA ENDS数据定义举例(数据定义举例(1):有符号数用它的补码存储有符号数用它的补码存储字符用字符用ASCII代码
5、存储代码存储db定义的数据在定义的数据在-128255之内之内变量名代表这个单元的地址变量名代表这个单元的地址?表示一个尚未确定的值表示一个尚未确定的值DUP表示重复定义表示重复定义7 7DSEG SEGMENTZDW-2,-32768,65535,ABWDw12345678H,-400000DWZ,W-ZDSEG ENDS数据定义举例(数据定义举例(2):DW定义的数据在(定义的数据在(-32768,65535)内)内出现在数据部分的变量名代表这个变量的出现在数据部分的变量名代表这个变量的偏移地址偏移地址多字节数据的高位存放在较高地址单元中多字节数据的高位存放在较高地址单元中8 8变量变量X
6、,Y,Z,W的属性的属性变量名变量名段属性段属性SEG偏移地址偏移地址OFFSET类类型型TYPE长长度度LENGTH大大小小SIZEXDATA0000H111YDATA000AH133ZDSEG0000H212WDSEG0008H2129 92.2 2.2 数据的传送数据的传送2.2.1 2.2.1 指令格式指令格式2.2.2 2.2.2 程序段程序段2.2.32.2.3基本传送指令基本传送指令2.2.4 2.2.4 其他传送指令其他传送指令2.2.5 2.2.5 堆栈堆栈2.2.62.2.6操作数表达式操作数表达式1010汇汇编编语语言言程程序序由由若若干干“语语句句”组组成成,每每个个“
7、语语句句”占占用用一一行。行。三种类型语句:三种类型语句:指指令令语语句句:包包含含一一条条符符号号指指令令,与与一一条条机机器器指指令令相相对对应应,汇汇编编以以后后成成为为这这条条机机器器指指令令的的二二进进制制代代码码,这这个代码被称为个代码被称为“目标目标(Object)”;伪伪指指令令语语句句:一一条条说说明明性性的的语语句句。有有的的伪伪指指令令语语句句汇汇编编后后没没有有“结结果果”,有有的的伪伪指指令令汇汇编编后后产产生生“目目标标”。注注释释行行:书书写写说说明明性性文文字字,不不进进行行“汇汇编编”,也也不不产产生生“目标目标”。11111 1 8080X86X86指令格式
8、指令格式标标号号:程程序序员员给给这这一一行行起起的的名名字字,后后面面跟跟上上冒冒号号,代代表表这这一一行的地址。标号用字母开始,不要使用保留字作为标号。行的地址。标号用字母开始,不要使用保留字作为标号。操作码是这条指令需要完成的操作,用指令助记符表示。操作码是这条指令需要完成的操作,用指令助记符表示。操作数操作数是指令的操作对象,指令的操作数可以是指令的操作对象,指令的操作数可以03个。个。两两个个操操作作数数时时,右右面面的的操操作作数数称称为为“源源操操作作数数”,左左面面的的操操作作数数称称为为“目目的的操操作作数数”。“源源操操作作数数”参参与与指指令令操操作作,不不保保存存结结果
9、果,内内容容不不会会改改变变。“目目的的操操作作数数”参参与与指指令令操操作作,还还保保存存指令的操作结果,指令执行后,目的操作数的内容被改变。指令的操作结果,指令执行后,目的操作数的内容被改变。;注释;注释用来添加一些说明,例如说明本行指令的功能。用来添加一些说明,例如说明本行指令的功能。标号标号:操作码操作码操作数操作数;注释注释12122操作数操作数寄存器操作数寄存器操作数:包括段寄存器,通用数据、地址寄存器。:包括段寄存器,通用数据、地址寄存器。例如:例如:MOVBX,AX功能:功能:AX寄存器内容送入寄存器内容送入BX寄存器。寄存器。AX是是“源源操操作作数数”,写写在在右右边边,指
10、指令令执执行行后后,它它的的内容不会被改变。内容不会被改变。BX是是“目目的的操操作作数数”,写写在在左左边边,指指令令执执行行后后,它它的内容将被改变。的内容将被改变。注意注意:寄存器:寄存器IP/EIP和和FLAGS/EFLAGS不能作为操作数出不能作为操作数出现在指令中。现在指令中。1313立立即即数数操操作作数数:二二进进制制/十十进进制制/十十六六进进制制常常数数,可可求求值值的的表表达式,字符,标号等都可以用作操作数。达式,字符,标号等都可以用作操作数。假设已经定义:假设已经定义:XDW150指令指令“MOVBX,X*2”是是错错误误的的,“变变量量”的的计计算算应应该该在在用用户
11、程序执行时进行,户程序执行时进行,“汇编程序汇编程序”不能对不能对“变量变量”进行计算。进行计算。常数常数300送入送入BX寄存器寄存器MOV BX,300或者:或者:MOV BX,150*2DATA段的段基址送段的段基址送DSMOV AX,DATAMOV DS,AX注意注意:立即数不能用作:立即数不能用作“目的操作数目的操作数”。1414为为了了对对存存储储器器的的一一个个单单元元进进行行访访问问,需需要要给给出出这这个个单单元元的段基址和偏移地址。的段基址和偏移地址。大大多多数数情情况况下下,指指令令使使用用DS寄寄存存器器的的内内容容作作为为操操作作数数的的段基址,指令中不需要再指出段基
12、址。段基址,指令中不需要再指出段基址。3存储器操作数存储器操作数指出偏移地址的方法有两种:直接的和间接的。指出偏移地址的方法有两种:直接的和间接的。常常在程序开始处把数据段的段基址装入常常在程序开始处把数据段的段基址装入DS寄存器:寄存器:MOV AX,DATAMOV DS,AX1515直接(偏移)地址直接(偏移)地址:在指令里直接写出存储单元的偏移地址。在指令里直接写出存储单元的偏移地址。DATA SEGMENTADB 12,34,56ARRAYDW55,66,77,88,99DATA ENDS已把已把DATA代表的段基址装入代表的段基址装入DS把变量(数组)把变量(数组)A的前两个数据送的
13、前两个数据送BL,BH寄存器:寄存器:MOVBL,A;也可以写作也可以写作MOVBL,AMOVBH,A+1;或或MOVBH,A+1,MOVBH,A1A代表数据代表数据“12”的偏移地址,的偏移地址,A+1是数据是数据“34”的偏移地址。的偏移地址。错误错误!MOVBX,A;把变量把变量A送送BL,变量变量A+1送送BH1616直接(偏移)地址直接(偏移)地址:在指令里直接写出存储单元的偏移地址。在指令里直接写出存储单元的偏移地址。DATA SEGMENTADB 12,34,56ARRAYDW55,66,77,88,99DATA ENDS已把已把DATA代表的段基址装入代表的段基址装入DS假设已
14、经知道假设已经知道A的偏移地址是的偏移地址是0000H,前面的指令可以写作:前面的指令可以写作:MOVBL,0000H;方括号不能省略方括号不能省略MOVBH,0001H;方括号不能省略方括号不能省略常数地址格式一般没有实用价值。常数地址格式一般没有实用价值。上面的两条指令可以用一条指令代替,效果相同:上面的两条指令可以用一条指令代替,效果相同:MOVBX,0000H;取地址取地址0000H开始的两字节开始的两字节,送入送入BL和和BH1717MOVAL,2100H;正确,正确,8位传送指令,位传送指令,2100H是字节地址是字节地址MOVAX,2100H;正确,正确,16位传送指令,位传送指
15、令,2100H是字地址是字地址MOVEAX,2100H;正确,正确,32位传送指令,位传送指令,2100H是双字地址是双字地址假设已经定义:假设已经定义:XDW350指令指令MOVBX,X 是是16位传送指令,正确位传送指令,正确指令指令MOVBL,X 是错误的,操作数类型不匹配是错误的,操作数类型不匹配1818间接(偏移)地址间接(偏移)地址:把把存存储储单单元元的的偏偏移移地地址址先先装装入入某某个个寄寄存存器器,通通过过这这个个寄寄存存器器来来找到这个存储单元,也称为找到这个存储单元,也称为“寄存器间接寻址寄存器间接寻址”。已经定义:已经定义:ADB12,34MOV SI,OFFSETA
16、;把变量把变量A的偏移地址装入的偏移地址装入SI;OFFSET是保留字,表示取出后面变量的偏移地址是保留字,表示取出后面变量的偏移地址MOV BL,SI;变量变量A的第一个值送的第一个值送BLMOV BH,SI+1;第二个值送第二个值送BH,MOVBH,1SI16位位80X86微微处处理理器器只只有有BX,BP,SI,DI这这4个个寄寄存存器器可可以以用用来来“间间接接寻寻址址”。不不另另加加说说明明的的话话,使使用用BP时时自自动动用用SS的的值值作作为段基址,使用为段基址,使用BX,SI,DI时自动用时自动用DS的值作为段基址。的值作为段基址。1919已经定义:已经定义:ARRAY DW3
17、5,73,27,780,12,55取出字数组取出字数组ARRAY的第的第3个元素送入个元素送入AX:;方法方法1MOVAX,ARRAY4;ARRAY代表数组首地址,位移量代表数组首地址,位移量=4,直接寻址,直接寻址;也可以写作;也可以写作“MOVAX,ARRAY+4”;方法方法2MOVBX,OFFSETARRAY;数组首地址装入数组首地址装入BXMOVAX,BX+4;第第3个元素距数组首元素个元素距数组首元素4个字节个字节;方法方法3MOVBX,4;第第3个元素距数组首地址的位移量装入个元素距数组首地址的位移量装入BXMOVAX,ARRAYBX;ARRAY代表数组首地址,代表数组首地址,BX
18、中是位移量中是位移量2020基址变址寻址基址变址寻址:用两个寄存器联合起来寻址。从(用两个寄存器联合起来寻址。从(BX,BP)和(和(SI,DI)中中各选出一个使用。各选出一个使用。出现出现BP时使用时使用SS作为段基址寄存器,其它情况用作为段基址寄存器,其它情况用DS。MOVAX,ARRAY4;直接寻址,偏移地址直接寻址,偏移地址=ARRAY+4MOVAX,BX;寄存器间接寻址寄存器间接寻址MOVAX,BX+2;寄存器相对寻址寄存器相对寻址;BX中存放首地址,位移量中存放首地址,位移量2MOVAX,ARRAYBX;寄存器相对寻址寄存器相对寻址;ARRAY为首地址,为首地址,BX中存放位移量中
19、存放位移量MOVAX,BX+SI;基址(基址(BX)变址(变址(SI)寻址寻址MOVAX,BX+DI+2;相对基址变址寻址相对基址变址寻址21213232位位8080 x86x86微处理器的存储器寻址微处理器的存储器寻址:基址基址+比例因子比例因子变址变址+位移量位移量MOVAX,ARRAY4;直接寻址,有效地址直接寻址,有效地址=ARRAY+4MOVAX,ECX;可以用任何一个通用寄存器间接寻址可以用任何一个通用寄存器间接寻址MOVAX,EAX+4;寄存器相对寻址寄存器相对寻址MOVAX,EBX+ECX;基址(基址(EBX)变址(变址(ECX)寻址寻址MOVAX,EBP+EDX+4;相对基址
20、(相对基址(EBP)变址(变址(EDX)寻址,使用寻址,使用SSMOVAX,EBX+4*ESI;变址寄存器可以乘上比例因子变址寄存器可以乘上比例因子1,2,4,8MOVAX,8*EBP+ECX+6;相对基址(相对基址(ECX)变址(变址(EBP)寻址,使用寻址,使用DS2222在在“实地址模式实地址模式”下,偏移地址用下,偏移地址用16位二进制表示,用于寻址位二进制表示,用于寻址的的32位寄存器的高位寄存器的高16位必须为位必须为0。所有的所有的32位通用寄存器都可以用来间接寻址,一旦使用位通用寄存器都可以用来间接寻址,一旦使用EBP作作为为“基址寄存器基址寄存器”,表示使用,表示使用SS作为
21、段基址寄存器。作为段基址寄存器。MOVAX,EBXEBP;基址基址(EBX)变址变址(EBP)寻址,使用寻址,使用DSMOVAX,EBPEBX;基址基址(EBP)变址变址(EBX)寻址,使用寻址,使用SSMOVAX,EBXEBP*1;基址(基址(EBX)变址(变址(EBP)寻址,使用寻址,使用DSMOVAX,1*EBPEBX;基址(基址(EBP)变址(变址(EBX)寻址,使用寻址,使用SS第二条指令等同于:第二条指令等同于:MOV AX,EBPEBX。使用比例因子的寄存器一般作为变址寄存器,比例因子为使用比例因子的寄存器一般作为变址寄存器,比例因子为1时:时:23232.2.2 2.2.2 程
22、序段程序段已定义数据段为已定义数据段为“DATA”,程序段常见格式程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX;其他指令其他指令MOV AX,4C00HINT21HCODEENDSENDSTART2424“ASSUME”伪指令用来指定段和段寄存器之间的对应关系,供伪指令用来指定段和段寄存器之间的对应关系,供汇编程序使用。汇编程序使用。DATASEGMENTADB55DATAENDSDSEGSEGMENTXDB10DSEGENDSASSUMEDS:DATA,ES:DSEGMOVAX,DATAMOV DS,AX
23、MOV AX,DSEGMOV ES,AX设变量设变量A和和X的偏移地址都是的偏移地址都是0000H。指令指令MOVAL,A自动按照自动按照MOVAL,DS:0000H的格式的格式汇编,执行后(汇编,执行后(AL)=55。指令指令MOVDL,X自动按照自动按照MOVDL,ES:0000H的格式的格式汇编,执行后(汇编,执行后(DL)=10。2525MOVSI,OFFSETA;A的偏移地址装入的偏移地址装入SIMOVDI,OFFSETX;X的偏移地址装入的偏移地址装入DIMOVAL,SI;取取A的值送的值送ALMOVDL,DI;取取X的值送的值送DL执行的结果:执行的结果:(AL)=55正确,正确
24、,(DL)=55 错误错误。为了得到正确结果,上面第为了得到正确结果,上面第4条指令改写为:条指令改写为:MOV DL,ES:DI;执行后执行后(DL)=10,结果正确结果正确这条指令这条指令“显式显式”地指定了段基址,汇编出来的机器指令比地指定了段基址,汇编出来的机器指令比MOVDL,DI多一个字节,称为多一个字节,称为“段跨越前缀段跨越前缀”。2626“START”是第一条指令的是第一条指令的“标号标号”。标号出现在指令行前面,标号与指令之间用冒号标号出现在指令行前面,标号与指令之间用冒号“:”分开。分开。本程序的执行从标有本程序的执行从标有“START”的第一条指令开始,的第一条指令开始
25、,它的地址称为这个程序的它的地址称为这个程序的“入口地址入口地址”。指令指令“INT21H”表示调用由操作系统提供的表示调用由操作系统提供的21H号服务程序。号服务程序。AH中为中为“功能号功能号”,AH=4CH表示返回操作系统的操作。表示返回操作系统的操作。AL中的代码称为中的代码称为“返回代码返回代码”,00H表示表示“正常返回正常返回”。处理器选择伪指令处理器选择伪指令.386.386P.486.486P.586.586P.686.686P.386表示程序选用表示程序选用80386的基本指令集,的基本指令集,.386P表示选用表示选用80386的基本指令和保护模式下的特权指令。的基本指令
26、和保护模式下的特权指令。缺省的处理器选择伪指令是缺省的处理器选择伪指令是.808627272.2.32.2.3 基本传送指令基本传送指令MOV指令的一般格式:指令的一般格式:1MOV(Move,传送)指令传送)指令MOV指令把源操作数指令把源操作数(source)传送到目的操作数传送到目的操作数(destination)MOV dest,src设指令执行前,设指令执行前,(AX)=2345H,(BX)=1111H。指令指令“MOVAX,BX”执行后,执行后,(AX)=1111H,(BX)=1111H。源操作数源操作数BX的内容被复制到的内容被复制到AX寄存器内,源操作数寄存器内,源操作数BX的
27、的内容保持不变,目的操作数内容保持不变,目的操作数AX的原内容被覆盖。的原内容被覆盖。2828源操作数可以是:寄存器、存储器、立即数;源操作数可以是:寄存器、存储器、立即数;目的操作数可以是:寄存器、存储器。目的操作数可以是:寄存器、存储器。2929MOVMOV指令的使用限制指令的使用限制:源操作数与目的操作数可以是字节、字或双字,但必须有源操作数与目的操作数可以是字节、字或双字,但必须有相同的类型;相同的类型;源操作数与目的操作数不能同时为存储器操作数;源操作数与目的操作数不能同时为存储器操作数;目的操作数不能是立即数;目的操作数不能是立即数;FLAGS、EFLAGS、IP、EIP不能用作操
28、作数。不能用作操作数。对于段寄存器作为操作数的对于段寄存器作为操作数的MOVMOV指令指令:源操作数与目的操作数不能同时为段寄存器;源操作数与目的操作数不能同时为段寄存器;目的操作数是段寄存器时,源操作数只能是寄存器或存储目的操作数是段寄存器时,源操作数只能是寄存器或存储器,不能是立即数;器,不能是立即数;CS不能用作目的操作数。不能用作目的操作数。3030MOV CL,DH;字节传送指令,字节传送指令,DH寄存器内容送入寄存器内容送入CLMOV ECX,EDX;双字传送指令,双字传送指令,EDX寄存器内容送入寄存器内容送入ECXMOV AX,CS;字传送指令,字传送指令,CS寄存器内容送入寄
29、存器内容送入AXMOV SS,CX;字传送指令,字传送指令,CX寄存器内容送入寄存器内容送入SSMOVMOV指令举例(寄存器、寄存器操作数):指令举例(寄存器、寄存器操作数):正确:正确:错误:错误:MOV CL,DX;操作数类型不匹配操作数类型不匹配MOV ESI,BH;操作数类型不匹配操作数类型不匹配MOV CS,AX;CS寄存器不能作为目的操作数寄存器不能作为目的操作数MOV DS,CS;不能同时为段寄存器不能同时为段寄存器3131MOV AL,30H;字节传送指令,执行后(字节传送指令,执行后(AL)=30HMOV AX,30H;字传送指令,执行后(字传送指令,执行后(AX)=0030
30、HMOV EAX,30H;双字传送指令,执行后双字传送指令,执行后(EAX)=00000030HMOV AL,-5;字节传送指令,执行后(字节传送指令,执行后(AL)=0FBHMOV AX,-5;字传送指令,执行后(字传送指令,执行后(AX)=0FFFBHMOVMOV指令举例(立即数、寄存器操作数):指令举例(立即数、寄存器操作数):正确:正确:错误:错误:MOV 30H,AL;立即数不能用作目的操作数立即数不能用作目的操作数MOV AL,300;源操作数超出范围源操作数超出范围3232MOVMOV指令举例(存储器、寄存器操作数):指令举例(存储器、寄存器操作数):正确:正确:错误:错误:MO
31、V BP,BL;字节传送指令,字节传送指令,BL寄存器内容送寄存器内容送SS:BPMOV BX,AX;字传送指令,字传送指令,AL内容送内容送DS:BX,;AH内容送内容送DS:BX+1MOV DX,SI;字传送指令,字传送指令,DS:SI内容送入内容送入DL,;DS:SI+1内容送入内容送入DH假设变量假设变量X_BYTE用用DB定义,变量定义,变量Y_WORD用用DW定义定义MOV DX,BL;DX寄存器不能用来寄存器间接寻址寄存器不能用来寄存器间接寻址MOVX_BYTE,AX;操作数类型不匹配操作数类型不匹配3333MOVMOV指令举例(存储器、立即数操作数):指令举例(存储器、立即数操
32、作数):正确:正确:错误:错误:MOV X_BYTE,-5;字节传送指令,字节传送指令,-5(0FBH)送送X_BYTEMOV Y_WORD,-5;字传送指令,字传送指令,-5(0FFFBH)送送Y_WORD假设变量假设变量X_BYTE用用DB定义,变量定义,变量Y_WORD用用DW定义定义MOV X_BYTE,300;目的操作数超出范围目的操作数超出范围MOV BX,30H;操作数类型不能确定操作数类型不能确定3434错误:错误:MOV X_BYTE,SI;不能同时为存储器操作数不能同时为存储器操作数MOV X_BYTE,K_BYTE;不能同时为存储器操作数不能同时为存储器操作数MOV SS
33、,DS;不能同时为段寄存器操作数不能同时为段寄存器操作数两个操作数不能同时为存储器操作数或段寄存器!两个操作数不能同时为存储器操作数或段寄存器!3535MOV BYTEPTRBX,20H;1B立即数立即数20H送送DS:BXMOV WORDPTRBX,20H;立即数立即数20H送送DS:BX,;00H送送DS:BX+1MOV DWORDPTRBX,20H;4B立即数立即数00000020H送送;DS:BX开始开始4个字节个字节MOV BYTEPTRY_WORD,20H;立即数立即数20H送变量送变量;Y_WORD的第一字节的第一字节MOV AL,BYTEPTRY_WORD;变量变量Y_WORD
34、的第一字节的第一字节;送;送AL寄存器寄存器MOV WORDPTRX_BYTE,20H;2B立即数立即数0020H送变量送变量;X_BYTE开始的开始的2字节字节可以用可以用“类型类型PTR”指定,或强行改变操作数的类型:指定,或强行改变操作数的类型:3636LEA把源操作数的偏移地址装入目的操作数。它的一般格式:把源操作数的偏移地址装入目的操作数。它的一般格式:LEAREG16,MEMREG16表示一个表示一个16b通用寄存器,通用寄存器,MEM是一个存储器操作数。是一个存储器操作数。上面指令把存储器操作数的偏移地址存入指定的上面指令把存储器操作数的偏移地址存入指定的16位寄存器。位寄存器。
35、2 2LEA(Load Effective Address,LEA(Load Effective Address,装载有效地址装载有效地址)指令指令假设变量假设变量X的偏移地址为的偏移地址为1020H,(SI)=4455H,(EAX)=1020H,(EBP)=20HLEADX,X;执行后,(执行后,(DX)=1020HLEABX,4EBP*2EAX;执行后执行后,(BX)=4+20H2+1020H=1064H3737例例2-1编写程序,把编写程序,把4个元素的字节数组个元素的字节数组ARRAY清零。清零。DATASEGMENTARRAYDB4DUP(?)DATAENDSCODESEGMENTA
36、SSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV ARRAY,0;第一个元素清零第一个元素清零MOV ARRAY+1,0;第二个元素清零第二个元素清零MOV ARRAY+2,0;第三个元素清零第三个元素清零MOV ARRAY+3,0;第四个元素清零第四个元素清零MOV AX,4C00HINT21HCODEENDSENDSTART3838MOVAX,0LEABX,ARRAY;数组数组ARRAY首地址装入首地址装入BXMOVWORDPTRBX,AX;第一、第二个元素清零第一、第二个元素清零MOVWORDPTRBX+2,AX;第三、第四个元素清零第三
37、、第四个元素清零一次将两个元素同时清零:一次将两个元素同时清零:MOVWORDPTRARRAY,0;第一、第二个元素清零第一、第二个元素清零MOVWORDPTRARRAY+2,0;第三、第四个元素清零第三、第四个元素清零使用立即数指令代码较长。把这个立即数事先存放在寄存器中:使用立即数指令代码较长。把这个立即数事先存放在寄存器中:MOVAX,0MOVWORDPTRARRAY,AX;第一、第二个元素清零第一、第二个元素清零MOVWORDPTRARRAY+2,AX;第三、第四个元素清零第三、第四个元素清零把数组把数组ARRAY的首地址事先装入地址寄存器,程序更简捷:的首地址事先装入地址寄存器,程序
38、更简捷:3939例例2-2字数组字数组X的最后的最后2个元素值送入个元素值送入Y数组对应单元数组对应单元DATASEGMENTXDW 55,112,37,82YDW 4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV DI,4;第三个元素在数组内的位移第三个元素在数组内的位移MOV AX,XDI;取出取出X数组第三个元素数组第三个元素MOV YDI,AX;送入送入Y数组第三个元素中数组第三个元素中MOV AX,XDI+2;取出取出X数组第四个元素数组第四个元素MOV YDI+2,AX;送入送入Y
39、数组第四个元素中数组第四个元素中MOV AX,4C00HINT 21HCODEENDSENDSTART40402.2.4 2.2.4 其他传送指令其他传送指令1.1.地址传送指令地址传送指令LDS,LES,LFS,LGSLDS,LES,LFS,LGS例例指令指令LDSSI,BX从从DS:BX处取出处取出32位二进制,两个低地位二进制,两个低地址字节送入址字节送入SI,两个高地址字节送入两个高地址字节送入DS寄存器。指令执行后寄存器。指令执行后DS寄存器的内容被刷新。寄存器的内容被刷新。这些指令不影响标志位,这些指令不影响标志位,LFS和和LGS指令是指令是80386开始增加的。开始增加的。地址
40、传送指令从存储器取出地址传送指令从存储器取出4B,前面的前面的2B送入指定的寄存器,送入指定的寄存器,后面的后面的2B送入由指令操作码包含的段寄存器。送入由指令操作码包含的段寄存器。LDSREG16,MEM32;从存储器取出从存储器取出4B,送入送入REG16和和DSLESREG16,MEM32;从存储器取出从存储器取出4B,送入送入REG16和和ESLFSREG16,MEM32;从存储器取出从存储器取出4B,送入送入REG16和和FSLGSREG16,MEM32;从存储器取出从存储器取出4B,送入送入REG16和和GS4141CBW;将将AL寄存器内容符号扩展成寄存器内容符号扩展成16b,送
41、入送入AXCWD;将将AX寄存器内容符号扩展成寄存器内容符号扩展成32b,送入送入DX(高位高位)和和AXCWDE;将将AX寄存器内容符号扩展成寄存器内容符号扩展成32b,送入送入EAXCDQ;将将EAX寄存器内容符号扩展成寄存器内容符号扩展成64b,送入送入EDX和和EAX2.2.扩展传送指令扩展传送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQMOVZX,MOVSX,CBW,CWD,CWDE,CDQ扩展传送指令把扩展传送指令把8位的操作数扩展为位的操作数扩展为16/32位,或者把位,或者把16位的操作位的操作数扩展为数扩展为32位,送入目的寄存器。位,送入目的寄存器。设有(设
42、有(EAX)=00008060HCBW;(;(AX)=0060HCWD;(;(DX)=0FFFFH,(,(AX)=8060HCWDE;(EAX)=0FFFF8060HCDQ;(EDX)=0000H,(EAX)=00008060H4242设有(设有(AX)=8060HMOVZXEBX,AX;(;(EBX)=00008060HMOVSXEBX,AX;(;(EBX)=0FFFF8060HMOVSXEBX,AL;(;(EBX)=00000060HMOVZXREG16/REG32,REG8/MEM8/REG16/MEM16将将8/16位寄存器位寄存器/存储器操作数零扩展,送入存储器操作数零扩展,送入16
43、/32位寄存器位寄存器MOVSXREG16/REG32,REG8/MEM8/REG16/MEM16将将8/16位寄存器位寄存器/存储器操作数符号扩展,送入存储器操作数符号扩展,送入16/32位寄存器位寄存器43433.3.交换指令交换指令XCHG,SWAPXCHG,SWAPXCHGREG/MEM,REG/MEM交换源、目的操作数的内容,两个操作数有相同的类型,不能同交换源、目的操作数的内容,两个操作数有相同的类型,不能同时为存储器操作数。时为存储器操作数。BSWAPREG32交换交换32位寄存器的最高字节和最低字节、次高字节和次低字节位寄存器的最高字节和最低字节、次高字节和次低字节例如,(例如
44、,(EAX)=12345678HXCHGAH,AL;(;(AX)=7856HBSWAPEAX;(;(EAX)=78563412H44444.4.换码指令换码指令XLATXLATXLATMEM16以以MEM16对应段寄存器为段基址,以对应段寄存器为段基址,以BX为偏移地址查表为偏移地址查表XLAT;ALDS:BX+AL用用AL寄存器的内容查表,结果存回寄存器的内容查表,结果存回AL寄存器。表格的首地址寄存器。表格的首地址事先存放在事先存放在DS:BX中。中。4545TABLEDB“0123456789ABCDEF”PUSH DS;保护保护DS寄存器内容寄存器内容MOV BX,SEGTABLE;取
45、取TABLE所在的段基址送所在的段基址送BXMOV DS,BX;从从BX转送入转送入DSLEABX,TABLE;取取TABLE的偏移地址的偏移地址XLAT;查表,查表,(AL)=01001011B(B)POPDS;恢复恢复DS寄存器内容寄存器内容设(设(AL)=00001011B,下面程序执行后,下面程序执行后,AL中的二进制数中的二进制数改变为对应的十六进制数字符的改变为对应的十六进制数字符的ASCII代码代码01000010(B)。)。46462.2.5 2.2.5 堆栈堆栈堆栈(堆栈(STACK)是用户使用的存储器的一部分,用来存放临时是用户使用的存储器的一部分,用来存放临时性的数据和其
46、他信息,例如函数使用的局部变量、调用子程序性的数据和其他信息,例如函数使用的局部变量、调用子程序的入口参数、返回地址等。的入口参数、返回地址等。堆栈的段基址必须放在堆栈的段基址必须放在SS中。中。堆栈段的堆栈段的“栈顶栈顶”地址(偏移地址)地址(偏移地址)放在放在SP寄存器中。寄存器中。4747在在SEGMENT伪指令中增加伪指令中增加“STACK”表示该段是表示该段是“堆栈堆栈”。这个程序装入时,操作系统把这个程序装入时,操作系统把SSEG的段基址置入的段基址置入SS,堆栈段堆栈段的字节数(本例中为的字节数(本例中为200=0C8H)置入置入SP。1.堆栈段结构堆栈段结构SSEGSEGMEN
47、TSTACK;堆栈段开始堆栈段开始DW 100DUP(?);大小为大小为100个字个字SSEGENDS;堆栈段结束堆栈段结束堆栈段的定义:堆栈段的定义:4848从较大地址开始分配和使用(数据段、代码段从较小地址开从较大地址开始分配和使用(数据段、代码段从较小地址开始分配和使用);始分配和使用);由由SP中地址指出的存储单元称为中地址指出的存储单元称为“栈顶栈顶”,数据总是在,数据总是在“栈栈顶顶”位置存入(称为位置存入(称为“压入压入”)、取出(称为)、取出(称为“弹出弹出”););最先进入的数据最后被弹出(最先进入的数据最后被弹出(FirstInLastOut,FILO),),最后进入的数据
48、最先被弹出(最后进入的数据最先被弹出(LastInFirstOut,LIFO)堆栈段的特点堆栈段的特点:4949压入压入2B数据的操作数据的操作SP(SP)2SS:SP数据数据弹出弹出2B数据的操作数据的操作目的操作数目的操作数SS:SPSP(SP)+25050ES,DS指向指向PSP;SS指向用户程序区;指向用户程序区;CS指向用户代码段指向用户代码段(由(由END伪指令指明);伪指令指明);(SP)=0000H,指向指向64KB存储器尾部。存储器尾部。如果未定义堆栈段,如果未定义堆栈段,用户程序装入内存时用户程序装入内存时:51512.8086CPU堆栈指令堆栈指令指令的操作数是指令的操作
49、数是16b的寄存器、存储器、段寄存器(的寄存器、存储器、段寄存器(CS除外)除外)。指令执行后,操作数的内容被更新。指令执行后,操作数的内容被更新。把把CS寄存器内容存入寄存器内容存入DS:PUSH(压栈)指令:把压栈)指令:把16b操作数压入堆栈操作数压入堆栈PUSHREG16/MEM16/SEG指令的操作数是指令的操作数是16b的寄存器、存储器、段寄存器。指令的寄存器、存储器、段寄存器。指令执行后,操作数的内容不变。执行后,操作数的内容不变。POP(出栈)指令:从堆栈中弹出出栈)指令:从堆栈中弹出16b存入操作数存入操作数POPREG16/MEM16/SEGPUSHCSPOPDS5252P
50、USHFPOPAX;AXFlagsORAX,0010H;将将b8(TF位)置位)置1PUSH AXPOPF;FlagsAXPUSHF指令把指令把FLAGS寄存器内容压入堆栈。寄存器内容压入堆栈。PUSHFPOPF指令从堆栈弹出指令从堆栈弹出16b送入送入FLAGS寄存器,指令执行后,寄存器,指令执行后,各标志位被刷新。各标志位被刷新。POPF下面程序段把下面程序段把TF标志位置位(置标志位置位(置1):):5353LAHF指令把指令把FLAGS寄存器的低寄存器的低8位送入位送入AH寄存器寄存器LAHFSAHF指令把指令把AH寄存器内容送入寄存器内容送入FLAGS寄存器的低寄存器的低8位,它位,