数据定义与传送.ppt
《数据定义与传送.ppt》由会员分享,可在线阅读,更多相关《数据定义与传送.ppt(91页珍藏版)》请在三一办公上搜索。
1、新 编汇编语言程序设计,第二章 数据定义与传送,2.1 数据的定义2.2 数据的传送 2.3 汇编语言上机操作 习题二,2.1 数据的定义,2.1.1 数据段2.1.2 数据定义,汇编语言程序定义的“数据”:(1)变量(Varible)有一个名字,运行过程中值可能发生变化,可以有“初始值”。(2)常数(Constant)常数可以直接写在指令内,也可以存放在数据段内。(3)缓冲区(Buffer)从输入设备输入若干数据时,在数据段里事先留出必要 的存储单元,称为“输入缓冲区”。输出一批数据时,把输出内容事先存放在若干内存单元 中,称为“输出缓冲区”。,2.1.1 数据段,DATASEGMENT;在
2、这里定义数据;DATAENDS,DATA:程序员给这个段起的名字。SEGMENT:保留字,说明一个段从这里开始。ENDS:保留字,说明一个段到此结束。;分号后面的文字是“注释”,不参加汇编,伪指令:说明性的语句语句:由一行文字构成,是 一条指令,或者定义 一组数据,或者是一 条“伪指令”。,2.1.2 数据定义,数据定义伪指令:变量名 数据定义伪操作 数据,数据,数据定义伪操作:DB(Define Byte):每个数据占用一个字节(8b)DW(Define Word):每个数据占用一个字(16b)DD(Define Double Word):每个数据占用一个双字(32b)DQ(Define Q
3、uartWord):每个数据占用8个字节(64b)DT(Define Ten Word):每个数据占用10个字节(80b),DATASEGMENTXdb-1,255,A,3+2,?db“ABC”,0FFH,11001010BYdb3 dup(?)DATAENDS,数据定义举例(1):,有符号数用它的补码存储字符用ASCII代码存储db定义的数据在-128255 之内变量名代表这个单元的地址?表示一个尚未确定的值DUP表示重复定义,DSEGSEGMENTZDW-2,-32768,65535,ABWDw 12345678H,-400000DW Z,W-ZDSEGENDS,数据定义举例(2):,DW
4、定义的数据在(-32768,65535)内出现在数据部分的变量名代表这个变量的偏移地址多字节数据的高位存放在较高地址单元中,变量X,Y,Z,W的属性,2.2 数据的传送,2.2.1 指令格式2.2.2 程序段2.2.3基本传送指令2.2.4 其他传送指令2.2.5 堆栈2.2.6操作数表达式,汇编语言程序由若干“语句”组成,每个“语句”占用一行。三种类型语句:指令语句:包含一条符号指令,与一条机器指令相对应,汇编以后成为这条机器指令的二进制代码,这 个代码被称为“目标(Object)”;伪指令语句:一条说明性的语句。有的伪指令语句汇编后 没有“结果”,有的伪指令汇编后产生“目标”。注释行:书写
5、说明性文字,不进行“汇编”,也不产生“目标”。,1 80X86指令格式,标号:程序员给这一行起的名字,后面跟上冒号,代表这一行的地址。标号用字母开始,不要使用保留字作为标号。操作码是这条指令需要完成的操作,用指令助记符表示。操作数 是指令的操作对象,指令的操作数可以03个。两个操作数时,右面的操作数称为“源操作数”,左面的操作数称为“目的操作数”。“源操作数”参与指令操作,不保存结果,内容不会改变。“目的操作数”参与指令操作,还保存指令的操作结果,指令执行后,目的操作数的内容被改变。;注释 用来添加一些说明,例如说明本行指令的功能。,标号:操作码 操作数;注释,2 操作数,寄存器操作数:包括段
6、寄存器,通用数据、地址寄存器。,例如:MOVBX,AX功能:AX寄存器内容送入BX寄存器。AX是“源操作数”,写在右边,指令执行后,它的内容不会被改变。BX是“目的操作数”,写在左边,指令执行后,它的内容将被改变。,注意:寄存器IP/EIP和FLAGS/EFLAGS不能作为操作数出 现在指令中。,立即数操作数:二进制/十进制/十六进制常数,可求值的表 达式,字符,标号等都可以用作操作数。,假设已经定义:XDW150指令“MOVBX,X*2”是错误的,“变量”的计算应该在用户程序执行时进行,“汇编程序”不能对“变量”进行计算。,常数300送入BX寄存器MOVBX,300或者:MOVBX,150*
7、2,DATA段的段基址送DSMOVAX,DATAMOVDS,AX,注意:立即数不能用作“目的操作数”。,为了对存储器的一个单元进行访问,需要给出这个单元的段基址和偏移地址。大多数情况下,指令使用DS寄存器的内容作为操作数的段基址,指令中不需要再指出段基址。,3 存储器操作数,指出偏移地址的方法有两种:直接的和间接的。,常常在程序开始处把数据段的段基址装入DS寄存器:MOVAX,DATAMOVDS,AX,直接(偏移)地址:在指令里直接写出存储单元的偏移地址。,DATA SEGMENTA DB 12,34,56ARRAY DW 55,66,77,88,99DATA ENDS已把DATA代表的段基址
8、装入DS,把变量(数组)A的前两个数据送BL,BH寄存器:MOV BL,A;也可以写作 MOV BL,A MOV BH,A+1;或MOV BH,A+1,MOV BH,A 1A代表数据“12”的偏移地址,A+1是数据“34”的偏移地址。,错误!MOV BX,A;把变量A送BL,变量A+1送BH,直接(偏移)地址:在指令里直接写出存储单元的偏移地址。,DATA SEGMENTA DB 12,34,56ARRAY DW 55,66,77,88,99DATA ENDS已把DATA代表的段基址装入DS,假设已经知道A的偏移地址是0000H,前面的指令可以写作:MOV BL,0000H;方括号不能省略 M
9、OV BH,0001H;方括号不能省略常数地址格式一般没有实用价值。上面的两条指令可以用一条指令代替,效果相同:MOV BX,0000H;取地址0000H开始的两字节,送入BL和BH,MOV AL,2100H;正确,8位传送指令,2100H是字节地址MOV AX,2100H;正确,16位传送指令,2100H是字地址MOV EAX,2100H;正确,32位传送指令,2100H是双字地址,假设已经定义:XDW350 指令 MOV BX,X 是16位传送指令,正确 指令 MOV BL,X 是错误的,操作数类型不匹配,间接(偏移)地址:把存储单元的偏移地址先装入某个寄存器,通过这个寄存器来找到这个存储
10、单元,也称为“寄存器间接寻址”。,已经定义:A DB 12,34MOVSI,OFFSET A;把变量A的偏移地址装入SI;OFFSET是保留字,表示取出后面变量的偏移地址MOVBL,SI;变量A的第一个值送BLMOVBH,SI+1;第二个值送BH,MOV BH,1SI,16位80X86微处理器只有BX,BP,SI,DI这4个寄存器可以用来“间接寻址”。不另加说明的话,使用BP时自动用SS的值作为段基址,使用BX,SI,DI时自动用DS的值作为段基址。,已经定义:ARRAY DW 35,73,27,780,12,55 取出字数组ARRAY的第3个元素送入AX:;方法1MOV AX,ARRAY 4
11、;ARRAY代表数组首地址,位移量=4,直接寻址;也可以写作“MOV AX,ARRAY+4”;方法2MOV BX,OFFSET ARRAY;数组首地址装入BXMOV AX,BX+4;第3个元素距数组首元素4个字节;方法3MOV BX,4;第3个元素距数组首地址的位移量装入BXMOV AX,ARRAY BX;ARRAY代表数组首地址,BX中是位移量,基址变址寻址:用两个寄存器联合起来寻址。从(BX,BP)和(SI,DI)中 各选出一个使用。出现BP时使用SS作为段基址寄存器,其它情况用DS。,MOV AX,ARRAY4;直接寻址,偏移地址=ARRAY+4MOV AX,BX;寄存器间接寻址MOV
12、AX,BX+2;寄存器相对寻址;BX中存放首地址,位移量2MOV AX,ARRAY BX;寄存器相对寻址;ARRAY为首地址,BX中存放位移量MOV AX,BX+SI;基址(BX)变址(SI)寻址MOV AX,BX+DI+2;相对基址变址寻址,32位80 x86微处理器的存储器寻址:,基址+比例因子变址+位移量,MOV AX,ARRAY4;直接寻址,有效地址=ARRAY+4MOV AX,ECX;可以用任何一个通用寄存器间接寻址MOV AX,EAX+4;寄存器相对寻址MOV AX,EBX+ECX;基址(EBX)变址(ECX)寻址MOV AX,EBP+EDX+4;相对基址(EBP)变址(EDX)寻
13、址,使用SSMOV AX,EBX+4*ESI;变址寄存器可以乘上比例因子1,2,4,8MOV AX,8*EBP+ECX+6;相对基址(ECX)变址(EBP)寻址,使用DS,在“实地址模式”下,偏移地址用16位二进制表示,用于寻址的32位寄存器的高16位必须为0。所有的32位通用寄存器都可以用来间接寻址,一旦使用EBP作为“基址寄存器”,表示使用SS作为段基址寄存器。,MOV AX,EBXEBP;基址(EBX)变址(EBP)寻址,使用DSMOV AX,EBPEBX;基址(EBP)变址(EBX)寻址,使用SS,MOV AX,EBXEBP*1;基址(EBX)变址(EBP)寻址,使用DSMOV AX,
14、1*EBPEBX;基址(EBP)变址(EBX)寻址,使用SS第二条指令等同于:MOVAX,EBPEBX。,使用比例因子的寄存器一般作为变址寄存器,比例因子为1时:,2.2.2 程序段,已定义数据段为“DATA”,程序段常见格式:CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;其他指令MOVAX,4C00HINT21HCODEENDSENDSTART,“ASSUME”伪指令用来指定段和段寄存器之间的对应关系,供汇编程序使用。,DATASEGMENTADB55DATAENDSDSEGSEGMENTXDB10DSEGENDS,ASSU
15、ME DS:DATA,ES:DSEGMOV AX,DATAMOVDS,AXMOVAX,DSEGMOVES,AX设变量A和X的偏移地址都是0000H。,指令 MOV AL,A 自动按照 MOV AL,DS:0000H 的格式 汇编,执行后(AL)=55。指令 MOV DL,X 自动按照 MOV DL,ES:0000H 的格式 汇编,执行后(DL)=10。,MOV SI,OFFSET A;A的偏移地址装入SIMOV DI,OFFSET X;X的偏移地址装入DIMOV AL,SI;取A的值送ALMOV DL,DI;取X的值送DL执行的结果:(AL)=55 正确,(DL)=55 错误。,为了得到正确结
16、果,上面第4条指令改写为:MOVDL,ES:DI;执行后(DL)=10,结果正确,这条指令“显式”地指定了段基址,汇编出来的机器指令比MOV DL,DI多一个字节,称为“段跨越前缀”。,“START”是第一条指令的“标号”。标号出现在指令行前面,标号与指令之间用冒号“:”分开。本程序的执行从标有“START”的第一条指令开始,它的地址称为这个程序的“入口地址”。,指令“INT 21H”表示调用由操作系统提供的21H号服务程序。AH中为“功能号”,AH=4CH表示返回操作系统的操作。AL中的代码称为“返回代码”,00H表示“正常返回”。,处理器选择伪指令.386.386P.486.486P.58
17、6.586P.686.686P.386表示程序选用80386的基本指令集,.386P表示选用80386的基本指令和保护模式下的特权指令。缺省的处理器选择伪指令是.8086,2.2.3 基本传送指令,MOV指令的一般格式:,1MOV(Move,传送)指令,MOV指令把源操作数(source)传送到目的操作数(destination),MOVdest,src,设指令执行前,(AX)=2345H,(BX)=1111H。指令“MOV AX,BX”执行后,(AX)=1111H,(BX)=1111H。源操作数BX的内容被复制到AX寄存器内,源操作数BX的内容保持不变,目的操作数AX的原内容被覆盖。,源操作
18、数可以是:寄存器、存储器、立即数;目的操作数可以是:寄存器、存储器。,MOV指令的使用限制:源操作数与目的操作数可以是字节、字或双字,但必须有 相同的类型;源操作数与目的操作数不能同时为存储器操作数;目的操作数不能是立即数;FLAGS、EFLAGS、IP、EIP不能用作操作数。对于段寄存器作为操作数的MOV指令:源操作数与目的操作数不能同时为段寄存器;目的操作数是段寄存器时,源操作数只能是寄存器或存储 器,不能是立即数;CS不能用作目的操作数。,MOVCL,DH;字节传送指令,DH寄存器内容送入CLMOVECX,EDX;双字传送指令,EDX寄存器内容送入ECXMOVAX,CS;字传送指令,CS
19、寄存器内容送入AXMOVSS,CX;字传送指令,CX寄存器内容送入SS,MOV指令举例(寄存器、寄存器操作数):,正确:,错误:,MOVCL,DX;操作数类型不匹配MOVESI,BH;操作数类型不匹配MOVCS,AX;CS寄存器不能作为目的操作数MOVDS,CS;不能同时为段寄存器,MOVAL,30H;字节传送指令,执行后(AL)=30HMOVAX,30H;字传送指令,执行后(AX)=0030HMOVEAX,30H;双字传送指令,执行后(EAX)=0000 0030HMOVAL,-5;字节传送指令,执行后(AL)=0FBHMOVAX,-5;字传送指令,执行后(AX)=0FFFBH,MOV指令举
20、例(立即数、寄存器操作数):,正确:,错误:,MOV 30H,AL;立即数不能用作目的操作数MOV AL,300;源操作数超出范围,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,BL;DX寄存器不能用来寄存器间接寻址MOV X_BYTE,AX;操作数类型不匹配,MOV指令举例(存储器、立即数操作
21、数):,正确:,错误:,MOVX_BYTE,-5;字节传送指令,-5(0FBH)送X_BYTEMOVY_WORD,-5;字传送指令,-5(0FFFBH)送Y_WORD,假设变量X_BYTE用DB定义,变量Y_WORD用DW定义,MOVX_BYTE,300;目的操作数超出范围MOVBX,30H;操作数类型不能确定,错误:,MOVX_BYTE,SI;不能同时为存储器操作数MOVX_BYTE,K_BYTE;不能同时为存储器操作数MOVSS,DS;不能同时为段寄存器操作数,两个操作数不能同时为存储器操作数或段寄存器!,MOVBYTE PTRBX,20H;1B立即数20H送DS:BXMOVWORD PT
22、RBX,20H;立即数20H送DS:BX,;00H送DS:BX+1MOVDWORD PTRBX,20H;4B立即数00 00 00 20H送;DS:BX开始4个字节MOVBYTE PTRY_WORD,20H;立即数20H送变量;Y_WORD的第一字节MOVAL,BYTE PTRY_WORD;变量Y_WORD的第一字节;送AL寄存器MOVWORD PTRX_BYTE,20H;2B立即数00 20H送变量;X_BYTE开始的2字节,可以用“类型 PTR”指定,或强行改变操作数的类型:,LEA把源操作数的偏移地址装入目的操作数。它的一般格式:LEA REG16,MEMREG16表示一个16b通用寄存
23、器,MEM是一个存储器操作数。上面指令把存储器操作数的偏移地址存入指定的16位寄存器。,2LEA(Load Effective Address,装载有效地址)指令,假设变量X的偏移地址为1020H,(SI)=4455H,(EAX)=1020H,(EBP)=20HLEA DX,X;执行后,(DX)=1020HLEA BX,4EBP*2EAX;执行后,(BX)=4+20H2+1020H=1064H,例2-1 编写程序,把4个元素的字节数组ARRAY清零。DATASEGMENTARRAYDB4 DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:M
24、OVAX,DATAMOVDS,AXMOVARRAY,0;第一个元素清零MOVARRAY+1,0;第二个元素清零MOVARRAY+2,0;第三个元素清零MOVARRAY+3,0;第四个元素清零MOVAX,4C00HINT21HCODEENDSENDSTART,MOV AX,0LEA BX,ARRAY;数组ARRAY首地址装入BXMOV WORD PTR BX,AX;第一、第二个元素清零MOV WORD PTR BX+2,AX;第三、第四个元素清零,一次将两个元素同时清零:,MOV WORD PTR ARRAY,0;第一、第二个元素清零MOV WORD PTR ARRAY+2,0;第三、第四个元素
25、清零,使用立即数指令代码较长。把这个立即数事先存放在寄存器中:,MOV AX,0MOV WORD PTR ARRAY,AX;第一、第二个元素清零MOV WORD PTR ARRAY+2,AX;第三、第四个元素清零,把数组ARRAY的首地址事先装入地址寄存器,程序更简捷:,例2-2 字数组X的最后2个元素值送入Y数组对应单元DATASEGMENTXDW 55,112,37,82YDW 4 DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,AXMOVDI,4;第三个元素在数组内的位移MOVAX,XDI;取出X数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 定义 传送
链接地址:https://www.31ppt.com/p-6364926.html