汇编PPT2.ppt

上传人:hyn****60 文档编号:70973610 上传时间:2023-01-31 格式:PPT 页数:100 大小:818KB
返回 下载 相关 举报
汇编PPT2.ppt_第1页
第1页 / 共100页
汇编PPT2.ppt_第2页
第2页 / 共100页
点击查看更多>>
资源描述

《汇编PPT2.ppt》由会员分享,可在线阅读,更多相关《汇编PPT2.ppt(100页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计简明教程简明教程简明教程简明教程1第二章第二章 数据定义与传送数据定义与传送2.1 2.1 数据的定义数据的定义2.2 2.2 数据的传送数据的传送 2.3 2.3 汇编语言上机操作汇编语言上机操作 习题二习题二22.12.1 数据的定义数据的定义2.1.1 2.1.1 数据段数据段2.1.2 2.1.2 数据定义数据定义 3(1)变量(Varible)有有一一个个名名字字,运运行行过过程程中中值值可可能能发发生生变变化化,可可以以有有“初始值”。(2)常数(Constant)常数可以直接写在指令内,也可以存放在数据段内。常数可以

2、直接写在指令内,也可以存放在数据段内。(3)缓冲区(Buffer)从从输输入入设设备备输输入入若若干干数数据据时时,在在数数据据段段里里事事先先留留出出必必要要的存储单元,称为的存储单元,称为“输入缓冲区”。输输出出一一批批数数据据时时,把把输输出出内内容容事事先先存存放放在在若若干干内内存存单单元元中,称为中,称为“输出缓冲区”。汇编语言程序定义的汇编语言程序定义的“数据数据”:42.1.1 2.1.1 数据段数据段DATASEGMENT;在这里定义数据;在这里定义数据;DATAENDSDATA:程序员给这个段起的名字。程序员给这个段起的名字。SEGMENT:保留字,说明一个段从这里开始。保

3、留字,说明一个段从这里开始。ENDS:保留字,说明保留字,说明一个段到此结束。一个段到此结束。;分号后面的文字是分号后面的文字是“注释注释”,不参加汇,不参加汇编编伪指令:说明性的语句:说明性的语句语句”:由一行文字构成,由一行文字构成,是是一条指令,或者定义一条指令,或者定义一组数据,或者是一一组数据,或者是一条条“伪指令伪指令”。52.1.2 2.1.2 数据定义数据定义数据定义伪指令数据定义伪指令:变量名变量名数据定义伪操作数据定义伪操作数据数据1,数据,数据2数据定义伪操作:数据定义伪操作:DB(DefineByte):):每个数据占用一个字节(每个数据占用一个字节(8b)DW(Def

4、ineWord):):每个数据占用一个字(每个数据占用一个字(16b)DD(DefineDoubleWord):):每个数据占用一个双字每个数据占用一个双字(32b)DQ(DefineQuartWord):):每个数据占用每个数据占用8个字节个字节(64b)DT(DefineTenWord):):每个数据占用每个数据占用10个字节(个字节(80b)6DATA SEGMENTXdb-1,255,A,3+2,?db“ABC”,0FFH,11001010BYdb3dup(?)DATA ENDS数据定义举例(数据定义举例(1):有符号数用它的补码存储有符号数用它的补码存储字符用字符用ASCII代码存储

5、代码存储db定义的数据在定义的数据在-128255之内之内变量名代表这个单元的地址变量名代表这个单元的地址?表示一个尚未确定的值表示一个尚未确定的值DUP表示重复定义表示重复定义7DSEG SEGMENTZDW-2,-32768,65535,ABWDD12345678H,-400000DWZ,W-ZDSEG ENDS数据定义举例(数据定义举例(2):DW定义的数据在(定义的数据在(-32768,65535)内)内出现在数据部分的变量名代表这个变量的出现在数据部分的变量名代表这个变量的偏移地址偏移地址多字节数据的高位存放在较高地址单元中多字节数据的高位存放在较高地址单元中8变量变量X,Y,Z,W

6、的属性的属性变量名段属性SEG偏移地址OFFSET类 型TYPE长 度LENGTH大 小SIZEXDATA0000H111YDATA000AH133ZDSEG0000H212WDSEG0008H41492.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操作数表达式操作数表达式10汇汇编编语语言言程程序序由由若若干干“语语句句”组组成成,每每个个“语语句句”占占用用一一行。行。三种类型语句:三

7、种类型语句:指指令令语语句句:包包含含一一条条符符号号指指令令,与与一一条条机机器器指指令令相相对对应应,汇汇编编以以后后成成为为这这条条机机器器指指令令的的二二进进制制代代码码,这这个代码被称为个代码被称为“目标目标(Object)”;伪伪指指令令语语句句:一一条条说说明明性性的的语语句句。有有的的伪伪指指令令语语句句汇汇编编后后没没有有“结结果果”,有有的的伪伪指指令令汇汇编编后后产产生生“目目标标”。注注释释行行:书书写写说说明明性性文文字字,不不进进行行“汇汇编编”,也也不不产产生生“目标目标”。11标标号号:这这一一行行起起的的名名字字,后后面面跟跟上上冒冒号号,代代表表这这一一行行

8、的的地地址址。标标号号用用字字母母开开始始,不不要要使使用用保保留留字字作作为为标标号。号。操操作作码码是是这这条条指指令令需需要要完完成成的的操操作作,用用指指令令助助记记符符表表示。示。操操作作数数是是指指令令的的操操作作对对象象,指指令令的的操操作作数数可可以以03个。个。;注释;注释用来添加一些说明,例如说明本行指令的用来添加一些说明,例如说明本行指令的功能。功能。标号标号:操作码操作码操作数操作数;注释注释1 80X86指令格式指令格式12指令格式指令格式n操作码操作码说明计算机要执行哪种操作,如传送、运算、说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少

9、的组成部移位、跳转等操作,它是指令中不可缺少的组成部分分n操作数操作数是指令执行的参与者,即各种操作的对象是指令执行的参与者,即各种操作的对象n有些指令不需要操作数,通常的指令都有一个或两有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有个操作数,也有个别指令有3个甚至个甚至4个操作数个操作数操作码操作码操作数操作数指令由操作码和操作数两部分组成指令由操作码和操作数两部分组成13指令的操作码和操作数指令的操作码和操作数n每种指令的每种指令的操作码操作码:n用一个助记符表示(指令功能的英文缩写)用一个助记符表示(指令功能的英文缩写)n对应着机器指令的一个或多个二进制编码对应着机

10、器指令的一个或多个二进制编码n指令中的指令中的操作数操作数:n可以是一个具体的数值(立即数操作数)可以是一个具体的数值(立即数操作数)n可以是存放数据的寄存器(寄存器操作数)可以是存放数据的寄存器(寄存器操作数)n或指明数据在主存位置的存储器地址(存储器操或指明数据在主存位置的存储器地址(存储器操作数作数142操作数操作数(1)寄存器操作数)寄存器操作数(1)寄寄存存器器操操作作数数:包包括括段段寄寄存存器器,通通用用数数据据、地地址址寄寄存存器器。例如:例如:MOVBX,AX功能:功能:AX寄存器内容送入寄存器内容送入BX寄存器。寄存器。AX是是“源源操操作作数数”,写写在在右右边边,指指令

11、令执执行行后后,它它的的内容不会被改变。内容不会被改变。BX是是“目目的的操操作作数数”,写写在在左左边边,指指令令执执行行后后,它它的内容将被改变。的内容将被改变。注意注意:寄存器寄存器IP/EIP和和FLAGS/EFLAGS不能作为操作数出不能作为操作数出现在指令中现在指令中。15二二 进进 制制/十十 进进 制制/十十 六六 进进 制制 常常 数数,可可 求求 值值 的的 表表达式,字符,标号达式,字符,标号等都可以用作操作数。等都可以用作操作数。假设已经定义:假设已经定义:XDW150指令指令“MOVBX,X*2”是是错错误误的的,“变变量量”的的计计算算应应该该在在用用户程序执行时进

12、行户程序执行时进行,“汇编程序汇编程序”不能对不能对“变量变量”进行计算。进行计算。常数常数300送入送入BX寄存器寄存器MOV BX,300或者:或者:MOV BX,150*2DATA段的段基址送段的段基址送DSMOV AX,DATAMOV DS,AX注意注意:立即数不能用作立即数不能用作“目的操作数目的操作数”。(2)立即数操作数)立即数操作数16为为了了对对存存储储器器的的一一个个单单元元进进行行访访问问,需需要要给给出出这这个个单单元元的的段基址和偏移地址段基址和偏移地址。大大多多数数情情况况下下,指指令令使使用用DS寄寄存存器器的的内内容容作作为为操操作作数数的的段基址,指令中不需要

13、再指出段基址。段基址,指令中不需要再指出段基址。(3)存储器操作数存储器操作数指出偏移地址的方法有两种:指出偏移地址的方法有两种:直接的和间接的直接的和间接的。常常在程序开始处把数据段的段基址装入常常在程序开始处把数据段的段基址装入DS寄存器:寄存器:MOV AX,DATAMOV DS,AX17直接(偏移)地址直接(偏移)地址:在指令里直接写出存储单元的偏移地址在指令里直接写出存储单元的偏移地址。DATA SEGMENTADB 12,34,56ARRAYDW55,66,77,88,99DATA ENDS已把已把DATA代表的段基址装入代表的段基址装入DS把变量(数组)把变量(数组)A的前两个数

14、据送的前两个数据送BL,BH寄存器:寄存器:MOVBL,A;也可以写作也可以写作MOVBL,AMOVBH,A+1;或或MOVBH,A+1,MOVBH,A1A代表数据代表数据“12”的偏移地址,的偏移地址,A+1是数据是数据“34”的偏移地址。的偏移地址。错误错误!MOVBX,A;类型不匹配;类型不匹配18直接(偏移)地址直接(偏移)地址:在指令里直接写出存储单元的偏移地址。在指令里直接写出存储单元的偏移地址。DATA SEGMENTADB 12,34,56ARRAYDW55,66,77,88,99DATA ENDS已把已把DATA代表的段基址装入代表的段基址装入DS假设已经知道假设已经知道A的

15、偏移地址是的偏移地址是0000H,前面的指令可以写作:前面的指令可以写作:MOVBL,0000H;方括号不能省略方括号不能省略MOVBH,0001H;方括号不能省略方括号不能省略常数地址格式一般没有实用价值。常数地址格式一般没有实用价值。上面的两条指令可以用一条指令代替,效果相同:上面的两条指令可以用一条指令代替,效果相同:MOVBX,0000H;取地址取地址0000H开始的两字节开始的两字节,送入送入BL和和BH19MOVAL,2100H;正确,正确,8位传送指令,位传送指令,2100H是字节地址是字节地址MOVAX,2100H;正确,正确,16位传送指令,位传送指令,2100H是字地址是字

16、地址MOVEAX,2100H;正确,正确,32位传送指令,位传送指令,2100H是双字地址是双字地址假设已经定义:假设已经定义:XDW350指令指令MOVBX,X 是是16位传送指令,正确位传送指令,正确指令指令MOVBL,X 是错误的,操作数类型不匹配是错误的,操作数类型不匹配20间接(偏移)地址间接(偏移)地址:把把存存储储单单元元的的偏偏移移地地址址先先装装入入某某个个寄寄存存器器,通通过过这这个个寄寄存存器器来来找到这个存储单元,也称为找到这个存储单元,也称为“寄存器间接寻址寄存器间接寻址”。已经定义:已经定义:ADB12,34MOV SI,OFFSETA;把变量把变量A的偏移地址装入

17、的偏移地址装入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的值作为段基址。的值作为段基址。21已经定义:已经定义:ARRAY DW35,73,27,780,12,55

18、取出字数组取出字数组ARRAY的第的第3个元素送入个元素送入AX:;方法方法1MOVAX,ARRAY4;ARRAY代表数组首地址,位移量代表数组首地址,位移量=4,直接寻址,直接寻址;也可以写作;也可以写作“MOVAX,ARRAY+4”;方法方法2MOVBX,OFFSETARRAY;数组首地址装入数组首地址装入BXMOVAX,BX+4;第第3个元素距数组首元素个元素距数组首元素4个字节个字节;方法方法3MOVBX,4;第第3个元素距数组首地址的位移量装入个元素距数组首地址的位移量装入BXMOVAX,ARRAYBX;ARRAY代表数组首地址,代表数组首地址,BX中是位移量中是位移量22基址变址寻

19、址基址变址寻址:用两个寄存器联合起来寻址。从(用两个寄存器联合起来寻址。从(BX,BP)和(和(SI,DI)中中各选出一个使用。各选出一个使用。出现出现BP时使用时使用SS作为段基址寄存器,其它情况用作为段基址寄存器,其它情况用DS。MOVAX,ARRAY4;直接寻址,偏移地址直接寻址,偏移地址=ARRAY+4MOVAX,BX;寄存器间接寻址寄存器间接寻址MOVAX,BX+2;寄存器相对寻址寄存器相对寻址;BX中存放首地址,位移量中存放首地址,位移量2MOVAX,ARRAYBX;寄存器相对寻址寄存器相对寻址;ARRAY为首地址,为首地址,BX中存放位移量中存放位移量MOVAX,BX+SI;基址

20、(基址(BX)变址(变址(SI)寻址寻址MOVAX,BX+DI+2;相对基址变址寻址相对基址变址寻址232.2.2 2.2.2 程序段程序段已定义数据段为已定义数据段为“DATA”,程序段常见格式程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:START:MOV AX,DATAMOV DS,AX;其他指令其他指令MOV AX,4C00HINT21HCODEENDSENDENDSTARTSTART24“ASSUME”伪指令用来伪指令用来指定段和段寄存器之间的对应关系指定段和段寄存器之间的对应关系,供,供汇编程序使用。汇编程序使用。DATASEGMENT

21、ADB55DATAENDSDSEGSEGMENTXDB10DSEGENDSASSUMEDS:DATA,ES:DSEGMOVAX,DATAMOV DS,AXMOV AX,DSEGMOV ES,AX设变量设变量A和和X的偏移地址都是的偏移地址都是0000H。指令指令MOVAL,A汇编成汇编成MOVAL,DS:0000H,执行后执行后(AL)=55。指令指令MOVDL,X汇编成汇编成MOVDL,ES:0000H,执行后执行后(DL)=10。ASSUME语句语句25MOVSI,OFFSETA;A的偏移地址装入的偏移地址装入SIMOVDI,OFFSETX;X的偏移地址装入的偏移地址装入DIMOVAL,S

22、I;取;取A的值送的值送ALMOVDL,DI;取;取X的值送的值送DL执行的结果:执行的结果:(AL)=55正确,正确,(DL)=55 错误错误。为了得到正确结果,上面第为了得到正确结果,上面第4条指令改写为:条指令改写为:MOV DL,ES:DI;执行后执行后(DL)=10,结果正确结果正确这条指令这条指令“显式显式”地指定了段基址,汇编出来的机器指令比地指定了段基址,汇编出来的机器指令比MOVDL,DI多一个字节,称为多一个字节,称为“段跨越前缀段跨越前缀”。26“START”是第一条指令的是第一条指令的“标号标号”。ENDSTART它的地址称为这个程序的它的地址称为这个程序的“入口地址入

23、口地址”。指令指令“INT21H”表示调用由操作系统提供的表示调用由操作系统提供的21H号服务程序。号服务程序。AH中为中为“功能号功能号”,AH=4CH表示返回操作系统的操作。表示返回操作系统的操作。AL中的代码称为中的代码称为“返回代码返回代码”,00H表示表示“正常返回正常返回”。处理器选择伪指令处理器选择伪指令.386.386P.486.486P.586.586P.686.686P.386表示程序选用表示程序选用80386的基本指令集,的基本指令集,.386P表示选用表示选用80386的基本指令和保护模式下的特权指令。的基本指令和保护模式下的特权指令。缺省的处理器选择伪指令是缺省的处理

24、器选择伪指令是.8086272.2.32.2.3 基本传送指令基本传送指令1MOV(Move,传送)指令传送)指令把源操作数把源操作数(source)传送到目的操作数传送到目的操作数(destination)MOV dest,src设设(AX)=2345H,(BX)=1111H。指令指令“MOVAX,BX”执行后,执行后,(AX)=1111H(BX)=1111H28源操作数可以是:寄存器、存储器源操作数可以是:寄存器、存储器M、立即数、立即数I;目的操作数可以是:寄存器、存储器。目的操作数可以是:寄存器、存储器。29MOVMOV指令的使用限制指令的使用限制:源操作数与目的操作数可以是字节、字或

25、双字,但源操作数与目的操作数可以是字节、字或双字,但必须有必须有相同的类型相同的类型;源操作数与目的操作数不能同时为存储器操作数;源操作数与目的操作数不能同时为存储器操作数;目的操作数不能是立即数;目的操作数不能是立即数;FLAGS、IP不能用作操作数不能用作操作数。源操作数与目的操作数不能同时为段寄存器;源操作数与目的操作数不能同时为段寄存器;目的操作数是段寄存器时,源操作数只能是寄存器或存储目的操作数是段寄存器时,源操作数只能是寄存器或存储器,不能是立即数;器,不能是立即数;CS不能用作目的操作数不能用作目的操作数。30MOV CL,DH;字节传送指令,字节传送指令,DH寄存器内容送入寄存

26、器内容送入CLMOV AX,CS;字传送指令,字传送指令,CS寄存器内容送入寄存器内容送入AXMOV SS,CX;字传送指令,字传送指令,CX寄存器内容送入寄存器内容送入SSMOV AL,30H;字节传送指令,执行后(;字节传送指令,执行后(AL)=30HMOV AX,30H;字传送指令,执行后(;字传送指令,执行后(AX)=0030HMOV AL,-5;字节传送指令,执行后(;字节传送指令,执行后(AL)=0FBHMOV AX,-5;字传送指令,执行后(;字传送指令,执行后(AX)=0FFFBHMOVMOV指令举例指令举例31MOVMOV指令举例指令举例MOV BP,BL;字节传送指令,字节

27、传送指令,BL寄存器内容送寄存器内容送SS:BPMOV BX,AX;字传送指令,字传送指令,AL内容送内容送DS:BX,;AH内容送内容送DS:BX+1MOV DX,SI;字传送指令,字传送指令,DS:SI内容送入内容送入DL,;DS:SI+1内容送入内容送入DHMOV X_BYTE,-5;字节传送指令,字节传送指令,-5(0FBH)送送X_BYTEMOV Y_WORD,-5;字传送指令,;字传送指令,-5(0FFFBH)送送Y_WORD假设变量假设变量X_BYTE用用DB定义,变量定义,变量Y_WORD用用DW定义定义32错误:错误:MOV CL,DX;操作数类型不匹配;操作数类型不匹配MO

28、V CS,AX;CS寄存器不能作为目的操作数寄存器不能作为目的操作数MOV DS,CS;不能同时为段寄存器不能同时为段寄存器MOV 30H,AL;立即数不能用作目的操作数;立即数不能用作目的操作数MOV AL,300;源操作数超出范围源操作数超出范围MOV DX,BL;DX寄存器不能用来寄存器间接寻址寄存器不能用来寄存器间接寻址MOVX_BYTE,AX;操作数类型不匹配操作数类型不匹配MOV X_BYTE,300;目的操作数超出范围目的操作数超出范围MOV BX,30H;操作数类型不能确定操作数类型不能确定MOV X_BYTE,SI;不能同时为存储器操作数不能同时为存储器操作数MOV X_BY

29、TE,K_BYTE;不能同时为存储器操作数不能同时为存储器操作数MOV SS,DS;不能同时为段寄存器操作数不能同时为段寄存器操作数33MOV 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的第一字节的第一

30、字节;送;送AL寄存器寄存器MOV WORDPTRX_BYTE,20H;2B立即数立即数0020H送变量送变量;X_BYTE开始的开始的2字节字节“PTR”操作符操作符:强制类型转换:强制类型转换强行改变强行改变存储器操作数存储器操作数的类型的类型34LEAreg16,memreg16:16位的通用寄存器,位的通用寄存器,mem:一个存储器操作数。一个存储器操作数。把存储器操作数的偏移地址把存储器操作数的偏移地址-reg16。2 2LEA(Load Effective Address,LEA(Load Effective Address,装载有效地址装载有效地址)设设:变量变量X的偏移地址为的

31、偏移地址为1020H,(BP)=0020H执行指令后:执行指令后:LEADX,X LEABX,BP;执行后,(;执行后,(DX)=1020H;执行后执行后,(BX)=0020H35例例2-1编写程序,把编写程序,把4个元素的字节数组个元素的字节数组ARRAY清零。清零。DATASEGMENTARRAYDB4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV ARRAY,0;第一个元素清零第一个元素清零MOV ARRAY+1,0;第二个元素清零第二个元素清零MOV ARRAY+2,0;第三个元素清

32、零第三个元素清零MOV ARRAY+3,0;第四个元素清零第四个元素清零MOV AX,4C00HINT21HCODEENDSENDSTART36MOVAX,0LEABX,ARRAY;数组数组ARRAY首地址装入首地址装入BXMOVWORDPTRBX,AX;第一、第二个元素清零第一、第二个元素清零MOVWORDPTRBX+2,AX;第三、第四个元素清零第三、第四个元素清零一次将两个元素同时清零:一次将两个元素同时清零:MOVWORDPTRARRAY,0;第一、第二个元素清零第一、第二个元素清零MOVWORDPTRARRAY+2,0;第三、第四个元素清零第三、第四个元素清零使用立即数指令代码较长。

33、把这个立即数事先存放在寄存器中:使用立即数指令代码较长。把这个立即数事先存放在寄存器中:MOVAX,0MOVWORDPTRARRAY,AX;第一、第二个元素清零第一、第二个元素清零MOVWORDPTRARRAY+2,AX;第三、第四个元素清零第三、第四个元素清零把数组把数组ARRAY的首地址事先装入地址寄存器,程序更简捷:的首地址事先装入地址寄存器,程序更简捷:WORDPTR可省可省略略37Thinking编写程序,把编写程序,把100个元素的字节数组个元素的字节数组ARRAY清零。清零。DATASEGMENTARRAYDB100DUP(?)DATAENDSCODESEGMENTASSUMEC

34、S:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV ARRAY,0;第一个元素清零第一个元素清零MOV ARRAY+1,0;第二个元素清零第二个元素清零;第;第个元素清零个元素清零MOV ARRAY+99,0;第第100个元素清零个元素清零MOV AX,4C00HINT21HCODEENDSENDSTARTWhat if even more elements?38DATASEGMENTXDW55,112,37,82YDW4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,

35、AXMOVDI,4;第三个元素在数组内的位移第三个元素在数组内的位移MOVAX,XDI;取出取出X数组第三个元素数组第三个元素MOVYDI,AX;送入送入Y数组第三个元素中数组第三个元素中MOVAX,XDI+2;取出取出X数组第四个元素数组第四个元素MOVYDI+2,AX;送入送入Y数组第四个元素中数组第四个元素中MOVAX,4C00HINT 21HCODEENDSENDSTART例例2-2字数组字数组X的最后的最后2个元素值送入个元素值送入Y数组对应单元数组对应单元再一次强调:再一次强调:变量名就是变量首个元变量名就是变量首个元素的地址。素的地址。392.2.4 2.2.4 其他传送指令其他

36、传送指令例例指令指令LDSSI,BX从从DS:BX处连续取出处连续取出4个字节,两个个字节,两个低地址字节送入低地址字节送入SI,两个高地址字节送入两个高地址字节送入DS寄存器。指令执行寄存器。指令执行后后DS寄存器的内容被刷新。寄存器的内容被刷新。1.地址传送指令地址传送指令LDS,LESLDSREG16,MEM;从存储器取出从存储器取出4B,送入送入REG16和和DSLESREG16,MEM;从存储器取出从存储器取出4B,送入送入REG16和和ES40CBW;将;将AL寄存器内容符号扩展成寄存器内容符号扩展成16b,送入送入AXCWD;将;将AX寄存器内容符号扩展成寄存器内容符号扩展成32

37、b,送入送入DX(高位高位)和和AX2.2.符号扩展指令符号扩展指令CBW,CWDCBW,CWD设设:(AX)=8060H,(DX)=1234H执行下列指令后执行下列指令后CBW;(;(AX)=0060H执行下列指令后执行下列指令后CWD;(;(DX)=0FFFFH,(,(AX)=8060H413.3.交换指令交换指令XCHGXCHGXCHGREG/MEM,REG/MEM交换源、目的操作数的内容,两个操作数有相同的类型,不能同交换源、目的操作数的内容,两个操作数有相同的类型,不能同时为存储器操作数。时为存储器操作数。例如,(例如,(AX)=5678H执行下面指令后执行下面指令后XCHGAH,A

38、L;(;(AX)=7856H424.4.换码指令换码指令XLATXLATXLATMEM16以以MEM16对应段寄存器为段基址,以对应段寄存器为段基址,以BX为偏移地址查表为偏移地址查表XLAT;ALDS:BX+AL用用AL寄存器的内容查表,结果存回寄存器的内容查表,结果存回AL寄存器。表格的首地址寄存器。表格的首地址事先存放在事先存放在DS:BX中。中。43设(设(AL)=00001011B,下面程序执行后,下面程序执行后,AL中的二进制数中的二进制数改变为对应的十六进制数字符的改变为对应的十六进制数字符的ASCII代码代码01000010(B)。)。TABLEDB“0123456789ABC

39、DEF”MOV BX,SEGTABLE;取;取TABLE所在的段基址送所在的段基址送BXMOV DS,BX;从;从BX转送入转送入DSLEABX,TABLE;取;取TABLE的偏移地址的偏移地址XLAT;查表,;查表,(AL)=01000010B(B)即由即由即由即由“索引值索引值索引值索引值”找到了对应的编找到了对应的编找到了对应的编找到了对应的编码,所以也叫码,所以也叫码,所以也叫码,所以也叫“查表指令查表指令查表指令查表指令”442.2.5 2.2.5 堆栈堆栈堆栈(堆栈(STACK)是用户使用的存储器的一部分,用来存放临时是用户使用的存储器的一部分,用来存放临时性的数据和其他信息,例如

40、函数使用的局部变量、调用子程序性的数据和其他信息,例如函数使用的局部变量、调用子程序的入口参数、返回地址等。的入口参数、返回地址等。堆栈的段基址必须放在堆栈的段基址必须放在SS中。中。堆栈段的堆栈段的“栈顶栈顶”地址(偏移地址)地址(偏移地址)放在放在SP寄存器中。寄存器中。45在在SEGMENT伪指令中增加伪指令中增加“STACK”表示该段是表示该段是“堆栈堆栈”。这个程序装入时,操作系统把这个程序装入时,操作系统把SSEG的段基址置入的段基址置入SS,堆栈段堆栈段的字节数(本例中为的字节数(本例中为200=0C8H)置入置入SP。1.堆栈段结构堆栈段结构SSEGSEGMENTSTACK;堆

41、栈段开始堆栈段开始DW 100DUP(?);大小为大小为100个字个字SSEGENDS;堆栈段结束堆栈段结束堆栈段的定义:堆栈段的定义:46从较大地址开始分配和使用(数据段、代码段从较小地址开从较大地址开始分配和使用(数据段、代码段从较小地址开始分配和使用);始分配和使用);由由SP中地址指出的存储单元称为中地址指出的存储单元称为“栈顶栈顶”,数据总是在,数据总是在“栈栈顶顶”位置存入(称为位置存入(称为“压入压入”)、取出(称为)、取出(称为“弹出弹出”);最先进入的数据最后被弹出(最先进入的数据最后被弹出(FirstInLastOut,FILO),),最后进入的数据最先被弹出(最后进入的数

42、据最先被弹出(LastInFirstOut,LIFO)堆栈段的特点堆栈段的特点:47压入压入2B数据的操作数据的操作SP(SP)2SS:SP数据数据弹出弹出2B数据的操作数据的操作目的操作数目的操作数SS:SPSP(SP)+2SP(0CH)SS(a)堆栈的初始状态SP(0AH)SS(b)压入一个数据之后22H11HSP(08H)SS(c)压入二个数据之后44H33H22H11HSP(0AH)SS(d)弹出一个数据之后44H33H22H11H低地址低地址高地址高地址48ES,DS指向指向PSP;SS指向用户程序区;指向用户程序区;CS指向用户代码段指向用户代码段(由(由END伪指令指明);伪指令

43、指明);(SP)=0000H,指向指向64KB存储器尾部。存储器尾部。如果未定义堆栈段,如果未定义堆栈段,用户程序装入内存时用户程序装入内存时:492.8086CPU堆栈指令堆栈指令指令的操作数是指令的操作数是16b的寄存器、存储器、段寄存器(的寄存器、存储器、段寄存器(POP指指令中令中CS除外)。除外)。PUSH(压栈)压栈)指令:指令:POP(出栈)出栈)指令:指令:PUSHCSPOPDSPUSHREG16/MEM16/SEGPOPREG16/MEM16/SEG例如:把例如:把CS寄存器内容存入寄存器内容存入DS:50PUSHFPOPAX;AXFlagsORAX,0010H;将;将b8(

44、TF位)置位)置1PUSH AXPOPF;FlagsAXPUSHF指令把指令把FLAGS寄存器内容压入堆栈。寄存器内容压入堆栈。PUSHFPOPF指令从堆栈弹出指令从堆栈弹出16b送入送入FLAGS寄存器,指令执行后,寄存器,指令执行后,各标志位被刷新。各标志位被刷新。POPF下面程序段把下面程序段把TF标志位置位(置标志位置位(置1):):标志寄存器进出栈标志寄存器进出栈PUSHF和和POPF51LAHF指令把指令把FLAGS寄存器的低寄存器的低8位送入位送入AH寄存器寄存器LAHFSAHF指令把指令把AH寄存器内容送入寄存器内容送入FLAGS寄存器的低寄存器的低8位,它位,它的执行刷新了的

45、执行刷新了SF,ZF,AF,PF,CF标志位。标志位。SAHFLAHF和和SAHF522.2.62.2.6 操作数表达式操作数表达式指令中的操作数,包括立即数和存储器操作数都可以用一个指令中的操作数,包括立即数和存储器操作数都可以用一个表达式来代替,这个表达式在汇编成目标的时候进行计算,表达式来代替,这个表达式在汇编成目标的时候进行计算,它的结果用来产生它的结果用来产生目标代码(即机器指令)目标代码(即机器指令)。设变量设变量X的偏移地址为的偏移地址为1020HMOV AL,X+5MOV AL,1025H53汇编时,对汇编时,对EQU定义的符号名用对应的表达式进行定义的符号名用对应的表达式进行

46、“替换替换”。例如,有以下定义:例如,有以下定义:1符号定义伪指令符号定义伪指令符号名符号名EQU表达式表达式NUMEQU215MOD15ERR_MSGEQU“DataOverride”这些符号名使用的例子:这些符号名使用的例子:MESSAGEDBERR_MSG;等价于等价于MESSAGEDB“DataOverride”MOV CX,NUM+1;等价于等价于MOVCX,215MOD15+154TIMES=0TIMES=TIMES+1功能类似于功能类似于EQU伪指令,不过:伪指令,不过:使用使用“=”定义符号名时,只能使用常数表达式,而定义符号名时,只能使用常数表达式,而且对一个符号名可以多次定

47、义。一个新的定义出现后,且对一个符号名可以多次定义。一个新的定义出现后,原来的定义自动终止。原来的定义自动终止。用用EQU定义的符号名不允许重复定义。定义的符号名不允许重复定义。“=”伪指令伪指令56“”称为称为“索引运算符索引运算符”,用来括起组成有效地址的一,用来括起组成有效地址的一个分量,各分量相加,得到最后的有效地址。个分量,各分量相加,得到最后的有效地址。2.地址表达式地址表达式+,运算符,运算符对构成有效地址的各个分量进行对构成有效地址的各个分量进行“加加”、“减减”操操作。设变量作。设变量X的偏移地址为的偏移地址为1020H,指令指令“MOVBL,X10H”产生产生EA=1010

48、H。MOV AX,2BXDIMOV AX,BX+DI+2573立即数表达式立即数表达式立即数表达式在汇编源程序时进行计算,立即数表达式在汇编源程序时进行计算,表达式中的运算对象在表达式中的运算对象在汇编时汇编时必须是必须是“已已知知”的,否则无法进行计算。的,否则无法进行计算。用于产生立即数操作数的表达式有用于产生立即数操作数的表达式有4 4类运算符:类运算符:l算术运算符算术运算符(+,-,*,/,mod)l逻辑运算符逻辑运算符(shl,shr,and,or,xor,not)l关系运算符关系运算符(gt,ge,eq,le,lt,ne)l地址运算符地址运算符(seg,offset)l类型运算符

49、类型运算符(type,length,size)58 (1 1)算术运算符算术运算符+(相加相加),(相减相减),*(相乘相乘),/(整除运算整除运算),MOD(取取余数余数)(*,/)(MOD)(+,)运算优先级从高到低依次为运算优先级从高到低依次为尽量使用圆括号明确运算顺序尽量使用圆括号明确运算顺序MOV BX,32+13/6MOD332+(13/6)MOD3)MOVBX,0022H34=22HRecommended59(2 2)逻辑运算符逻辑运算符(SHL、SHR)(NOT)(AND)(OR、XOR)MOVAL,30SHR1MOVAL,15运算优先级从高到低依次为运算优先级从高到低依次为S

50、HR(右移)、右移)、SHL(左移)、左移)、AND(逻辑与)逻辑与)OR(逻辑加)逻辑加)XOR(异或,半加)、异或,半加)、NOT(逻辑非、取反)逻辑非、取反)尽量使用圆括号明确运算顺序尽量使用圆括号明确运算顺序60 (3 3)关系运算符关系运算符GT(大于)、大于)、GE(大于或等于)、大于或等于)、LT(小于)、小于)、LE(小于等于)、小于等于)、EQ(等于)、等于)、NE(不等于)不等于)关系运算符用于两个数的比较,结果为关系运算符用于两个数的比较,结果为“真(真(-1)”或或“假假(0)”MOVAX,6000HGE5000HMOVAX,0FFFFHMOVAX,3GE2MOVAX,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁