《数据定义与传送哦.ppt》由会员分享,可在线阅读,更多相关《数据定义与传送哦.ppt(136页珍藏版)》请在三一办公上搜索。
1、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 数据段
2、,DATASEGMENT;在这里定义数据 DATAENDS,DATA:程序员给这个段起的名字。SEGMENT:保留字,说明一个段从这里开始。ENDS:保留字,说明一个段到此结束。;分号后面的文字是“注释”,不参加汇编,6,伪指令:说明性的语句;汇编后不会产生对应的机器指令。,2.1.1 数据段,数据段名SEGMENT 数据段名ENDS,7,2.1.2 数据定义,数据定义伪指令:变量名 数据定义伪指令助记符 数据,数据,数据定义伪指令助记符:DB(Define Byte):每个数据占用一个字节(8b)DW(Define Word):每个数据占用一个字(16b)DD(Define Double W
3、ord):每个数据占用一个双字(32b)DQ(Define QuartWord):每个数据占用8个字节(64b)DT(Define Ten Byte):每个数据占用10个字节(80b),8,DATASEGMENTXdb-1,255,A,3+2,?db“ABC”,0FFH,11001010BYdb3 dup(?)DATAENDS,数据定义举例(1):,有符号数用它的补码存储字符用ASCII代码存储?表示一个尚未确定的值DUP表示重复定义变量名代表这个单元的地址,9,DSEGSEGMENTZDW-2,-32768,65535,ABWDD 12345678H,-400000DW Z,W-ZDSEGE
4、NDS,数据定义举例(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,11001010BYdb3
5、 dup(?)DATAENDS,DSEGSEGMENTZDW-2,-32768,65535,ABWDD 12345678H,-400000DW Z,W-ZDSEGENDS,12,操作数:是用逗号分割的常数表达式?不确定 dup 复制操作符 可以是字符串 可以是变量名,2.1.2 数据定义,数据定义伪指令:变量名 数据定义伪指令助记符 数据,数据,13,例:X dw 23 Y db 23Z db?M dw?db 3,2 dup(1,2)dw 3,2 dup(1,2),3,1,2,1,2,2.1.2 数据定义,14,例:str1 db a,b str2 db abstr3 dw a,b str4
6、dw ab 61 62h str5 dw abc,str1 db hello str2 dw hello,2.1.2 数据定义,15,mess1 db 12,13 mess2 dw 24 mess3 dw mess1 mess4 dd mess2,mess3,mess1的偏移地址,mess4,mess2的偏移地址,mess2的段基址,2.1.2 数据定义,16,练 习,某数据段内有如下数据定义:Xdb30,30H,ABC,2-3,?,11001010B dw0FFH,-2,“CD”Ydd20 dup(15,3 dup(?),0)Zdb3 dup(?)WdwZ-X假设变量X的偏移地址为20H。(
7、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
8、,伪指令和指令的区别,与CPU有关不同的CPU类型有不同的指令系统,与汇编程序有关汇编程序的版本不同,所提供的伪指令不同,使CPU产生动作,不产生CPU动作,指令的执行是在程序的运行期间,在程序执行前(汇编期间)由汇编程序来处理,产生目标代码,不产生目标代码,MOV AX,1234HLEA AX,1234H,DB.MODEL SMALL,20,180X86指令格式,如:BEGIN:MOV AX,0;将0传送给AX标号:程序员给这一行起的名字,后面跟上冒号,代表这一行的地 址。标号用字母开始,不要使用保留字作为标号。操作码是这条指令需要完成的操作,用指令助记符表示。,标号:操作码 操作数;注释,
9、2.2.1 指令格式,21,操作数 是指令的操作对象,指令的操作数可以03个。两个操作数时,右面的操作数称为“源操作数”,左面的操作数称为“目的操作数”。“源操作数”参与指令操作,不保存结果,内容不会改变。“目的操作数”参与指令操作,还保存指令的操作结果,指令执行后,目的操作数的内容被改变。;注释 用来添加一些说明,例如说明本行指令的功能。,180X86指令格式,标号:操作码 操作数;注释,如:BEGIN:MOV AX,0;将0传送给AX,22,2 操作数,(1)寄存器操作数:包括段寄存器、数据寄存器、地址寄存器例如:MOVBX,AX功能:AX寄存器内容送入BX寄存器。AX是“源操作数”,写在
10、右边,指令执行后,它的内容不会被改变。BX是“目的操作数”,写在左边,指令执行后,它的内容将被改变。,注意:专用寄存器IP/EIP和FLAGS/EFLAGS不能作为操作数 出现在指令中。,23,(2)立即数操作数:二进制/十进制/十六进制常数,可求值的 表达式,字符,标号等。,常数300送入BX寄存器MOVBX,300或者:MOVBX,150*2,DATA段的段基址送DS MOVAX,DATA MOVDS,AX,注意:立即数不能用作“目的操作数”。,24,为了对存储器的一个单元进行访问,需要给出这个单元的 段基址和偏移地址。大多数情况下,指令使用DS寄存器的内容作为操作数的段 基址,指令中不需
11、要再指出段基址。,3存储器操作数,指出偏移地址的方法有两种:直接的和间接的。,25,(1)直接(偏移)地址:在指令里直接写出存储单元的偏移地址。,DATA SEGMENTA DB 12,34,56ARRAY DW 55,66,77,88,99DATA ENDS,把变量(数组)A的前两个数据送BL,BH寄存器:MOV BL,A;也可以写作 MOV BL,A MOV BH,A+1;或MOV BH,A+1,MOV BH,A 1 A代表数据“12”的偏移地址,A+1是数据“34”的偏移地址。,MOV BX,A;把变量A送BL,变量A+1送BH,错误!,26,(1)直接(偏移)地址:在指令里直接写出存储
12、单元的偏移地址。,DATA SEGMENTA DB 12,34,56ARRAY DW 55,66,77,88,99DATA ENDS,假设已经知道A的偏移地址是0000H,前面的指令可以写作:MOV BL,0000H;方括号不能省略 MOV BH,0001H;方括号不能省略 常数地址格式一般没有实用价值。上面的两条指令可以用一条指令代替,效果相同:MOV BX,0000H;取地址0000H开始的两字节,送入BL和BH,27,举例1:假设已经定义:XDW350 MOV BX,X MOV BL,X举例2:MOV AL,2100HMOV AX,2100HMOV EAX,2100H,;是16位传送指令
13、,正确,;是错误的,操作数类型不匹配,;正确,8位传送指令,2100H是字节地址,;正确,16位传送指令,2100H是字地址,;正确,32位传送指令,2100H是双字地址,28,(2)间接(偏移)地址:把存储单元的偏移地址先装入某个寄存器,通过这个寄存器来找到这个存储单元,也称为“寄存器间接寻址”。,注意:16位80X86微处理器只有BX,BP,SI,DI这4个寄存器可以用来“间接寻址”。不另加说明的话,使用BP时自动用SS的值作为段基址,使用BX,SI,DI时自动用DS的值作为段基址。,举例1:已经定义:A DB 12,34MOVSI,OFFSET A;把变量A的偏移地址装入SI;OFFSE
14、T是保留字,表示取出后面变量的偏移地址MOVBL,SI;变量A的第一个值送BLMOVBH,SI+1;第二个值送BH,MOV BH,1SI,29,举例2:已经定义:ARRAY DW 35,73,27,780,12,55取出字数组ARRAY的第3个元素送入AX:;方法1MOV AX,ARRAY 4;ARRAY代表数组首地址,位移量=4,直接寻址;也可以写作MOV AX,ARRAY+4;方法2MOV BX,OFFSET ARRAY;数组首地址装入BXMOV AX,BX+4;第3个元素距数组首元素4个字节;方法3MOV BX,4;第3个元素距数组首地址的位移量装入BXMOV AX,ARRAY BX;A
15、RRAY代表数组首地址,BX中是位移量,30,(2)间接(偏移)地址:基址变址寻址:用两个寄存器联合起来寻址。从(BX,BP)和(SI,DI)中各 选出一个使用。出现BP时使用SS作为段基址寄存器,其它情况用DS。例:MOV AX,BX+SI;基址(BX)变址(SI)寻址,31,寻址方式,立即数寻址寄存器寻址存储器寻址,直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址,32,1 立即数寻址,例:MOV AL,05H;(AL)05HMOV AX,0102H;(AX)0102HMOV AX,abMOV AX,0B012H,立即寻址,33,2 寄存器寻址方式,例:MOV BX,123
16、4H;(BX)1234HMOV AX,BX;(AX)(BX),寄存器寻址,可用寄存器:段寄存器(DS,CS,SS,ES)数据寄存器(AX,BX,CX,DX)地址寄存器(BX,BP,SI,DI),34,3 直接寻址,例:MOV AX,2000H;(AX)DS:2000HMOV AX,ARRAY;(AX)ARRAY,直接寻址,35,例:MOV AX,BX;(AX)DS:(BX),4 寄存器间接寻址,寄存器间接寻址,可用寄存器:地址寄存器(BX,BP,SI,DI)BP-SS;BX、SI、DI-DS,36,例:MOV AX,6SI;(AX)DS:(SI+6)或MOV AX,SI+6 或MOV AX,C
17、OUNTSI,5 寄存器相对寻址,寄存器相对寻址,37,例:MOV AX,BXDI;(AX)DS:(BX+DI)或 MOV AX,BX+DI,6 基址变址寻址,基址变址,可用寄存器:地址寄存器(BX,BP,SI,DI)基址寄存器:BX、BP 变址寄存器:SI、DI,38,例:MOV AX,MASKBXSI 或MOV AX,MASKBX+SI 或MOV AX,MASK+BX+SI,7 相对基址变址寻址,相对基址变址,39,寻址方式,立即数寻址寄存器寻址存储器寻址,直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址,40,练 习,MOV AX,ARRAY4MOV AX,BX MOV
18、AX,BX+2MOV AX,ARRAY BXMOV AX,BX+SIMOV AX,BX+DI+2,;直接寻址,偏移地址=ARRAY+4,;寄存器间接寻址,;寄存器相对寻址,;寄存器相对寻址,;基址(BX)变址(SI)寻址,;相对基址变址寻址,41,请指出以下各指令的操作数所使用的寻址方式。(1)MOV SI,2100H(2)SBB DISPBX,7(3)AND DI,AX(4)OR AX,609EH(5)MOV BXDI30H,CX(6)PUSH ES:BP,练 习,42,(BX)=637DH,(SI)=2A9BH,D=7237H,试确定在以下各种寻址方式下的偏移地址是多少?(1)直接寻址(2
19、)使用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)MOV AX,1200H(2)MOV AX,1200H(3)MOV AX,1100BX(4)MOV AX,1100BXSI,练 习,44,32位80 x86微处理器的存储器寻址:,偏移地址=基址+比例因子
20、变址+位移量,位移量:存放在指令中的一个8位、16位或32位的数;基址:存放在基址寄存器中的内容;变址:存放在变址寄存器中的内容;比例因子:(386及其后继机型)值可为1,2,4或8;,直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址,+,相对比例变址寻址,基址比例变址寻址方式,相对基址比例变址寻址方式,45,32位80 x86微处理器的存储器寻址:,MOV AX,ARRAY4 MOV AX,ECX MOV AX,EAX+4MOV AX,EBX+ECXMOV AX,EBP+EDX+4 MOV AX,EBX+4*ESI MOV AX,8*EBP+ECX+6,;直接寻址,偏移地址=
21、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 伪指令用来指定段和段寄存器之间的对应关系,供汇编程序使
22、用。,DATASEGMENT ADB55DATAENDSDSEGSEGMENT XDB10DSEGENDS,CODE SEGMENTASSUME DS:DATA,ES:DSEG,CS:CODE MOV AX,DATA MOV DS,AX MOV AX,DSEG MOV ES,AXCODE ENDS,指令 MOV AL,A;自动按照 MOV AL,DS:0000H的格式汇编,执行后(AL)=55。指令 MOV DL,X;自动按照 MOV DL,ES:0000H的格式汇编,执行后(DL)=10。,把段地址装入相应的段寄存器,代码段不需要此操作,在程序初始化时完成。,49,为了得到正确结果,上面第4
23、条指令改写为:MOVDL,ES:DI;执行后(DL)=10,结果正确,这条指令“显式”地指定了段基址,汇编出来的机器指令比 MOV DL,DI多一个字节,称为“段跨越前缀”。,MOV SI,OFFSET A;A的偏移地址装入SIMOV DI,OFFSET X;X的偏移地址装入DIMOV AL,SI;取A的值送ALMOV DL,DI;取X的值送DL执行的结果:(AL)=55 正确,(DL)=55 错误,50,程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX;其他指令 MOVAX,4C00H INT21HCODEEN
24、DSENDSTART,2.2.2 程序段,51,处理器选择伪指令.386.386P.486.486P.586.586P.686.686P.386表示程序选用80386的基本指令集,.386P表示选用80386的基本指令和保护模式下的特权指令。缺省的处理器选择伪指令是.8086,指令 INT 21H 表示调用由操作系统提供的21H号服务程序。AH中为“功能号”,AH=4CH表示返回操作系统的操作。AL中的代码称为“返回代码”,00H表示“正常返回”。END 伪指令表示整个程序到此结束,后面的标号START表示 程序入口地址。,52,2.2.2 程序段,程序段常见格式:CODESEGMENTASS
25、UMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;其他指令MOVAX,4C00HINT21HCODEENDSENDSTART,53,2.2.3 基本传送指令,MOV指令的一般格式:,1MOV(Move,传送)指令,MOV指令把源操作数(source)传送到目的操作数(destination),MOVdest,src,举例:设指令执行前,(AX)=2345H,(BX)=1111H。指令“MOV AX,BX”执行后,(AX)=1111H,(BX)=1111H。,54,源操作数可以是:寄存器、存储器、立即数;目的操作数可以是:寄存器、存储器。,55,MOV指令的使
26、用限制:源操作数与目的操作数可以是字节、字或双字,但必须有相同的类型;源操作数与目的操作数不能同时为存储器操作数;目的操作数不能是立即数;FLAGS、EFLAGS、IP、EIP不能用作操作数;源操作数与目的操作数不能同时为段寄存器;目的操作数是段寄存器时,源操作数只能是寄存器或存储器,不能是立即数;CS不能用作目的操作数。,56,1MOV(Move,传送)指令,57,MOVCL,DH;字节传送指令,DH寄存器内容送入CLMOVECX,EDX;双字传送指令,EDX寄存器内容送入ECXMOVAX,CS;字传送指令,CS寄存器内容送入AXMOVSS,CX;字传送指令,CX寄存器内容送入SS,MOV
27、指令举例(寄存器、寄存器操作数):,正确:,错误:,MOVCL,DX MOVESI,BHMOVCS,AXMOVDS,CS,;操作数类型不匹配,;操作数类型不匹配,;CS寄存器不能作为目的操作数,;不能同时为段寄存器,58,MOVAL,30H;字节传送指令,执行后(AL)=30HMOVAX,30H;字传送指令,执行后(AX)=0030HMOVEAX,30H;双字传送指令,执行后(EAX)=0000 0030HMOVAL,-5;字节传送指令,执行后(AL)=0FBHMOVAX,-5;字传送指令,执行后(AX)=0FFFBH,MOV 指令举例(立即数、寄存器操作数):,正确:,错误:,MOV 30H
28、,ALMOV AL,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,BLMOV X_BYTE,AX,;DX寄存器不能用来寄存器间接寻址,;操作数类型不匹配,60,MOV 指令举例(存储器、立即数操作数):,正确:,错误:,MOVX_B
29、YTE,-5;字节传送指令,-5(0FBH)送X_BYTEMOVY_WORD,-5;字传送指令,-5(0FFFBH)送Y_WORD,假设变量X_BYTE用DB定义,变量Y_WORD用DW定义,MOVX_BYTE,300MOVBX,30H,;目的操作数超出范围,;操作数类型不能确定,61,错误:,MOVX_BYTE,SI MOVX_BYTE,K_BYTE MOVSS,DS,两个操作数不能同时为存储器操作数或段寄存器!,;不能同时为存储器操作数,;不能同时为存储器操作数,;不能同时为段寄存器操作数,62,DATA SEGMENT X DB 30H DATA ENDS DSEG SEGMENT A
30、DB 31H DSEG ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DSEG START:MOV AX,DATA MOV DS,AX MOV AX,DSEG MOV ES,AX _;把X的值传送给AL _;把A的值传送给AH MOV AX,4C00H INT 21H CODE ENDS END START,MOV AL,X,MOV AH,A,MOV AL,0000H,MOV AH,0000H,MOV AH,ES:0000H,63,可以用“PTR”指定,或强行改变操作数的类型:,MOVBYTE PTRBX,20HMOVWORD PTRBX,20HMOV
31、DWORD PTRBX,20HMOVBYTE PTRY_WORD,20H MOVAL,BYTE PTRY_WORD MOVWORD PTRX_BYTE,20H,;20H送DS:BX,;20H送DS:BX,00H送DS:BX+1,;00 00 00 20H送DS:BX开始4个字节,;20H送变量Y_WORD的第1个字节,;变量Y_WORD的第1个字节送AL寄存器,;00 20H送变量X_BYTE开始的2个字节,格式:type PTR expression,64,一般格式:LEA把源操作数的偏移地址装入目的操作数。,2LEA(Load Effective Address,装载有效地址)指令,举例:
32、假设变量X的偏移地址为1020H(SI)=4455H,(EAX)=1020H,(EBP)=20HLEA DX,X LEA BX,4EBP*2EAX,LEA REG16,MEM,;执行后,(DX)=1020H,;执行后,(BX)=4+20H2+1020H=1064H,65,例:LEA BX,LIST MOV BX,OFFSET LIST,注意:OFFSET只能和简单的符号地址相连.如:MOV BX,OFFSET LISTSI;非法指令,2LEA(Load Effective Address,装载有效地址)指令,66,例2-1 编写程序,把4个元素的字节数组ARRAY清零。DATASEGMENT
33、ARRAYDB4 DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AXMOVARRAY,0;第一个元素清零MOVARRAY+1,0;第二个元素清零MOVARRAY+2,0;第三个元素清零MOVARRAY+3,0;第四个元素清零MOVAX,4C00HINT21HCODEENDSENDSTART,数据传送类程序:,67,MOV AX,0LEA BX,ARRAY;数组ARRAY首地址装入BXMOV WORD PTR BX,AX;第一、第二个元素清零MOV WORD PTR BX+2,AX;第三、第四个元素清零
34、,一次将两个元素同时清零:,MOV WORD PTR ARRAY,0;第一、第二个元素清零MOV WORD PTR ARRAY+2,0;第三、第四个元素清零,使用立即数指令代码较长。把这个立即数事先存放在寄存器中:,MOV AX,0MOV WORD PTR ARRAY,AX;第一、第二个元素清零MOV WORD PTR ARRAY+2,AX;第三、第四个元素清零,把数组ARRAY的首地址事先装入地址寄存器,程序更简捷:,68,例2-2 字数组X的最后2个元素值送入Y数组对应单元DATA SEGMENT XDW 55,112,37,82 YDW 4 DUP(?)DATA ENDSCODE SEG
35、MENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOVDS,AX MOVDI,4;第三个元素在数组内的位移 MOVAX,XDI;取出X数组第三个元素 MOVYDI,AX;送入Y数组第三个元素中 MOVAX,XDI+2;取出X数组第四个元素 MOVYDI+2,AX;送入Y数组第四个元素中 MOVAX,4C00H INT 21HCODE ENDS END START,数据传送类程序:,69,2.2.4 其他传送指令,1.地址传送指令LDS,LES,LFS,LGS,功能:从存储器取出4B,前面的2B送入指定的寄存器,后面的2B 送入由指令操作码包含的段寄存
36、器。格式:LDSREG16,MEM32;从存储器取出4B,送入REG16和DSLESREG16,MEM32;从存储器取出4B,送入REG16和ESLFSREG16,MEM32;从存储器取出4B,送入REG16和FSLGSREG16,MEM32;从存储器取出4B,送入REG16和GS说明:1)LFS/LGS只能用于386及其后继机型中。2)不影响标志位。,70,例:LDS SI,10H 执行前:(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H 执行后:,1.地址传送指令LDS,LES,LFS,LGS,(SI)=0180H(DS)=2000H,71,40 H00 H
37、00 H30 H,MOV BX,TABLEMOV BX,OFFSET TABLELEA BX,TABLELDS BX,TABLE LES BX,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,送入EA
38、XCDQ;将EAX寄存器内容符号扩展成64b,送入EDX和EAX,2.扩展传送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQ,功能:把8位的操作数扩展为16/32位,或者把16位的操作数扩 展为32位,送入目的寄存器。,说明:1)CWDE、CDQ是386后继机型新增的;2)主要用于有符号数除法之前对被除数位数进行扩展。,73,举例:假设有(EAX)=0000 8060H CBW CWD CWDE CDQ,2.扩展传送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQ,;(AX)=0060H,;(DX)=0FFFFH,(AX)=8060H,;(EAX)=0FFFF 806
39、0H,;(EDX)=0000 0000H,(EAX)=0000 8060H,74,MOVZX REG16/REG32,REG8/MEM8/REG16/MEM16功能:将8/16位寄存器/存储器操作数零扩展,送入16/32位寄存器,MOVSX REG16/REG32,REG8/MEM8/REG16/MEM16功能:将8/16位寄存器/存储器操作数符号扩展,送入16/32位寄存器,举例:设有(AX)=8060HMOVZX EBX,AXMOVSX EBX,AXMOVSX EBX,AL,;(EBX)=0000 8060H,;(EBX)=0FFFF 8060H,;(EBX)=0000 0060H,75,
40、3.交换指令XCHG,SWAP,格式:XCHG REG/MEM,REG/MEM功能:交换源、目的操作数的内容。说明:1)可以在寄存器之间或者在寄存器和存储器之间交换信息。2)不允许使用段寄存器。3)不影响标志位。,格式:BSWAP REG32功能:交换32位寄存器的最高字节和最低字节、次高字节和次低 字节。说明:486后继机型新增指令。,76,举例1:寄存器和寄存器交换mov ax,1234hmov bx,5678hxchg ax,bx xchg ah,al举例2:寄存器和存储器交换xchg ax,2000h;字交换xchg al,2000h;字节交换xchg eax,2000h;双字交换,3
41、.交换指令XCHG,SWAP,;(ax)=5678h,(bx)=1234h,;(ax)=7856h,77,举例3:(EAX)=12345678HXCHG AH,ALBSWAP EAX,;(AX)=7856H,;(EAX)=78563412H,3.交换指令XCHG,BSWAP,78,4.换码指令XLAT,格式:XLAT MEM16功能:以MEM16对应段寄存器为段基址,以BX为偏移地址查表,格式:XLAT;ALDS:BX+AL功能:用AL寄存器的内容查表,结果存回AL寄存器。表格的 首地址事先存放在DS:BX中。,79,TABLEDB“0123456789ABCDEF”PUSHDS;保护DS寄存
42、器内容MOVBX,SEG TABLE;取TABLE所在的段基址送BXMOVDS,BX;从BX转送入DSLEABX,TABLE;取TABLE的偏移地址XLAT;查表,(AL)=0100 1011B(B)POPDS;恢复DS寄存器内容,设(AL)=0000 1011B下面程序执行后,AL中的二进制数改变为对应的十六进制数字符的ASCII代码0100 0010(B)。,80,例:若(BX)=0040H,(AL)=0FH,(DS)=F000H(F004F)=2CH 则执行 XLAT 指令后(AL)=2CH;把AL中 的代码0FH转换为2CH。,(BX)=0040H,(AL)=0FH,2CH,存储器,(
43、DS)=F000H,数据段,表格,4.换码指令XLAT,81,例:,4.换码指令XLAT,data segment table1 db 30h,31h,32hdata endsdseg segment table2 db 34h,35h,36hdseg ends,code segment assume cs:code,ds:data,es:dsegstart:mov ax,data mov ds,ax mov ax,dseg mov es,ax mov bx,0 mov al,1 xlat mov al,1 xlat table2 mov ah,4ch int 21hcode ends end
44、 start,(AL)=31H,(AL)=35H,82,如何把AL寄存器中的十进制数字转换为ASCII码值?,4.换码指令XLAT,data segment table db 0123456789data endscode segment assume cs:code,ds:datastart:mov ax,data mov ds,ax mov bx,offset table mov al,5 xlat mov ah,4ch int 21hcode ends end start,83,2.2.5 堆栈,堆栈(STACK)是用户使用的存储器的一部分,用来存放临时性的数据和其他信息,例如函数使用的
45、局部变量、调用子程序的入口参数、返回地址等。,堆栈的段基址必须放在SS中。堆栈段的“栈顶”地址(偏移地址)放在SP寄存器中。,84,在SEGMENT伪指令中增加“STACK”表示该段是“堆栈”。这个程序装入时,操作系统把SSEG的段基址置入SS,堆栈 段的字节数(本例中为200=0C8H)置入SP。,1.堆栈段结构,SSEG SEGMENT STACK;堆栈段开始 DW100 DUP(?);大小为100个字 SSEG ENDS;堆栈段结束,堆栈段的定义:,85,从较大地址开始分配和使用(数据段、代码段从较小地址开 始分配和使用);由SP中地址指出的存储单元称为“栈顶”,数据总是在“栈顶”位置存
46、入(称为“压入”)、取出(称为“弹出”);最先进入的数据最后被弹出(First In Last Out,FILO),最后进入的数据最先被弹出(Last In First Out,LIFO),堆栈段的特点:,86,压入2B数据的操作 SP(SP)2 SS:SP 数据,弹出2B数据的操作 目的操作数SS:SP SP(SP)+2,87,ES,DS指向PSP;SS指向用户程序区;CS指向用户代码段(由END伪指令指明);(SP)=0000H,指向64KB存储器尾部。,程序规模较小时,可以不定义堆栈段,用户程序装入内存时:,88,2.8086CPU堆栈指令,指令的操作数是16b的寄存器、存储器、段寄存器
47、(CS除外)。指令执行后,操作数的内容被更新。,(1)PUSH(压栈)指令:把16b操作数压入堆栈,格式:PUSH REG16/MEM16/SEG,指令的操作数是16b的寄存器、存储器、段寄存器。指令执行后,操作数的内容不变。,格式:POP REG16/MEM16/SEG,(2)POP(出栈)指令:从堆栈中弹出16b存入操作数,89,例1:把CS寄存器内容存入DS PUSH CS POPDS例2:子程序中通常利用堆栈保护数据 PUSH AX PUSH BX PUSH CX POP CX POP BX POP AX,2.8086CPU堆栈指令,90,(3)PUSHF指令:把FLAGS寄存器内容压
48、入堆栈。,格式: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,Z F,AF,PF,CF标志位。,格式:SAHF,92,3.扩展的堆栈指令,80386开始的微处理器增设了32b的堆栈指令。,PUSH R
49、EG32/MEM32;32位寄存器、存储器操作数压入堆栈 POP REG32/MEM32;从堆栈弹出32位,送入目的操作数 PUSH IMM;16/32位立即数压入堆栈,例1:PUSH EAXPUSH DWORD PTRDIPOP ECXPOP DWORD PTRSIPUSH 0A123H,93,PUSHAD;把8个32位通用寄存器顺序压栈POPAD;从堆栈中弹出8个32b数据顺序存入通用寄存器,80386增加了8个32位通用寄存器的入、出栈指令,顺序同上。,80286微处理器增加了在一条指令中把8个通用寄存器压入、弹出堆栈的指令,压入的顺序是:AX、CX、DX、BX、SP、BP、SI、DI。
50、注意:这里的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,