《数据定义与传送哦》PPT课件_第1页
《数据定义与传送哦》PPT课件_第2页
《数据定义与传送哦》PPT课件_第3页
《数据定义与传送哦》PPT课件_第4页
《数据定义与传送哦》PPT课件_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

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

文档简介

1,新编汇编语言程序设计,2,第二章数据定义与传送,2.1数据的定义2.2数据的传送2.3汇编语言上机操作,3,2.1数据的定义,2.1.1数据段2.1.2数据定义,4,汇编语言程序定义的“数据”:(1)变量(Variable)有一个名字,运行过程中值可能发生变化,定义时可以设置“初始值”。(2)常数(Constant)可以直接写在指令内,也可以存放在数据段内。(3)缓冲区(Buffer)从输入设备输入若干数据时,需要在数据段里事先留出必要的存储单元,称为“输入缓冲区”。输出一批数据时,需要把输出内容事先存放在若干内存单元中,称为“输出缓冲区”。,5,2.1.1数据段,DATASEGMENT;在这里定义数据DATAENDS,DATA:程序员给这个段起的名字。SEGMENT:保留字,说明一个段从这里开始。ENDS:保留字,说明一个段到此结束。;分号后面的文字是“注释”,不参加汇编,6,伪指令:说明性的语句;汇编后不会产生对应的机器指令。,2.1.1数据段,数据段名SEGMENT数据段名ENDS,7,2.1.2数据定义,数据定义伪指令:变量名数据定义伪指令助记符数据,数据,数据定义伪指令助记符:DB(DefineByte):每个数据占用一个字节(8b)DW(DefineWord):每个数据占用一个字(16b)DD(DefineDoubleWord):每个数据占用一个双字(32b)DQ(DefineQuartWord):每个数据占用8个字节(64b)DT(DefineTenByte):每个数据占用10个字节(80b),8,DATASEGMENTXdb-1,255,A,3+2,?db“ABC”,0FFH,11001010BYdb3dup(?)DATAENDS,数据定义举例(1):,有符号数用它的补码存储字符用ASCII代码存储?表示一个尚未确定的值DUP表示重复定义变量名代表这个单元的地址,9,DSEGSEGMENTZDW-2,-32768,65535,ABWDD12345678H,-400000DWZ,W-ZDSEGENDS,数据定义举例(2):,多字节数据的高位存放在较高地址单元中出现在数据部分的变量名代表这个变量的偏移地址,10,变量名符号地址:表示存储空间的首地址符号地址可有可无有符号地址,可以方便存取变量属性:段属性(SEG)、偏移属性(OFFSET)、类型(TYPE)、长度(LENGTH)、大小(SIZE),数据定义伪指令:变量名数据定义伪指令助记符数据,数据,2.1.2数据定义,DATASEGMENTXdb-1,255,A,3+2,?DATAENDS,11,变量X,Y,Z,W的属性,DATASEGMENTXdb-1,255,A,3+2,?db“ABC”,0FFH,11001010BYdb3dup(?)DATAENDS,DSEGSEGMENTZDW-2,-32768,65535,ABWDD12345678H,-400000DWZ,W-ZDSEGENDS,12,操作数:是用逗号分割的常数表达式?不确定dup复制操作符可以是字符串可以是变量名,2.1.2数据定义,数据定义伪指令:变量名数据定义伪指令助记符数据,数据,13,例:Xdw23Ydb23Zdb?Mdw?db3,2dup(1,2)dw3,2dup(1,2),3,1,2,1,2,2.1.2数据定义,14,例:str1dba,bstr2dbabstr3dwa,bstr4dwab6162hstr5dwabc,str1dbhellostr2dwhello,2.1.2数据定义,15,mess1db12,13mess2dw24mess3dwmess1mess4ddmess2,mess3,mess1的偏移地址,mess4,mess2的偏移地址,mess2的段基址,2.1.2数据定义,16,练习,某数据段内有如下数据定义:Xdb30,30H,ABC,2-3,?,11001010Bdw0FFH,-2,“CD”Ydd20dup(15,3dup(?),0)Zdb3dup(?)WdwZ-X假设变量X的偏移地址为20H。(1)写出变量X各数据在内存中的具体位置和内存单元的值。(2)写出变量Y,Z的偏移地址。(3)写出变量W对应的内存单元的值。,17,2.2数据的传送,2.2.1指令格式2.2.2程序段2.2.3基本传送指令2.2.4其他传送指令2.2.5堆栈2.2.6操作数表达式,18,汇编语言程序由若干“语句”组成,每个“语句”占用一行。三种类型语句:指令语句:包含一条符号指令,与一条机器指令相对应,汇编以后是机器指令的二进制代码,这个代码被称为“目标(Object)”;伪指令语句:一条说明性的语句。伪指令本身汇编后不产生“目标”。注释行:书写说明性文字,不进行“汇编”,也不产生“目标”。,19,伪指令和指令的区别,与CPU有关不同的CPU类型有不同的指令系统,与汇编程序有关汇编程序的版本不同,所提供的伪指令不同,使CPU产生动作,不产生CPU动作,指令的执行是在程序的运行期间,在程序执行前(汇编期间)由汇编程序来处理,产生目标代码,不产生目标代码,MOVAX,1234HLEAAX,1234H,DB.MODELSMALL,20,180X86指令格式,如:BEGIN:MOVAX,0;将0传送给AX标号:程序员给这一行起的名字,后面跟上冒号,代表这一行的地址。标号用字母开始,不要使用保留字作为标号。操作码是这条指令需要完成的操作,用指令助记符表示。,标号:操作码操作数;注释,2.2.1指令格式,21,操作数是指令的操作对象,指令的操作数可以03个。两个操作数时,右面的操作数称为“源操作数”,左面的操作数称为“目的操作数”。“源操作数”参与指令操作,不保存结果,内容不会改变。“目的操作数”参与指令操作,还保存指令的操作结果,指令执行后,目的操作数的内容被改变。;注释用来添加一些说明,例如说明本行指令的功能。,180X86指令格式,标号:操作码操作数;注释,如:BEGIN:MOVAX,0;将0传送给AX,22,2操作数,(1)寄存器操作数:包括段寄存器、数据寄存器、地址寄存器例如:MOVBX,AX功能:AX寄存器内容送入BX寄存器。AX是“源操作数”,写在右边,指令执行后,它的内容不会被改变。BX是“目的操作数”,写在左边,指令执行后,它的内容将被改变。,注意:专用寄存器IP/EIP和FLAGS/EFLAGS不能作为操作数出现在指令中。,23,(2)立即数操作数:二进制/十进制/十六进制常数,可求值的表达式,字符,标号等。,常数300送入BX寄存器MOVBX,300或者:MOVBX,150*2,DATA段的段基址送DSMOVAX,DATAMOVDS,AX,注意:立即数不能用作“目的操作数”。,24,为了对存储器的一个单元进行访问,需要给出这个单元的段基址和偏移地址。大多数情况下,指令使用DS寄存器的内容作为操作数的段基址,指令中不需要再指出段基址。,3存储器操作数,指出偏移地址的方法有两种:直接的和间接的。,25,(1)直接(偏移)地址:在指令里直接写出存储单元的偏移地址。,DATASEGMENTADB12,34,56ARRAYDW55,66,77,88,99DATAENDS,把变量(数组)A的前两个数据送BL,BH寄存器:MOVBL,A;也可以写作MOVBL,AMOVBH,A+1;或MOVBH,A+1,MOVBH,A1A代表数据“12”的偏移地址,A+1是数据“34”的偏移地址。,MOVBX,A;把变量A送BL,变量A+1送BH,错误!,26,(1)直接(偏移)地址:在指令里直接写出存储单元的偏移地址。,DATASEGMENTADB12,34,56ARRAYDW55,66,77,88,99DATAENDS,假设已经知道A的偏移地址是0000H,前面的指令可以写作:MOVBL,0000H;方括号不能省略MOVBH,0001H;方括号不能省略常数地址格式一般没有实用价值。上面的两条指令可以用一条指令代替,效果相同:MOVBX,0000H;取地址0000H开始的两字节,送入BL和BH,27,举例1:假设已经定义:XDW350MOVBX,XMOVBL,X举例2:MOVAL,2100HMOVAX,2100HMOVEAX,2100H,;是16位传送指令,正确,;是错误的,操作数类型不匹配,;正确,8位传送指令,2100H是字节地址,;正确,16位传送指令,2100H是字地址,;正确,32位传送指令,2100H是双字地址,28,(2)间接(偏移)地址:把存储单元的偏移地址先装入某个寄存器,通过这个寄存器来找到这个存储单元,也称为“寄存器间接寻址”。,注意:16位80X86微处理器只有BX,BP,SI,DI这4个寄存器可以用来“间接寻址”。不另加说明的话,使用BP时自动用SS的值作为段基址,使用BX,SI,DI时自动用DS的值作为段基址。,举例1:已经定义:ADB12,34MOVSI,OFFSETA;把变量A的偏移地址装入SI;OFFSET是保留字,表示取出后面变量的偏移地址MOVBL,SI;变量A的第一个值送BLMOVBH,SI+1;第二个值送BH,MOVBH,1SI,29,举例2:已经定义:ARRAYDW35,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中是位移量,30,(2)间接(偏移)地址:基址变址寻址:用两个寄存器联合起来寻址。从(BX,BP)和(SI,DI)中各选出一个使用。出现BP时使用SS作为段基址寄存器,其它情况用DS。例:MOVAX,BX+SI;基址(BX)变址(SI)寻址,31,寻址方式,立即数寻址寄存器寻址存储器寻址,直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址,32,1立即数寻址,例:MOVAL,05H;(AL)05HMOVAX,0102H;(AX)0102HMOVAX,abMOVAX,0B012H,立即寻址,33,2寄存器寻址方式,例:MOVBX,1234H;(BX)1234HMOVAX,BX;(AX)(BX),寄存器寻址,可用寄存器:段寄存器(DS,CS,SS,ES)数据寄存器(AX,BX,CX,DX)地址寄存器(BX,BP,SI,DI),34,3直接寻址,例:MOVAX,2000H;(AX)DS:2000HMOVAX,ARRAY;(AX)ARRAY,直接寻址,35,例:MOVAX,BX;(AX)DS:(BX),4寄存器间接寻址,寄存器间接寻址,可用寄存器:地址寄存器(BX,BP,SI,DI)BP-SS;BX、SI、DI-DS,36,例:MOVAX,6SI;(AX)DS:(SI+6)或MOVAX,SI+6或MOVAX,COUNTSI,5寄存器相对寻址,寄存器相对寻址,37,例:MOVAX,BXDI;(AX)DS:(BX+DI)或MOVAX,BX+DI,6基址变址寻址,基址变址,可用寄存器:地址寄存器(BX,BP,SI,DI)基址寄存器:BX、BP变址寄存器:SI、DI,38,例:MOVAX,MASKBXSI或MOVAX,MASKBX+SI或MOVAX,MASK+BX+SI,7相对基址变址寻址,相对基址变址,39,寻址方式,立即数寻址寄存器寻址存储器寻址,直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址,40,练习,MOVAX,ARRAY4MOVAX,BXMOVAX,BX+2MOVAX,ARRAYBXMOVAX,BX+SIMOVAX,BX+DI+2,;直接寻址,偏移地址=ARRAY+4,;寄存器间接寻址,;寄存器相对寻址,;寄存器相对寻址,;基址(BX)变址(SI)寻址,;相对基址变址寻址,41,请指出以下各指令的操作数所使用的寻址方式。(1)MOVSI,2100H(2)SBBDISPBX,7(3)ANDDI,AX(4)ORAX,609EH(5)MOVBXDI30H,CX(6)PUSHES:BP,练习,42,(BX)=637DH,(SI)=2A9BH,D=7237H,试确定在以下各种寻址方式下的偏移地址是多少?(1)直接寻址(2)使用BX的间接寻址(3)使用BX的寄存器相对寻址(4)基址变址寻址,练习,43,现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后AX寄存器的内容。(1)MOVAX,1200H(2)MOVAX,1200H(3)MOVAX,1100BX(4)MOVAX,1100BXSI,练习,44,32位80 x86微处理器的存储器寻址:,偏移地址=基址+比例因子变址+位移量,位移量:存放在指令中的一个8位、16位或32位的数;基址:存放在基址寄存器中的内容;变址:存放在变址寄存器中的内容;比例因子:(386及其后继机型)值可为1,2,4或8;,直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址,+,相对比例变址寻址,基址比例变址寻址方式,相对基址比例变址寻址方式,45,32位80 x86微处理器的存储器寻址:,MOVAX,ARRAY4MOVAX,ECXMOVAX,EAX+4MOVAX,EBX+ECXMOVAX,EBP+EDX+4MOVAX,EBX+4*ESIMOVAX,8*EBP+ECX+6,;直接寻址,偏移地址=ARRAY+4,;寄存器间接寻址,;寄存器相对寻址,;基址(EBX)变址(ECX)寻址,;相对基址(EBP)变址(EDX)寻址,使用SS,;基址比例变址寻址,;相对基址比例变址寻址,46,16/32位寻址时偏移地址四种成分的组成,直接寻址:DS间接寻址:BP/ESP/EBP-SS;其余-DS,47,2.2.2程序段,程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;其他指令MOVAX,4C00HINT21HCODEENDSENDSTART,48,ASSUME伪指令用来指定段和段寄存器之间的对应关系,供汇编程序使用。,DATASEGMENTADB55DATAENDSDSEGSEGMENTXDB10DSEGENDS,CODESEGMENTASSUMEDS:DATA,ES:DSEG,CS:CODEMOVAX,DATAMOVDS,AXMOVAX,DSEGMOVES,AXCODEENDS,指令MOVAL,A;自动按照MOVAL,DS:0000H的格式汇编,执行后(AL)=55。指令MOVDL,X;自动按照MOVDL,ES:0000H的格式汇编,执行后(DL)=10。,把段地址装入相应的段寄存器,代码段不需要此操作,在程序初始化时完成。,49,为了得到正确结果,上面第4条指令改写为:MOVDL,ES:DI;执行后(DL)=10,结果正确,这条指令“显式”地指定了段基址,汇编出来的机器指令比MOVDL,DI多一个字节,称为“段跨越前缀”。,MOVSI,OFFSETA;A的偏移地址装入SIMOVDI,OFFSETX;X的偏移地址装入DIMOVAL,SI;取A的值送ALMOVDL,DI;取X的值送DL执行的结果:(AL)=55正确,(DL)=55错误,50,程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;其他指令MOVAX,4C00HINT21HCODEENDSENDSTART,2.2.2程序段,51,处理器选择伪指令.386.386P.486.486P.586.586P.686.686P.386表示程序选用80386的基本指令集,.386P表示选用80386的基本指令和保护模式下的特权指令。缺省的处理器选择伪指令是.8086,指令INT21H表示调用由操作系统提供的21H号服务程序。AH中为“功能号”,AH=4CH表示返回操作系统的操作。AL中的代码称为“返回代码”,00H表示“正常返回”。END伪指令表示整个程序到此结束,后面的标号START表示程序入口地址。,52,2.2.2程序段,程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;其他指令MOVAX,4C00HINT21HCODEENDSENDSTART,53,2.2.3基本传送指令,MOV指令的一般格式:,1MOV(Move,传送)指令,MOV指令把源操作数(source)传送到目的操作数(destination),MOVdest,src,举例:设指令执行前,(AX)=2345H,(BX)=1111H。指令“MOVAX,BX”执行后,(AX)=1111H,(BX)=1111H。,54,源操作数可以是:寄存器、存储器、立即数;目的操作数可以是:寄存器、存储器。,55,MOV指令的使用限制:源操作数与目的操作数可以是字节、字或双字,但必须有相同的类型;源操作数与目的操作数不能同时为存储器操作数;目的操作数不能是立即数;FLAGS、EFLAGS、IP、EIP不能用作操作数;源操作数与目的操作数不能同时为段寄存器;目的操作数是段寄存器时,源操作数只能是寄存器或存储器,不能是立即数;CS不能用作目的操作数。,56,1MOV(Move,传送)指令,57,MOVCL,DH;字节传送指令,DH寄存器内容送入CLMOVECX,EDX;双字传送指令,EDX寄存器内容送入ECXMOVAX,CS;字传送指令,CS寄存器内容送入AXMOVSS,CX;字传送指令,CX寄存器内容送入SS,MOV指令举例(寄存器、寄存器操作数):,正确:,错误:,MOVCL,DXMOVESI,BHMOVCS,AXMOVDS,CS,;操作数类型不匹配,;操作数类型不匹配,;CS寄存器不能作为目的操作数,;不能同时为段寄存器,58,MOVAL,30H;字节传送指令,执行后(AL)=30HMOVAX,30H;字传送指令,执行后(AX)=0030HMOVEAX,30H;双字传送指令,执行后(EAX)=00000030HMOVAL,-5;字节传送指令,执行后(AL)=0FBHMOVAX,-5;字传送指令,执行后(AX)=0FFFBH,MOV指令举例(立即数、寄存器操作数):,正确:,错误:,MOV30H,ALMOVAL,300,;立即数不能用作目的操作数,;源操作数超出范围,59,MOV指令举例(存储器、寄存器操作数):,正确:,错误:,MOVBP,BL;字节传送指令,BL寄存器内容送SS:BPMOVBX,AX;字传送指令,AL内容送DS:BX,;AH内容送DS:BX+1MOVDX,SI;字传送指令,DS:SI内容送入DL,;DS:SI+1内容送入DH,假设变量X_BYTE用DB定义,变量Y_WORD用DW定义,MOVDX,BLMOVX_BYTE,AX,;DX寄存器不能用来寄存器间接寻址,;操作数类型不匹配,60,MOV指令举例(存储器、立即数操作数):,正确:,错误:,MOVX_BYTE,-5;字节传送指令,-5(0FBH)送X_BYTEMOVY_WORD,-5;字传送指令,-5(0FFFBH)送Y_WORD,假设变量X_BYTE用DB定义,变量Y_WORD用DW定义,MOVX_BYTE,300MOVBX,30H,;目的操作数超出范围,;操作数类型不能确定,61,错误:,MOVX_BYTE,SIMOVX_BYTE,K_BYTEMOVSS,DS,两个操作数不能同时为存储器操作数或段寄存器!,;不能同时为存储器操作数,;不能同时为存储器操作数,;不能同时为段寄存器操作数,62,DATASEGMENTXDB30HDATAENDSDSEGSEGMENTADB31HDSEGENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DSEGSTART:MOVAX,DATAMOVDS,AXMOVAX,DSEGMOVES,AX_;把X的值传送给AL_;把A的值传送给AHMOVAX,4C00HINT21HCODEENDSENDSTART,MOVAL,X,MOVAH,A,MOVAL,0000H,MOVAH,0000H,MOVAH,ES:0000H,63,可以用“PTR”指定,或强行改变操作数的类型:,MOVBYTEPTRBX,20HMOVWORDPTRBX,20HMOVDWORDPTRBX,20HMOVBYTEPTRY_WORD,20HMOVAL,BYTEPTRY_WORDMOVWORDPTRX_BYTE,20H,;20H送DS:BX,;20H送DS:BX,00H送DS:BX+1,;00000020H送DS:BX开始4个字节,;20H送变量Y_WORD的第1个字节,;变量Y_WORD的第1个字节送AL寄存器,;0020H送变量X_BYTE开始的2个字节,格式:typePTRexpression,64,一般格式:LEA把源操作数的偏移地址装入目的操作数。,2LEA(LoadEffectiveAddress,装载有效地址)指令,举例:假设变量X的偏移地址为1020H(SI)=4455H,(EAX)=1020H,(EBP)=20HLEADX,XLEABX,4EBP*2EAX,LEAREG16,MEM,;执行后,(DX)=1020H,;执行后,(BX)=4+20H2+1020H=1064H,65,例:LEABX,LISTMOVBX,OFFSETLIST,注意:OFFSET只能和简单的符号地址相连.如:MOVBX,OFFSETLISTSI;非法指令,2LEA(LoadEffectiveAddress,装载有效地址)指令,66,例2-1编写程序,把4个元素的字节数组ARRAY清零。DATASEGMENTARRAYDB4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVARRAY,0;第一个元素清零MOVARRAY+1,0;第二个元素清零MOVARRAY+2,0;第三个元素清零MOVARRAY+3,0;第四个元素清零MOVAX,4C00HINT21HCODEENDSENDSTART,数据传送类程序:,67,MOVAX,0LEABX,ARRAY;数组ARRAY首地址装入BXMOVWORDPTRBX,AX;第一、第二个元素清零MOVWORDPTRBX+2,AX;第三、第四个元素清零,一次将两个元素同时清零:,MOVWORDPTRARRAY,0;第一、第二个元素清零MOVWORDPTRARRAY+2,0;第三、第四个元素清零,使用立即数指令代码较长。把这个立即数事先存放在寄存器中:,MOVAX,0MOVWORDPTRARRAY,AX;第一、第二个元素清零MOVWORDPTRARRAY+2,AX;第三、第四个元素清零,把数组ARRAY的首地址事先装入地址寄存器,程序更简捷:,68,例2-2字数组X的最后2个元素值送入Y数组对应单元DATASEGMENTXDW55,112,37,82YDW4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDI,4;第三个元素在数组内的位移MOVAX,XDI;取出X数组第三个元素MOVYDI,AX;送入Y数组第三个元素中MOVAX,XDI+2;取出X数组第四个元素MOVYDI+2,AX;送入Y数组第四个元素中MOVAX,4C00HINT21HCODEENDSENDSTART,数据传送类程序:,69,2.2.4其他传送指令,1.地址传送指令LDS,LES,LFS,LGS,功能:从存储器取出4B,前面的2B送入指定的寄存器,后面的2B送入由指令操作码包含的段寄存器。格式:LDSREG16,MEM32;从存储器取出4B,送入REG16和DSLESREG16,MEM32;从存储器取出4B,送入REG16和ESLFSREG16,MEM32;从存储器取出4B,送入REG16和FSLGSREG16,MEM32;从存储器取出4B,送入REG16和GS说明:1)LFS/LGS只能用于386及其后继机型中。2)不影响标志位。,70,例:LDSSI,10H执行前:(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H执行后:,1.地址传送指令LDS,LES,LFS,LGS,(SI)=0180H(DS)=2000H,71,40H00H00H30H,MOVBX,TABLEMOVBX,OFFSETTABLELEABX,TABLELDSBX,TABLELESBX,TABLE,;(BX)=0040H,;(BX)=1000H,;(BX)=1000H,;(BX)=0040H,;(DS)=3000H,;(BX)=0040H;(ES)=3000H,TABLE=1000H,TABLE+1,1.地址传送指令LDS,LES,LFS,LGS,TABLE,72,格式:CBW;将AL寄存器内容符号扩展成16b,送入AXCWD;将AX寄存器内容符号扩展成32b,送入DX(高位)和AXCWDE;将AX寄存器内容符号扩展成32b,送入EAXCDQ;将EAX寄存器内容符号扩展成64b,送入EDX和EAX,2.扩展传送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQ,功能:把8位的操作数扩展为16/32位,或者把16位的操作数扩展为32位,送入目的寄存器。,说明:1)CWDE、CDQ是386后继机型新增的;2)主要用于有符号数除法之前对被除数位数进行扩展。,73,举例:假设有(EAX)=00008060HCBWCWDCWDECDQ,2.扩展传送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQ,;(AX)=0060H,;(DX)=0FFFFH,(AX)=8060H,;(EAX)=0FFFF8060H,;(EDX)=00000000H,(EAX)=00008060H,74,MOVZXREG16/REG32,REG8/MEM8/REG16/MEM16功能:将8/16位寄存器/存储器操作数零扩展,送入16/32位寄存器,MOVSXREG16/REG32,REG8/MEM8/REG16/MEM16功能:将8/16位寄存器/存储器操作数符号扩展,送入16/32位寄存器,举例:设有(AX)=8060HMOVZXEBX,AXMOVSXEBX,AXMOVSXEBX,AL,;(EBX)=00008060H,;(EBX)=0FFFF8060H,;(EBX)=00000060H,75,3.交换指令XCHG,SWAP,格式:XCHGREG/MEM,REG/MEM功能:交换源、目的操作数的内容。说明:1)可以在寄存器之间或者在寄存器和存储器之间交换信息。2)不允许使用段寄存器。3)不影响标志位。,格式:BSWAPREG32功能:交换32位寄存器的最高字节和最低字节、次高字节和次低字节。说明:486后继机型新增指令。,76,举例1:寄存器和寄存器交换movax,1234hmovbx,5678hxchgax,bxxchgah,al举例2:寄存器和存储器交换xchgax,2000h;字交换xchgal,2000h;字节交换xchgeax,2000h;双字交换,3.交换指令XCHG,SWAP,;(ax)=5678h,(bx)=1234h,;(ax)=7856h,77,举例3:(EAX)=12345678HXCHGAH,ALBSWAPEAX,;(AX)=7856H,;(EAX)=78563412H,3.交换指令XCHG,BSWAP,78,4.换码指令XLAT,格式:XLATMEM16功能:以MEM16对应段寄存器为段基址,以BX为偏移地址查表,格式:XLAT;ALDS:BX+AL功能:用AL寄存器的内容查表,结果存回AL寄存器。表格的首地址事先存放在DS:BX中。,79,TABLEDB“0123456789ABCDEF”PUSHDS;保护DS寄存器内容MOVBX,SEGTABLE;取TABLE所在的段基址送BXMOVDS,BX;从BX转送入DSLEABX,TABLE;取TABLE的偏移地址XLAT;查表,(AL)=01001011B(B)POPDS;恢复DS寄存器内容,设(AL)=00001011B下面程序执行后,AL中的二进制数改变为对应的十六进制数字符的ASCII代码01000010(B)。,80,例:若(BX)=0040H,(AL)=0FH,(DS)=F000H(F004F)=2CH则执行XLAT指令后(AL)=2CH;把AL中的代码0FH转换为2CH。,(BX)=0040H,(AL)=0FH,2CH,存储器,(DS)=F000H,数据段,表格,4.换码指令XLAT,81,例:,4.换码指令XLAT,datasegmenttable1db30h,31h,32hdataendsdsegsegmenttable2db34h,35h,36hdsegends,codesegmentassumecs:code,ds:data,es:dsegstart:movax,datamovds,axmovax,dsegmoves,axmovbx,0moval,1xlatmoval,1xlattable2movah,4chint21hcodeendsendstart,(AL)=31H,(AL)=35H,82,如何把AL寄存器中的十进制数字转换为ASCII码值?,4.换码指令XLAT,datasegmenttabledb0123456789dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovbx,offsettablemoval,5xlatmovah,4chint21hcodeendsendstart,83,2.2.5堆栈,堆栈(STACK)是用户使用的存储器的一部分,用来存放临时性的数据和其他信息,例如函数使用的局部变量、调用子程序的入口参数、返回地址等。,堆栈的段基址必须放在SS中。堆栈段的“栈顶”地址(偏移地址)放在SP寄存器中。,84,在SEGMENT伪指令中增加“STACK”表示该段是“堆栈”。这个程序装入时,操作系统把SSEG的段基址置入SS,堆栈段的字节数(本例中为200=0C8H)置入SP。,1.堆栈段结构,SSEGSEGMENTSTACK;堆栈段开始DW100DUP(?);大小为100个字SSEGENDS;堆栈段结束,堆栈段的定义:,85,从较大地址开始分配和使用(数据段、代码段从较小地址开始分配和使用);由SP中地址指出的存储单元称为“栈顶”,数据总是在“栈顶”位置存入(称为“压入”)、取出(称为“弹出”);最先进入的数据最后被弹出(FirstInLastOut,FILO),最后进入的数据最先被弹出(LastInFirstOut,LIFO),堆栈段的特点:,86,压入2B数据的操作SP(SP)2SS:SP数据,弹出2B数据的操作目的操作数SS:SPSP(SP)+2,87,ES,DS指向PSP;SS指向用户程序区;CS指向用户代码段(由END伪指令指明);(SP)=0000H,指向64KB存储器尾部。,程序规模较小时,可以不定义堆栈段,用户程序装入内存时:,88,2.8086CPU堆栈指令,指令的操作数是16b的寄存器、存储器、段寄存器(CS除外)。指令执行后,操作数的内容被更新。,(1)PUSH(压栈)指令:把16b操作数压入堆栈,格式:PUSHREG16/MEM16/SEG,指令的操作数是16b的寄存器、存储器、段寄存器。指令执行后,操作数的内容不变。,格式:POPREG16/MEM16/SEG,(2)POP(出栈)指令:从堆栈中弹出16b存入操作数,89,例1:把CS寄存器内容存入DSPUSHCSPOPDS例2:子程序中通常利用堆栈保护数据PUSHAXPUSHBXPUSHCXPOPCXPOPBXPOPAX,2.8086CPU堆栈指令,90,(3)PUSHF指令:把FLAGS寄存器内容压入堆栈。,格式:PUSHF,(4)POPF指令:从堆栈弹出16b送入FLAGS寄存器。指令执行后,各标志位被刷新。,格式:POPF,举例:下面程序段把TF标志位置位(置1):PUSHFPOPAX;AXFlagsORAX,0100H;将D8(TF位)置1PUSHAXPOPF;FlagsAX,91,(5)LAHF指令:把FLAGS寄存器的低8位送入AH寄存器。,格式:LAHF,(6)SAHF指令:把AH寄存器内容送入FLAGS寄存器的低8位,它的执行刷新了SF,ZF,AF,PF,CF标志位。,格式:SAHF,92,3.扩展的堆栈指令,80386开始的微处理器增设了32b的堆栈指令。,PUSHREG32/MEM32;32位寄存器、存储器操作数压入堆栈POPREG32/MEM32;从堆栈弹出32位,送入目的操作数PUSHIMM;16/32位立即数压入堆栈,例1:PUSHEAXPUSHDWORDPTRDIPOPECXPOPDWORDPTRSIPUSH0A123H,93,PUSHAD;把8个32位通用寄存器顺序压栈POPAD;从堆栈中弹出8个32b数据顺序存入通用寄存器,80386增加了8个32位通用寄存器的入、出栈指令,顺序同上。,80286微处理器增加了在一条指令中把8个通用寄存器压入、弹出堆栈的指令,压入的顺序是:AX、CX、DX、BX、SP、BP、SI、DI。注意:这里的SP代表指令执行之前的值。弹出的顺序相反。,PUSHA;把8个16位通用寄存器顺序压栈POPA;从堆栈中弹出8个16b数据,顺序存入通用寄存器,上述指令执行都不影响标志位。,94,80386开始新增加了压入、弹出32位EFLAGS寄存器指令.,PUSHFD;把32位EFLAGS寄存器内容压入堆栈,原寄存器内容不变POPFD;从堆栈中弹出32b,存入EFLAGS,寄存器内容被更新,95,2.2.6操作数表达式,指令中的操作数可以是一个表达式,这个表达式的值在汇编成目标代码的时候进行计算,产生目标代码。,例:设变量X的偏移地址为1020H,MOVAL,X+5,MOVAL,1025H,96,汇编时,对EQU定义的符号名用对应的表达式进行“替换”。,1符号定义伪指令,符号名EQU表达式,NUMEQU215MOD15ERR_MSGEQU“DataOverride”,MESSAGEDBERR_MSGMOVCX,NUM+1,例1,有以下定义:,;等价于MESSAGEDB“DataOverride”,;等价于MOVCX,215MOD15+1,用EQU定义的符号名不允许重复定义。,97,POINTEREQUBUFFERDIWTEQUWORDPTR,MOVBX,POINTERMOVWTPOINTER,0,举例2,有以下定义:,;等价于MOVBX,BUFFERDI,;等价于MOVWORDPTRBUFFERDI,0,98,TIMES=0TIMES=TIMES+1,使用“=”定义符号名时,只能使用常数表达式,而且对一个符号名可以多次定义。一个新的定义出现后,原来定义自动终止。,符号定义伪指令:有助于提高程序的可读性和可靠性;先定义,后使用,99,“”称为“索引运算符”,用来括起组成偏移地址的一个分量,各分量相加,得到最后的偏移地址。,2.地址表达式,+,运算符对构成偏移地址的各个分量进行“加”、“减”操作。,存储器操作数X+5产生EA=1025H,指令MOVBL,X10H产生EA=1010H,MOVAX,2BXDI,MOVAX,BX+DI+2,MOVAX,BUFFERBX2,MOVAX,BUFFER+BX+2,设变量X的偏移地址为1020H,100,3立即数表达式,立即数表达式在汇编源程序时进行计算,它的结果用作指令中的立即数操作数。这种表达式中的运算对象必须是“已知”的,否则无法进行计算。用于产生立即数操作数的表达式有4类运算符:算术运算符、逻辑运算符、关系运算符、地址运算符。,101,(1)算术运算符,+(相加),(相减),*(相乘),/(整除运算),MOD(取余数),(*,/)(MOD)(+,),运算优先级从高到低依次为,可以使用圆括号改变运算顺序,MOVBX,32+13/6MOD3,32+(13/6)MOD3),MOVBX,0022H,34=22H,例:,102,(2)逻辑运算符,(SHL、SHR)(NOT)(AND)(OR、XOR),运算优先级从高到低依次为,SHR(右移)、SHL(左移)、AND(逻辑与)、OR(逻辑加)XOR(异或,半加)、NOT(逻辑非、取反),例:,ORAL,03HAND45HMOVAL,30SHR1,MOVAL,15,ORAL,01H,103,(3)关系运算符,GT(大于)、GE(大于或等于)、LT(小于)、LE(小于等于)、EQ(等于)、NE(不等于),关系运算符用于两个数的比较,结果为“真(-1)”或“假(0)”,MOVAX,6000HGE5000H,MOVAX,0FFFFH,MOVEAX,3GE2,MOVEAX,00000000H,例:,104,(4)地址运算符,地址运算符对变量名、标号、地址表达式进行计算,得到作为立即数的运算结果1)SEG取地址表达式所在段的段基址,例:设变量LIST定义在DATA段中,下面三条指令都是把DATA段的段基址装入AX:,MOVAX,DATA;DATA代表该段的段基址,是一个立即数MOVAX,SEGDATA;取DATA的段基址,结果是立即数MOVAX,SEGLIST;取LIST的段基址,结果是立即数,105,XDB“ABCDE”YDW3DUP(5),4DUP(-1)ZDD34,49,18,2)OFFSET取地址表达式的偏移地址,MOVAX,LIST;取出变量LIST第一个元素送入AXMOVAX,OFFSETLIST;取变量LIST的偏移地址送入AX,3)TYPE、LENGTH、SIZE三个运算符分别用于取变量或标号的类型、取变量定义时的元素个数、取变量占用的字节数。,近程标号的类型为-1、远程标号的类型为-2,例:,例:,;TYPE=1,LENGTH=1,SIZE=1,;TYPE=2,LENGTH=3,SIZE=6,;TYPE=4,LENGTH=1,SIZE=4,106,上面所有的表达式都必须是汇编期间可以求值的。“MOVAX,BX+2”是一条错误的指令,汇编时将报告错误,原因在于BX的值是未知的,可变的,在汇编阶段无法进行相关的计算。需要把BX的值与常数2相加并存入AX的操作只能在程序执行阶段由以下两条指令完成:MOVAX,BX;BX寄存器值存入AX寄存器ADDAX,2;AX寄存器的值加上2,结果存入AX,107,2.3汇编语言上机操作,2.3.1编辑2.3.2汇编2.3.3连接2.3.4运行和调试,108,汇编语言源程序编制完成后,在计算机上的操作过程分为四个阶段:编辑、汇编、连接、运行调试,109,2.3.1编辑,输入源程序;对源程序进行修改。,编辑阶段的主要任务是:,一定要用“纯文本”格式来储存源程序文件,否则无法汇编。产生的源程序文件应该以“.ASM”或“.TXT”为扩展名,最好使用“.ASM”扩展名。,大多数的文字编辑软件都可以用来输入和修改汇编语言源程序,如记事本(Notepad)、写字板(Writer)、Word以及命令行方式下的Edit。,110,2.3.2汇编,汇编阶段的任务是把汇编语言源程序“翻译”成为机器代码(称为“目标”),产生二进制的“目标文件”。,常用的汇编工具,Microsoft公司的MASM(MacroAssembler,宏汇编)Borland公司的TASM(TurboAssembler),假设已经产生了一个汇编语言源程序文件“MYPRG1.ASM”,可以用如下命令进行汇编:,该命令正确执行后,将产生一个同名的目标文件MYPRG1.OBJ。,TASMMYPRG1,111,如果汇编语言源程序文件以“.TXT”为扩展名,汇编时要使用这个文件的“全称”:,TASMMYPRG1.TXT,Errormessages:NoneWaringmessage:None,TASM命令执行后,在屏幕上显示相关信息。,说明这个程序已经顺利地通过了“汇编”,没有发现错误。,*Error*EX2.ASM(14)ValueoutofrangeErrormessages:1,表示汇编源程序EX2.ASM第14行有“数值超出范围”的错误,程序的错误总数为1。,112,/ZI产生用于程序调试的完整信息/L产生同名的列表文件,完整的TASM命令行,TASMOPTIONSOURCE,OBJECT,LISTING,XREF,OPTION这一部分可以给汇编过程提供一些可选择的项目。常用的选项有:,OBJECT通过这个选项另外指定目标文件名,LISTING用这个选项指定列表文件的名称,XREF这个选项用来产生交叉引用文件,113,对源程序“PRG.TXT”进行汇编,产生名为“PRG1.OBJ”的目标文件名为“PRG1.LST”的列表文件,同时产生程序调试所需要的完整信息(包含在目标文件中)。,关于TASM命令更详细的信息,可以打入命令“TASM/?”获得。,TASM/ZIPRG.TXT,PRG1,PRG1,114,2.3.3连接,连接阶段主要完成的操作是:,把几个程序模块产生的目标文件连接成一个完整的可执行程序;把“子程序库”中的子程序连接到程序中去。,由单个程序文件组成的简单程序,连接命令如下,TLINKEX2,对目标文件“EX2.OBJ”进行连接操作,产生同名的可执行程序“EX2.EXE”。如果程序里没有定义堆栈段,连接过程

温馨提示

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

评论

0/150

提交评论