《Intel处理器指令系统及汇编语言.ppt》由会员分享,可在线阅读,更多相关《Intel处理器指令系统及汇编语言.ppt(39页珍藏版)》请在三一办公上搜索。
1、1,数据定义语句,早期版本:DB、DW、DD、DQ、DT,2,语句格式名称 数据定义伪指令 初始值,初始值例:.datavalue1 BYTE 10hvalue2 BYTE?list1 BYTE 10,20,30,40 BYTE 50,60,70,80list2 BYTE 32,41h,00100010b,agreeting BYTE Good afternoon,0dh,0ah,0array WORD 5 DUP(?);5个未初始化的值value3 DWORD 12345678h,3,符号常量,不占用任何实际的存储空间。等号例:COUNT=500ESC_key=27array byte CO
2、UNT DUP(0)mov cx,COUNTmov al,ESC_keyEQU如 maxintequ 0ffh,4,计算数组和字符串的大小例:list1 BYTE 10,20,30,40 List1Size=($-list1)myString BYTE This is a long string,BYTE Containing any number BYTE of characters,0dh,0ah MyString_len=($-myString)list2 WORD 1000h,2000h,3000h,4000h List2Size=($-list2)/2,微机原理及接口技术第3章 In
3、tel处理器指令系统及汇编语言,三、数据传送、寻址和算数运算,6,本节要点,数据传送指令加法和减法和数据传送相关的操作符和伪指令间接寻址JMP和LOOP指令,7,立即操作数(immediate)imm:8、16或32位立即数imm8:8位立即数(字节)imm16:16位立即数(字)imm32:32位立即数(双字)寄存器操作数(register)reg:任意的通用寄存器sreg:16位段寄存器CS、DS、SS、ES、FS、GSr8:AH、AL、BH、BL、CH、CL、DH、DLr16:AX、BX、CX、DX、SI、DI、SP、BPr32:EAX、EBX、ECX、EDX、ESI、EDI、ESP、E
4、BP内存操作数(memory)mem:8、16或32位内存操作数,(一)数据传送指令 1.操作数类型,8,其它形式r/m8:8位操作数(8位通用寄存器或内存字节)r/m16:16位操作数(16位通用寄存器或内存字)r/m32:32位操作数(32位通用寄存器或内存双字),(一)数据传送指令 1.操作数类型,9,.datavar1 BYTE 55hvar2 BYTE 10hvar3 BYTE 0aah.codemov ax,datamov ds,axmov al,1040h;假设var1位于偏移1040h处mov al,var1;使用var1的符号名mov al,var1;上一条语句的另一种写法m
5、ov al,var1+2;直接偏移操作数,(一)数据传送指令 2.直接内存操作数,编译器会自动将名称转换为数字偏移,然后根据该偏移来寻址。,10,mov destination,source回忆:C+或Java中的赋值语句dest=source;MOV指令需要遵循的规则:两个操作数的尺寸必须一致。两个操作数不能同时为内存操作数。目的操作数不能是CS,EIP和IP。立即数不能直接送至段寄存器。,(一)数据传送指令 3.MOV指令,11,MOV指令的具体格式:mov reg,regmov mem,regmov reg,memmov mem,immmov reg,imm段寄存器仅用于实地址模式下运行
6、的程序。mov r/m16,sregmov sreg,r/m16内存之间的移动通过寄存器暂存。,(一)数据传送指令 3.MOV指令,.datavar1 WORD?var2 WORD?.codemov ax,var1mov var2,ax,12,含义:move with zero-extend格式:movzx r32,r/m8movzx r32,r/m16movzx r16,r/m8,(一)数据传送指令 4.整数的零/符号扩展 1)MOVZX指令,13,例:,(一)数据传送指令 4.整数的零/符号扩展 1)MOVZX指令,mov bx,0A69Bhmovzx eax,bxmovzx edx,bl
7、movzx cx,bl,.databyte1 BYTE 9Bhword1 WORD 0A69Bh.code movzx eax,word1 movzx edx,byte1 movzx cx,byte1,14,含义:move with sign-extend格式:movsx r32,r/m8movsx r32,r/m16movsx r16,r/m8,(一)数据传送指令 4.整数的零/符号扩展 2)MOVSX指令,mov bx,0A69Bhmovsx eax,bxmovsx edx,blmovsx cx,bl,eax=FFFFA69Bhedx=FFFFFF9Bhcx=FF9Bh,例:,15,含义:
8、exchange data,交换两个操作数的内容。格式:xchg reg,regxchg reg,memxchg mem,reg交换两个内存操作数:利用寄存器,MOV与XCHG结合使用。mov ax,val1xchg ax,val2mov val1,ax,(一)数据传送指令 5.XCHG指令,16,(一)数据传送指令 6.直接偏移操作数,.dataarrayB BYTE 10h,20h,30h,40h,50h.codemov al,arrayB;AL=mov al,arrayB+1;AL=mov al,arrayB+2;AL=mov al,arrayB+20;AL=?,注意:MASM并不要求一
9、定要使用方括号。mov al,arrayB+1 等同于 mov al,arrayB+1MASM对有效地址没有内建的范围检查模块。,10h,20h,30h,17,(一)数据传送指令 6.直接偏移操作数,.dataarrayW WORD 100h,200h,300h.codemov ax,arrayW;AX=100hmov ax,arrayW+2;AX=200h,应用:数组元素的寻址,.dataarrayD DWORD 10000h,20000h.codemov eax,arrayD;EAX=10000hmov eax,arrayD+4;EAX=20000h,18,含义:increment、加1和
10、decrement、减1。格式:inc reg/memdec reg/mem,(二)加法和减法 1.INC和DEC指令,.datamyWord WORD 1000h.codeinc myWord;1001hmov bx,myWorddec bx;1000h,19,将同尺寸的源操作数和目的操作数相加,结果在目的操作数中(不改变源操作数)。格式:add 目的操作数,源操作数,(二)加法和减法 2.ADD指令,.datavar1 DWORD 10000hvar2 DWORD 20000h.codemov eax,var1add eax,var2;30000h,影响的标志位:CF、ZF、SF、OF、A
11、F、PF,20,将源操作数从目的操作数中减掉,结果在目的操作数中(不改变源操作数)。格式:sub 目的操作数,源操作数,(二)加法和减法 3.SUB指令,.datavar1 DWORD 30000hvar2 DWORD 10000h.codemov eax,var1sub eax,var2;20000h,影响的标志位:CF、ZF、SF、OF、AF、PF,21,NEG reg/mem;reg/mem0reg/mem求补,将操作数按位取反、末位加1。影响的标志位:CF、ZF、SF、OF、AF、PFmov ax,0ff64h neg al;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,C
12、F=1,(二)加法和减法 4.NEG指令,22,Rval=-Xval+(Yval Zval),(二)加法和减法 5.例子:实现算数表达式,.dataRval SDWORD?Xval SDWORD 26Yval SDWORD 30Zval SDWORD 40.codemov eax,Xvalneg eax;EAX=mov ebx,Yvalsub ebx,Zval;EBX=add eax,ebxmov Rval,eax;,-26-10-36,23,(二)加法和减法 6.算数运算影响的标志,mov cx,1sub cx,1;ZF=mov ax,0FFFFhinc ax;ZF=inc ax;ZF=,零
13、标志和符号标志,110,mov cx,0sub cx,1;SF=add cx,2;SF=,10,24,(二)加法和减法 6.算数运算影响的标志,mov al,0FFhadd al,1;CF=,进位标志(无符号算数运算)INC和DEC指令不影响进位标志。,1,mov ax,00FFhadd ax,1;CF=,0,mov ax,0FFFFhadd ax,1;CF=,1,mov al,1sub al,2;CF=,1,25,(二)加法和减法 6.算数运算影响的标志,mov al,+127add al,1;OF=,溢出标志(有符号算数运算),1,mov al,-128sub al,1;OF=,1,mov
14、 al,-128;AL=10000000bneg al;AL=,OF=,10000000b 1,mov al,+127;AL=01111111bneg al;AL=,OF=,10000001b 0,其中,Cn为符号位产生的进位,即标志位CF;Cn-1为最高有效位向符号位产生的进位。,26,(二)加法和减法 6.算数运算影响的标志,CPU如何知道一个数字是有符号的还是无符号的?CPU并不知道 只有程序员才知道。CPU在执行指令之后机械地设置各种状态标志,它并不知道哪些对程序员是重要的,程序员自己来选择解释哪些标志和忽略哪些标志。,27,OFFSET 操作符PTR 操作符TYPE 操作符LENGT
15、HOF 操作符SIZEOF 操作符,(三)和数据相关的操作符和伪指令,28,返回数据标号的偏移地址(标号距数据段开始的距离,以字节为单位)。保护模式下偏移总是32位的。实模式下偏移只有16位。,(三)和数据相关的操作符和伪指令 1.OFFSET操作符,29,例:假设bVal位于00303000h处。.databVal BYTE?wVal WORD?dVal1 DWORD?dVal2 DWORD?.codemov esi,OFFSET bVal;ESI=mov esi,OFFSET wVal;ESI=mov esi,OFFSET dVal1;ESI=mov esi,OFFSET dVal2;ES
16、I=mov esi,OFFSET bVal+1,(三)和数据相关的操作符和伪指令 1.OFFSET操作符,00303000003030010030300300303007,30,用来说明操作数的尺寸。必须和以下标准数据类型联合使用:BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE,(三)和数据相关的操作符和伪指令 2.PTR操作符,31,例:,(三)和数据相关的操作符和伪指令 2.PTR操作符,.datamyDouble DWORD 12345678h.codemov ax,myDouble;错误mov ax,WORD PTR myDou
17、ble;ax=?mov ax,WORD PTR myDouble+2;ax=?mov bl,BYTE PTR myDouble;bl=?,5678h1234h78h,32,返回按字节计算的变量的单个元素的大小。例:.datavar1 BYTE?var2 WORD?var3 DWORD?var4 QWORD?,(三)和数据相关的操作符和伪指令 3.TYPE操作符,1,2,4,8,33,计算数组中元素的个数。例:,(三)和数据相关的操作符和伪指令 4.LENGTHOF操作符,.databyte1 BYTE 10,20,30array1 WORD 30 DUP(?),0,0array2 WORD 5
18、 DUP(3 DUP(?)arrar3 DWORD 1,2,3,4digitStr BYTE 12345678,0,3,30+2,53,4,9,34,SIZEOF返回值LENGTHOF返回值TYPE返回值例:,(三)和数据相关的操作符和伪指令 5.SIZEOF操作符,.dataintArray WORD 32 DUP(0),23264,35,汇编语言中如何处理数组?完全使用直接寻址 不切实际解决办法:用寄存器作为指针,通过改变指针寄存器的值来访问数组中的不同元素,这种寻址方式称为寄存器间接寻址,存放地址的寄存器称为间接操作数。,(四)间接寻址 1.间接操作数(寄存器间接寻址),36,可以是任何
19、用方括号括起来的32位通用寄存器(EAX,EBX,ECX,EDX,ESI,EDI,EBP、ESP)。例:.dataval1 BYTE 10h.codemov esi,OFFSET val1mov AL,esimov esi,BL实地址模式下只能用SI,DI,BX,BP。通常尽量避免使用BP(BP常用来寻址堆栈而不是数据段)。,(四)间接寻址 1.间接操作数(寄存器间接寻址),.dataval1 BYTE 10h.codemain proc mov si,OFFSET val1 mov AL,si;AL=10h,37,PTR与间接操作数的联合使用例:inc esi;error:operand m
20、ust have sizeinc BYTE PTR esi,(四)间接寻址 1.间接操作数(寄存器间接寻址),38,例:三个双字相加.dataarrayD DWORD 10000h,20000h,30000h.codemov esi,OFFSET arrayDmov eax,esiadd esi,4add eax,esiadd esi,4add eax,esi,(四)间接寻址 2.数组,;=10000h,;=20000h,;=30000h,39,例:.dataarrayB BYTE 10h,20h,30h.codemov esi,0mov al,arrayB+esi;mov al,arrayBesi;mov esi,OFFSET arrayBmov al,esi;mov al,esi+1;mov al,esi+2;实模式下只能使用SI,DI,BX,BP寄存器。(尽量避免使用BP寄存器),(四)间接寻址 3.变址操作数(寄存器相对寻址),AL=10h 同上,另一种格式 AL=10h AL=20h AL=30h,