,Klicken Sie,um das Titelformat zu bearbeiten,Klicken Sie,um die Formate des Vorlagentextes zu bearbeiten,Zweite Ebene,Dritte Ebene,Vierte Ebene,Fnfte Ebene,*,计算机科学系,汇编,课件,第4章 数据传送、寻址和算术运算,要点:,数据传送指令,加法和减法,和数据相关的操作符和伪指令,间接寻址,JMP,和,LOOP,指令,1.数据传送指令,在汇编语言中,可以(必须)控制任何细节!,“,权力责任,”,汇编编译器给予了声明和移动数据的极大自由,它只进行很少的错误检查!,操作数类型,立即操作数,imm,寄存器操作数,reg,内存操作数,mem,.data,var1 byte 10h,.code,mov al,var1,;A0 00010400,MOV,指令,MOVZX,指令,MOVSX,指令,LAHF,指令,SAHF,指令,XCHG,指令,1.数据传送指令,MOV,指令,从源操作数向目的操作数拷贝数据,mov,目的操作数,源操作数,mov reg/mem,reg,mov reg,mem,mov mem/reg,imm,两个操作数的尺寸必须一致,两个操作数不能同时为内存操作数,目的操作数不能是,CS、EIP,和,IP,立即数不能直接送段寄存器,mov ax,var1,mov var2,ax,拷贝较小值至较大值中,MOV,指令,.data,count WORD 1,.code,mov ecx,0,mov cx,count,将16位数,32位数;,但仅限于无符号数,.data,signedVal SWORD -1,.code,mov ecx,0,mov cx,signedVal,那么对于有符号,数呢,?,MOVZX,指令,将值零扩展,movzx r32,,,r/m8,movzx r32,,,r/m16,movzx r16,,,r/m8,仅适用于无符号数,目的操作数必须是寄存器,mov bx,0a69bh,movzx eax,bx,movzx ebx,bl,movzx cx,bl,MOVSX,指令,将值的符号位扩展,movsx r32,,,r/m8,movsx r32,,,r/m16,movsx r16,,,r/m8,仅适用于有符号数,目的操作数必须是寄存器,mov bx,0a69bh,movsx eax,bx,movsx ebx,bl,movsx cx,bl,LAHF,指令,LAHF(load status flags into AH),将,EFLAGS,寄存器的低字节拷贝至,AH,.data,saveflags BYTE?,.code,lahf,mov saveflags,ah,SAHF,指令,SAHF(store AH into status flags),拷贝,AH,寄存器的值至,EFLAGS,的低字节,.data,saveflags BYTE?,.code,mov ah,saveflags,sahf,XCHG,指令,交换两个操作数的内容,xchg reg,,,reg,xchg reg,,,mem,xchg mem,,,reg,操作数规则遵循与,MOV,指令的操作数同样的规则,xchg ax,bx,xchg ah,al,xchg var1,bx,xchg eax,ebx,mov ax,var1,xchg ax,var2,mov var1,ax,直接偏移操作数,直接偏移操作数,在变量名称后加上一个偏移值,可以通过它来访问没有显式标号的内存地址,.data,arrayB BYTE 10h,20h,30h,40h,50h,.code,mov al,arrayB+2,mov ah,arrayB+1,;,不要求一定使用方括号,mov bl,arrayB+5,;MASM,不对有效地址进行范围检查,2.,加法和减法,INC,和,DEC,指令,ADD,指令,SUB,指令,NEG,指令,INC,和,DEC,指令,从操作数中加,1,或减,1,inc reg,/mem,dec reg,/mem,.data,myWord WORD 1000h,.code,inc myWord,mov bx,,,myWord,dec bx,不影响,CF,影响,SF,、,OF,、,ZF,、,PF,、,AF,ADD,指令和,SUB,指令,将同尺寸的源操作数和目的操作数相加或相减,add,目的操作数,,,源操作数,sub,目的操作数,,,源操作数,影响,CF,、,SF,、,OF,、,ZF,、,PF,、,AF,NEG,指令,通过将数字转换为对应的二进制补码而求得其相反数,neg reg,neg mem,影响,CF,、,SF,、,OF,、,ZF,、,PF,、,AF,综合例子,.data,Rval SDWORD?,Xval SDWORD 26,Yval SDWORD 30,Zval SDWORD 40,.code,mov eax,,,Xval,neg eax,mov ebx,Yval,sub eax,,,Zval,add eax,ebx,mov Rval,eax,Rval,Xval,(,Yval,Zval,),算术运算影响的标志,零标志,ZF,和符号标志,SF,目的操作数被赋以零值的时候,,ZF,被设置,在运算结果为负的时候,,SF,被设置,进位标志,CF,(无符号),如果无符号运算的结果对目的操作数而言太大(或太小)而无法容纳时,,CF,被设置,INC,和,DEC,指令并不影响,CF,溢出标志,OF,(有符号),当算术运算产生的有符号的结果无法容纳于目的操作数时,,OF,就被设置,3.,和数据相关的操作符和伪指令,OFFSET,伪指令,ALIGN,伪指令,PTR,伪指令,TYPE,伪指令,LENGTHOF,伪指令,SIZEOF,伪指令,LABEL,伪指令,OFFSET,伪指令,返回数据标号的偏移地址,单位是字节,.data,bVal BYTE?,wVal WORD?,dVal DWORD?,dVal2 DWORD?,myArray WORD 1,2,3,4,.code,mov esi,OFFSET,bVal,mov esi,OFFSET,wVal,mov esi,OFFSET,dVal,mov esi,OFFSET,dVal2,mov,esi,OFFSET,myArray+4,ALIGN,伪指令,将按变量的位置按字节、字、双字边界对齐,ALIGN,边界值,bVal BYTE?,;0040000,ALIGN 2,wVal WORD?,;0040002,bVal2 BYTE?,;0040004,ALIGN 4,dVal DWORD?,;0040008,dVal2 DWORD?,;004000C,PTR,伪指令,重载操作数的默认尺寸,.data,myDouble DWORD 12345678h,wordList WORD 5678h,1234h,.code,mov ax,myDouble,;错误,mov ax,WORD PTR myDouble,mov ax,WORD PTR myDouble+2,mov eax,DWORD PTR wordList,;较大数 较小数,BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE,TYPE,伪指令,返回按字节计算的变量的单个元素的大小,表达式,值,TYPE var1,1,TYPE var2,2,TYPE var3,4,TYPE var4,8,.data,val1 BYTE?,val2 WORD?,val3 DWORD?,val4 DWORD?,LENGTHOF,伪指令,计算数组中元素的数目,.data,byte1 BYTE 10,20,30,;,lengthof byte1,:,3,array1 WORD 30 DUP,(,?,),0,0,;,lengthof array1,:,30+2,array2 WORD 5 DUP,(,3 DUP,(,?,),;,lengthof array2,:,5*3,array3 DWORD 1,2,3,4,;,lengthof array3,:,4,digitStr BYTE “12345678”,0,;lengthof digitStr:9,LENGTHOF,伪指令,.data,myArray1 BYTE 10,20,30,40,50,BYTE 60,70,80,90,100,;,lengthof myArray1,:,5,myArray2 BYTE 10,20,30,40,50,60,70,80,90,100,;,lengthof myArray2,:,10,注意,“,,,”,只把第一行的数据的作为数组的组成部分,SIZEOF,伪指令,返回值等于,LENGTHOF,和,TYPE,返回值的乘积,intArray WORD 32 DUP,(,0,),;,SIZEOF,64,LABEL,伪指令,允许插入一个标号并赋予其尺寸属性而无需分配任何实际的存储空间,常见用法就是为数据段内已存在的变量提供一个别名,.data,val16 LABEL WORD,val32 DWORD 12345678h,.code,mov ax,val16,;,AX=5678h,mov dx,val16+2,;,DX=1234h,BYTE,WORD,DWORD,QWORD,TBYTE,.data,LongValue LABEL DWORD,val1 WORD 5678h,val2 WORD 1234h,.code,mov eax,LongValue,;,EAX=12345678h,LABEL,伪指令,4.,间接寻址,间接寻址(,indirect addressing,),处理数组惟一可行的方法是用寄存器作为指针并操纵寄存器的值;,间接操作数,数组,变址操作数,指针,间接操作数,任何用方括号括起来的,32,位通用寄存器,.data,val1 BYTE 10h,.code,mov esi,OFFSET,val1,mov al,esi,mov esi,bl,inc esi,在保护模式下,如果有效地址指向程序数据段之外的区域,,CPU,会产生一个,GPF,操作数大小不明确,inc BYTE PTR esi,数组,.data,arrayB BYTE 10h,20h,30h,.code,mov esi,OFFSET,arrayB,mov al,esi,inc esi,mov al,esi,inc esi,mov al,esi,.data,arrayD DWORD 1000h,2000h,3000h,.code,mov esi,OFFSET,arrayD,mov eax,esi,add esi,4,add eax,esi,add esi,4,add eax,esi,变址操作数,将常量加到寄存器上以产生一个有效地址,任何,32,位通用寄存器都可以作为指针寄存器,.data,arrayB BYTE 10h,20h,30h,.code,mov esi,0,mov al,arrayB+esi,constantreg,constant+reg,指针,arrayB BYTE 10h,20h,30h,40h,arrayW WORD 1000h,2000h,3000h,ptrB BYTE arrayB,ptrW DWORD arrayW,;,ptrW DWORD OFFSET arrayW,5.JMP,和,LOOP,指令,JMP,指令,LOOP,指令,整数数组求和,拷贝字符串,1.JMP,指令,导致向代码段内的目标地址做无条件转移,JMP,目标标号,top,:,jmp top,无限循环,2.LOOP,指令,提供一种将程序块重复执行特定次数的简单方法,ECX,被自动用作计数器,每次循环后减,1,LOOP,目标标号,mov ax,0,mov ecx,5,L1: