资源描述
郑州大学 计算机系 穆玲玲 iellmu,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,32位汇编语言程序设计,第5章,数据操作,教学重点,数据传送,算数运算,位操作,5.1数据传送,数据传送是计算机中最基本、最重要的一种操作,由传送指令实现。,除标志寄存器传送指令外,均,不影响标志,位,通用数据传送指令,通用数据传送指令包括,MOV,XCHG,XLAT,传送指令MOV,(move),把一个字节,字或者双字的操作数从源地址传送至目的地址,MOV reg/mem,imm,;立即数送寄存器或主存,例题5-1,MOV reg/mem/seg,reg,;寄存器送(段)寄存器或主存,例题5-2,MOV reg/seg,mem,;主存送(段)寄存器,例题5-3,MOV reg/mem,seg,;段寄存器送寄存器或主存,例题5-5,例5-1:立即数传送,mov al,4;al4,字节传送,mov cx,0ffh;cx00ffh,字传送,mov esi,200h,;esi00000200h,双字传送,mov byte ptr esi,0ah,;ds:esi 0ah,byte ptr说明是字节操作,mov dword ptr esi+4,0bh,;ds:esi+2 0000000bh,,;dword ptr说明是双字操作,注意立即数是字节量,字量还是双字量,明确指令是字节操作,字操作还是双字操作,MOV,两个操作数的类型要一致,绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令,MOV AL,050AH,;非法指令:050Ah为字,而AL为字节,寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型,对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型,要小心段寄存器的操作,不允许立即数传送给段寄存器,MOV DS,100H,;非法指令:立即数不能传送段寄存器,不允许直接改变CS值,MOV CS,SI,;不允许使用的指令,不允许段寄存器之间的直接数据传送,MOV DS,ES,;非法指令:不允许段寄存器间传送,例5-2:寄存器传送,mov eax,ebx,;,eax,ebx,mov ah,al,;,ah,al,mov ebx,eax,;,DS:ebx,eax,MOV,例5-3:存储器传送,mov al,ebx ; al,ds:ebx,mov dx,ebp;dx,ss:ebp,mov es,esi;es,ds:esi,不存在存储器向存储器的传送指令,MOV,继续,例5-4,;DA1单元的数据传送到DA2单元,.data,DA1 dword 34567890h,DA2 dword 12345678h,.code,mov eax,DA1,;eax,DA1,(将,DA1,内容送e,ax,),mov DA2,eax ;DA2,eax,;DA1,、,DA2,实际表示直接寻址方式,MOV,例5-5:段寄存器传送,mov si,ds,mov ax,es,mov ds,ax,对段寄存器的操作有一些限制,MOV,交换指令XCHG,(exchange),把两个地方的数据进行互换,寄存器与寄存器之间对换数据,寄存器与存储器之间对换数据,不能在存储器与存储器之间对换数据,XCHG reg,reg/mem,;reg,reg/mem,例题5-7,例题5-6,例5-6:寄存器间交换,mov eax,12345678h,mov ebx,9ABCDEF0h,xchg eax,ebx,;eax=9ABCDEF0h,,,ebx=12345678h,xchg ax,bx,;ax=5678h,,,bx=DEF0h,xchg ah,al;ax=7856h,XCHG,.data,b_da equ this byte,w_da equ this word,da dword 100,.code,xchg eax,da; 双字交换,;也可以表达为xchg da,eax,xchg ax,w_da;字交换,;也可以表达为xchg w_da,ax,xchg al,b_da; 字节交换,;也可以表达为xchg b_da,al,例5-7:寄存器与存储器交换,XCHG,换码指令执行前:,在主存建立一个,字节量表格,,内含要转换成的目的代码,表格首地址,存放于E,BX,,,AL,存放相对表格首地址的,位移量,换码指令执行后:,将,AL,寄存器的内容转换为,目标代码,3. 换码指令XLAT,(translate),将EBX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT,XLAT,;alds:ebx+al,例题5-8,例5-8(1/3):代码转换,;,一位,16,进制数转换为,ASCII,码,.386,.MODEL FLAT,STDCALL,include masm32includeio32.inc,.stack,XLAT,继续,例5-8(2/3):代码转换,.data,ASCII byte 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,41h,42h,43h,44h,45h,46h,prompt byte input a number ,between:015,0dh, 0ah,0,XLAT,继续,例5-8(3/3):代码转换,.code,start:,mov ebx, offset ASCII,;ebx,存放,ASCII,表的首地址,WriteString prompt,ReadUDecByte al,;,读入,015,之间的十进制数存放在,al,寄存器中,xlat ;,换码,al - ds:ebx+al,WriteCrlf;,显示回车换行,WriteChar al ;,显示,al,中存放的字符,ret,end start,XLAT,换码指令没有显式的操作数,但使用了,EBX,和,AL,;,因为换码指令使用了隐含寻址方式,采用默认操作数,返回,5.1.2 地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器,有效地址传送指令 LEA,指针传送指令 LDS和LES,注意不是获取存储器单元的内容,有效地址传送指令LEA,(load EA),将存储器操作数的有效地址传送至指定的寄存器中。,在实模式下,使用,16,位寄存器,在保护模式下使用,32,位寄存器,LEA r16/r32,mem,;r16mem的有效地址EA,LEA,例题,5-8,获取有效地址的指令:,mov ebx, offset ASCII,可以改写为:,lea ebx,ASCII;,E,BX=offset ACII,获得主存单元的有效地址;不是物理地址,也不是该单元的内容,可以实现计算功能,指针传送指令,LDS r16,mem,;r16mem,,;DSmem+2,实模式下,,LDS,指令将主存中,mem,指定的字送至,r16,,并将,mem,的下一字送,DS,寄存器。,在保护模式下,,LDS,指令将主存中,mem,指定的前面,4,个字节送至,32,位寄存器,并将,mem,的下一字送,DS,寄存器,。,LES r16,mem,;r16mem,,;ESmem+2,实模式下,,L,E,S,指令将主存中,mem,指定的字送至,r16,,并将,mem,的下一字送,DS,寄存器。,在保护模式下,,L,E,S,指令将主存中,mem,指定的前面,4,个字节送至,32,位寄存器,并将,mem,的下一字送,DS,寄存器,。,例题5-9,例5-9:地址指针传送,fvar fword 0;定义地址指针fvar,mov dword ptr fvar, offset ASCII,;将ASCII偏移地址存入fvar的前两个字,mov word ptr fvar+4, DS,;将ASCII所在数据段DS的值存入fvar的后面一个字,lds esi,fvar,;将fvar中存放的前两个字装入esi,后一个字装入ds,fvar,指定主存的连续,6,个字节作为逻辑地址(,48,位的地址指针),送入,DS:r32,或,ES:r32,Windows2000/XP,环境下的应用程序一般不使用地址指针传送指令,因为这种操作可能会造成系统崩溃。,例,5-10(1/4),:,数据传送的综合实例,.386,.model flat, stdcall,.data,val1 WORD 1000h,val2 WORD 2000h,arrayB BYTE 10h,20h,30h,40h,50h,arrayW WORD 100h,200h,300h,arrayD DWORD 10000h,20000h,例,5-10(2/4),:,数据传送的综合实例,.code,start:,;,内存与内存之间的数据交换,mov ax,val1; AX = 1000h,xchg ax,val2,; AX = 2000h, val2 = 1000h,mov val1,ax; val1 = 2000h,例,5-10(3/4),:,数据传送的综合实例,;,字节数组访问,mov al,arrayB ; AL = 10h,mov al,arrayB+1; AL = 20h,mov al,arrayB+2; AL = 30h,;,字数组访问,mov ax,arrayW ; AX = 100h,mov ax,arrayW+2; AX = 200h,例,5-10(4/4),:,数据传送的综合实例,;,双字数组访问,mov eax,arrayD; EAX = 10000h,mov eax,arrayD+4; EAX = 20000h,mov eax,arrayD+TYPE arrayD,; EAX = 20000h,END start,调试,例5-11:移位64位数据,分析:为保证数据各位正确移位,,64,位数据的,8,个字节应从高 字节开始、依右而左依次左 移,8,位(一个字节),采用字 节传送指令。,例,5-,11(1/3),:移位64位数据,.386,.model flat,stdcall,.stack,.data,q,var qword,例,5-,11(2/3),:移位64位数据,.code,start:,mov al,byte ptr qvar6,mov byte ptr qvar7,al,mov al,byte ptr qvar5,mov byte ptr qvar6,al,mov al,byte ptr qvar4,mov byte ptr qvar5,al,mov al,byte ptr qvar3,mov byte ptr qvar4,al,例,5-,11(3/3),:移位64位数据,mov al,byte ptr qvar2,mov byte ptr qvar3,al,mov al,byte ptr qvar1,mov byte ptr qvar2,al,mov al,byte ptr qvar0,mov byte ptr qvar1,al,mov byte ptr qvar0,0,ret,end start,示意图,例5-11示意图,12,34,56,78,87,65,43,21,12,34,56,78,87,65,43,0,5.2 算术运算,算术运算是,IA-32,指令系统中另外一种基本的操作指令,可以用来执行字节,字或双字的二进制加减乘除算术运算。,这类指令会根据计算结果设置相应的标志位。,5.2.1 加法指令,执行双字,字或字节的加法运算。,ADD,ADC,INC,加法指令ADD,ADD指令将源与目的操作数相加,结果送到目的操作数,ADD指令按状态标志的定义相应设置,ADD reg,imm/reg/mem,;regregimm/reg/mem,ADD mem,imm/reg,;memmemimm/reg,例题5-12,.data,var1 dword 10000h,var2 dword 2000h,.code,start:,mov al,0fbh ;al=0fbh,add al,07h;al=02h,mov eax, var1;eax=10000h,add eax, var2;eax=12000h,ret,例,5-,12:,加法运算,返回,设置标志位,ADD,指令按照状态标志的定义相应设置标志位的,0,或,1,状态。,在,07+FBH,02H,运算后:标志寄存器的内容为,00000213h,,对应的,OF=0,、,SF=0,、,ZF=0,、,AF=1,、,PF=0,、,CF=1,在,10000h+20000h=30000h,运算后,标志寄存器,Fl,的内容为,00000206h,,对应的,OF=0,、,SF=0,、,ZF=0,、,AF=0,、,PF=1,、,CF=0,。,注意,,PF,仅反映低,8,位中“,1,”,的个数,,AF,只反映,D,3,对,D,4,位是否有进位。,大小写字符转换,加法指令也能用作其它的用途,比如大小写字母的转换。,大写字母,AZ,的,ASCII,码是,41h5ah,小写字母,az,的,ASCII,码是,61h7ah,它们之间相差,20h,要将大写字母转换为相应的小写字母只需要加上,20h,即可。,例5-13,mov al,A,;,al=41h,(,A,的,ASCII,码),add al, 20h;al=61h,(,a,的,ASCII,码),例,5-,13:,大写字母转换为小写字母,返回,带进位加法指令ADC,ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数,ADC指令按状态标志的定义相应设置,ADC指令主要与ADD配合,实现多精度加法运算,ADC reg,imm/reg/mem,;regregimm/reg/memCF,ADC mem,imm/reg,;memmemimm/regCF,例题5-14a,.386,.model flat, stdcall,.stack 4096,.data,d,var1 dword 82347856h,67783000h,d,var2 dword 12348998h,67762000h,d,var3 dword 2 dup(?),例,5-,14a(1/2):,无符号64位二进制加法运算,继续,.code,start:,mov ebx,0,mov esi,4,mov eax,dvar1ebx,add eax,dvar2ebx,mov dvar3bx,eax,mov eax,dvar1ebxesi,adc eax,dvar2ebxesi,mov dvar3ebxesi,eax,ret,end start,例,5-,14a(2/2):,无符号64位二进制加法运算,返回,增量指令INC,(increment),INC指令对操作数加1(增量),INC指令不影响进位CF标志,按定义设置其他状态标志,INC reg/mem,;reg/memreg/mem1,inc ebx,inc byte ptrebx,例题5-14b,.386,.model flat, stdcall,.stack 4096,.data,d,var1 dword 82347856h,67783000h,d,var2 dword 12348998h,67762000h,d,var3 dword 2 dup(?),例,5-,14b(1/3):,无符号64位二进制加法运算,继续,修改例题,5-11a,的代码段,实现同样的功能,.code,start:,mov ebx,0,mov esi,0,mov eax,dvar1ebxesi*4,add eax, dvar2ebxesi*4,mov dvar3bxesi*4,eax,例,5-,14b(2/3):,无符号64位二进制加法运算,继续,inc esi,mov eax,dvar1ebxesi*4,adc eax, dvar2ebxesi*4,mov dvar3ebxesi*4,eax,ret,end start,例,5-,14b(3/3):,无符号64位二进制加法运算,返回,5.2.2 减法指令,SUB指令将目的操作数减去源操作数,结果送到目的操作数,SUB指令按照定义相应设置状态标志,SUB reg,imm/reg/mem,;regregimm/reg/mem,SUB mem,imm/reg,;memmemimm/reg,例5-15(1/2):减法运算,.data,var1 dword 10000h,var2 dword 2000h,.code,start:,mov al,0fbh;al=0fbh,sub al,07h,;al=f4h,EFLAGS=00000282h,SUB,例5-15(2/2):减法运算,mov eax, var1,;eax=10000h,sub eax, var2,;eax=0000e000h,;,EFLAGS=00000206h,ret,SUB,SUB指令设置标志位的状态,SUB,指令按照状态标志的定义相应设置标志位的状态。,在,0fbh-07h,f4h,运算后:标志寄存器的内容为,00000282h,,对应的,OF=0,、,SF=1,、,ZF=0,、,AF=0,、,PF=1,、,CF=0,。,在,10000h-2000h=e000h,运算后,标志寄存器,Fl,的内容为,00000206h,,对应的,OF=0,、,SF=0,、,ZF=0,、,AF=0,、,PF=1,、,CF=0,。,例,5-16,小写字母转换为大写字母,减法指令也能用于大小写字母的转换。,分析:要将小写字母转换为相应的大写字母只需要减去,20h,即可。,mov al,a,;,al=61h,(,a,的,ASCII,码),sub al, 20h;al=41h,(,A,的,ASCII,码),带借位减法指令SBB,SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。,SBB指令按照定义相应设置状态标志,SBB指令主要与SUB配合,实现多精度减法运算,SBB reg,imm/reg/mem,;regregimm/reg/memCF,SBB mem,imm/reg,;memmemimm/regCF,例题5.17,.386,.model flat, stdcall,.stack 4096,.data,dvar1 dword 82347856h,67783000h,dvar2 dword 12348998h,67762000h,dvar3 dword 2 dup(?),例,5-17(1/3),:,无符号,64,位二进制减法运算,继续,.code,start:,mov ebx,0,mov esi,4,mov eax,dvar1ebx,sub eax,dvar2ebx,mov dvar3bx,eax,例,5-17(2/3),:,无符号,64,位二进制减法运算,继续,mov eax,dvar1ebxesi,sbb eax,dvar2ebxesi,mov dvar3ebxesi,eax,ret,end start,例,5-17(3/3),:,无符号,64,位二进制减法运算,返回,减量指令DEC,(decrement),DEC指令对操作数减1(减量),DEC指令不影响进位CF标志,按定义设置其他状态标志,DEC,DEC reg/mem,;reg/memreg/mem1,dec ecx,dec word ptr esi,INC,指令和,DEC,指令都是单操作数指令,主要用于对计数器和地址指针的调整,求补指令NEG,(negative),NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数,求补运算也可以表达成:将操作数按位取反后加1,NEG指令对标志的影响与用零作减法的SUB指令一样,NEG,NEG reg/mem,;reg/mem0reg/mem,例题5-18,.386,.MODEL FLAT,STDCALL,include masm32includeio32.inc,.stack,.code,start:,mov eax, -100,neg eax,WriteSDecDword eax,ret,end start,例,5-18,:,求一个数的相反数,比较指令CMP,(compare),CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志,CMP指令执行的功能与SUB指令,但结果不回送目的操作数,CMP reg,imm/reg/mem,;regimm/reg/mem,CMP mem,imm/reg,;memimm/reg,5.2.3 乘法指令,乘法指令用来实现两个二进制操作数的相乘运算,。,无符号数乘法指令,MUL,有符号数乘法指令,IMUL,。,无符号数乘法指令,MUL,MUL,指令执行无符号二进制数的乘法运算,。,MUL r8/m8;无符号字节乘:AXALr8/m8,MUL r16/m16;无符号字乘:,; DX.AXAXr16/m16,MUL r32/m32;无符号双字乘:,; EDX.EAXEAXr32/m32,例5-19,.386,.MODEL FLAT,STDCALL,include masm32includeio32.inc,.stack,.data,prompt3 byte 0dh, 0ah, x*y = ,0,x word 0FFFEh,y word 001Eh,result dword ?,例,5-19,(1/2),:,16,位,无符号数乘法,继续,.code,start:,mov ax,x;ax-x,mul y ;,乘法:,ax*y,mov word ptr result , ax,;,存放乘积的低字部分,mov word ptr result+2,dx,;,存放乘积的高字部分,WriteString prompt3,WriteHexDword result;,显示乘积,ret,end start,例,5-19(2/2),:,返回,有符号数乘法指令IMUL,IMUL指令执行无符号二进制数的乘法运算,。,IMUL r8/m8;有符号字节乘:AXALr8/m8,IMUL r16/m16;有符号字乘:DX.AXAXr16/m16,IMUL r32/m32;有符号双字乘:,; EDX.EAXEAXr32/m32,乘法指令对标志的影响,乘法指令如下影响OF和CF标志:,MUL指令若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1,IMUL指令若乘积的高一半是低一半的,符号扩展,,则OF=CF=0;否则均为1,乘法指令对其他状态标志,没有定义,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是,0,还是,1,),对标志没有影响:指令执行不改变标志状态,IMUL的其他格式,IMUL r16,r16/m16/i8/i16,;,有符号字乘:,r16,r16,r16/m16/i8/i16,IMUL r32,r32/m32/i8/i16/i32,;,有符号双字乘:,;,r32,r32,r32/m32/i32/i16/i8,IMUL r16,r16/m16,i8/i16,;,有符号字乘:,r16,r16/m16*/i8/i16,IMUL r32,r32/m32,i8/i32,;,有符号双字乘:,r32,r32/m32*/i8/i32,imul eax,,,ebx,,,2,;,eax-ebx*2,;x=FFFE, y=001E,mov ax,x;ax-x,mul y ;,乘法:,ax*y,mov word ptr result , ax,mov word ptr result+2,dx,;result=,1DFFC4,mov ax,x;ax-x,imul y ;,乘法:,ax*y,mov word ptr result , ax,mov word ptr result+2,dx,;result=,FFFFFFC4,MUL与IMUL,5.2.4 除法指令,除法指令执行两个二进制数的除法运算,无符号二进制数除法指令,DIV,有符号二进制数除法指令,IDIV,两条指令,除法指令使状态标志没有定义。,无符号二进制数除法指令,DIV,DIV r8/m8,;,无符号字节除:,AL,AX,r8/m8,的商,,;AH,AX,r8/m8,的余数,DIV r16/m16,;,无符号字除:,AX,DX.AX,r16/m16,的商,,;DX,DX.AX,r16/m16,的余数,DIV r32/m32,;,无符号字除:,EAX,EDX.EAX,r32/m32,的商,,;,EDX,EDX.EAX,r16/m32,的余数,有符号数除法指令,IDIV,IDIV r8/m8,;,无符号字节除:,AL,AX,r8/m8,的商,,;AH,AX,r8/m8,的余数,IDIV r16/m16,;,无符号字除:,AX,DX.AX,r16/m16,的商,,;DX,DX.AX,r16/m16,的余数,IDIV r32/m32,;,无符号字除:,EAX,EDX.EAX,r32/m32,的商,,;,EDX,EDX.EAX,r16/m32,的余数,;x=FFFE, y=001E,mov ax,x;ax-x,mov dx,0,div y ;除法:axy,;,ax=0888,dx000E,mov ax,x;ax-x,mov dx,0,idiv y ;除法:axy,;,ax=0888,dx000E,错误,DIV与IDIV,除法指令的功能,除法指令分无符号和有符号除法指令,除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数,字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH,字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX,字量除法:EDX.EAX除以r32/m32,32位商存入EAX,32位余数存入EDX,除法指令对标志没有定义,除法指令会,产生结果溢出,例题5-20,除法溢出,当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器不能表达,便产生溢出,对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,或者在双字除时商超过32位,则发生除法溢出。,对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,或者在双字除时商不在-2,32,2,32,1范围内,则发生除法溢出。,例题,除法溢出,mov ax, 20000,mov bl,10,div bl,;20000102000,;商在AL中放不下,产生溢出,mov dx, 0,mov ax, 20000,mov bx,10,div bx,;20000102000,;商在AX中可以放下,不产生溢出,返回,.386,.MODEL FLAT,STDCALL,include masm32includeio32.inc,.stack,.data,prompt3 byte 0dh, 0ah, quation = ,0,prompt4 byte remainder = ,0,x word fffeh,y word 001eh,remainder word ?,quation word ?,例,5-20,(1/2),:,16,位,无符号数除法,继续,.code,start:,mov ax,x;ax-x,mov dx,0,div y ;除法:axy,WriteString prompt3,WriteHexWord ax ;显示商,WriteString prompt4,WriteHexWord dx;显示余数,ret,end start,例,5-20(2/2),:,16,位,无符号数除法,返回,5.2.5 符号扩展指令,什么是,符号扩展,符号扩展指令常用于获得倍长的数据,不影响标志位,字节转换为字指令,CBW,字转换为双字指令,CWD,字转换为双字指令,CWDE,双字转换为四个字指令,CDQ,无符号扩展传送指令,MOVZX,有符号扩展传送指令,MOVSX,符号扩展的概念,符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。,符号扩展不改变数据大小,对于数据64H(表示数据100),其最高位D,7,为0,符号扩展后高8位都是0,成为,0064H(仍表示数据100),对于数据ff00H(表示有符号数256),其最高位D,15,为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数256),字节转换为字指令,CBW,CBW,;AL的符号扩展至AH,;如AL的最高有效位是0,则AH00,;AL的最高有效位为1,则AHFFH。AL不变,例5-21:符号扩展,mov al,80h;al=80h,cbw;ax=ff80h,add al,255;al=7fh,cbw;ax=007fh,字转换为双字指令,CWD,CWD,;AX的符号扩展至DX.AX,;如AX的最高有效位是0,则DX00,;AX的最高有效位为1,则DXFFH。AX不变,mov ax,-256;ax=FF00h,cwd; DX=FFFFh,ax=ff00h,;x=FFFE, y=001E,mov ax,x;ax-x,mov dx,0,idiv y ;除法:axy,mov ax,x,;,ax-x,cwd,i,div y,;除法:,ax,y,修改例520,字转换为双字指令,CWD,E,CWDE,;AX的符号扩展至EAX,;如AX的最高有效位是0,则EAX的高字00,;AX的最高有效位为1,则EAX的高字FFH。AX不变,计算有符号数,EBX,与,AX,内容之和,cwde,add ebx, eax,注意,不能直接把,EBX,和,AX,内容相加:,add,ebx, ax,;,非法指令,;因为两个操作数类型不一致,双字转换为四个字指令,CDQ,CDQ,;EAX符号扩展成EDX.EAX,;如EAX的最高有效位是0,则EDX00,;EAX的最高有效位为1,则EDXFFFFH。EAX不变,例5-22:计算有符号数xy,.data,x dword 34567,y dword 567,.code,mov eax, x,cdq;被除数扩展到edx.eax,idiv y,无符号扩展传送指令,MOVZX,MOVZX r16/r32,r8/r16/m8/m16,; r16/r32r8/r16/m8/m16,MOVZX,指令把一个字节或者字操作数从源地址传送至目的地址,高位不足的部分用零填充,它实现的功能是将一个无符号的整数从,8,位扩展到,16,位,从,16,位扩展到,32,位,并且保持数值不变。,mov al, 82h;al=82h,movzx bx, al;bx=0082h,movzx ebx, al;ebx=00000082h,mov cx, 1000h;cx=1000h,movzx edx, cx;edx=00001000h,例,5-23,:,MOVZX,movzx eax,x;eax-x,movzx ebx, y,mul ebx ;乘法:ax*y,mov result , eax;存放乘积,修改例,5-19,有符号扩展传送指令,MOVSX,MOVSX r16/r32,r8/r16/m8/m16,; r16/r32r8/r16/m8/m16,MOVSX,指令把一个字节或者字操作数从源地址传送至目的地址,高位不足的部分用源,操作数的符号位填充,它实现的功能是将一个无符号的整数从,8,位扩展到,16,位,从,16,位扩展到,32,位,并且保持数值不变。,mov al, 82h;al=82h,movsx bx, al;bx=FF82h,movsx ebx, al;ebx=FFFFFF82h,mov cx, 1000h;cx=1000h,movsx edx, cx;edx=00001000h,例,5-24,:,MOVSX,.data,x word 100,y word 200,result dword ?,.code,movsx eax, x,;,eax-x,movsx ebx, y,imul ebx,;乘法:,ax*y,mov result , eax;,存放乘积,用,32,位有符号乘法指令实现,16,位有符号数的乘法,.386,.model flat,stdcall,.stack,.data,X dword 5,Y dword 6,Z dword 7,W dword ?,例,5-25(1/2),:x+y+z,.code,start:,mov eax,X,add eax,Y,add eax,Z,mov W,eax,ret,end start,例,5-25(2/2),:x+y+z,例,5-26(1/3),:温度转换,;F = (9/5)*C + 32,.386,.MODEL FLAT,INCLUDE io32.h,.STACK 4096,.DATA,Prompt1 byte 0dh,0ah,byte Input Temputer C:,0,Answer byte 0dh,0ah,byte equal to F temputer:“,0,.CODE,start:,WriteString Prompt1,ReadSDecDword ax,imul ax,9 ; C*9,add ax,2,例,5-26(2/3),:温度转换,mov bx,5 ;,除数,cwd ;,被除数扩展,idiv bx ; C*9/5,add ax,32 ; C*9/5 + 32,WriteString Answer ;,显示结果,WriteSDecDword ax,ret,END START,例,5-26(3/3),:温度转换,5.3 位操作,位操作是指对操作数的某一位或某些位进行操作。,逻辑运算指令,位测试指令,位扫描指令,基本移位指令,循环移位指令,双精度移位指令,逻辑运算指令,逻辑运算指令用来对字或字节按位进行逻辑运算,逻辑与,AND,逻辑或,OR,逻辑非,NOT,逻辑异或,XOR,测试,TEST,逻辑与指令AND,对两个操作数执行逻辑与运算,结果送到目的操作数,AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,AND reg,imm/reg/mem,;regreg,imm/reg/mem,AND mem,imm/reg,;memmem,imm/reg,只有相“与”的两位都是,1,,结果才是,1,;否则,“与”的结果为,0,例,5-27,:逻辑与运算,mov al, 01000101b ; al=45h,and al, 00001111b ;45h0fh=05h,;CF=OF=0,;,SF=0,;,ZF=0,;,PF=1,逻辑与运算的应用,复位某些位,但不影响其他位。,这时只需将要置,0,的位同“,0,”相与,而维持不变的位同“,1,”相与就可以了。,实现编码的转换,小写字母转换为大写字母,数字字符,09,的,ASCII,码转换为数值,09,用来取,2,n,的余数,例,5-28,例,5-2,9,例,5-,30,例,5-,31,例,5-28:,清零,and bl, 01101111b,例,5-28,:,将,BL,中的,D,7,位和,D,4,位进行清零,其他位不变,例,5-29:,小写字母转换为大写字母,and al, 111011111h,;,例,5-30:,字符转换为数字,数字字符,09,的,ASCII,码转换为数值,09,:,mov al, 9;al=,数字字符,ASCII,码,and al, 0fh,;sub al, 30h,实现相同的功能,例,5-31,:求余,求,x mod 8,的指令序列:,mov edx, x,and edx, 00000007h,;edx=edx mod 8,5,逻辑或指令,OR,对两个操作数执行逻辑或运算,结果送到目的操作数,OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,OR reg,imm/reg/mem,;regreg,imm/reg/mem,OR mem,imm/reg,;memmem,imm/reg,只要相“或”的两位有一位是,1,,结果就是,1,;否则,结果为,0,例,5-32:,逻辑或运算,mov eax, 12345678h,;,eax=12345678h,or eax,0000ffffh,;,12345678h,0000ffffh=1234ffffh,;两条指令执行后:,;,eax =1234ffffh,,,CF=OF=0,;,SF=0,;,ZF=0,;,PF=0,。,逻辑或运算的应用,置位某些位,但不影响其他位。,这时只需将要置,1,的位同“,1,”相或,而维持不变的位同“,0,”相或就可以了。,实现编码的转换,大写字母转换为小写字母,数值,09,转换数字字符,09,例,5-,33:置1,;将,BL,中,D,0,和,D,3,置,1,,其余位不变,or bl,00001001b,例,5-,34:,大写字母转换为小写字母,or al, 00100000h,;将,D5,位置,1,例,5-3,5:数字转换为字符,将一位十进制数,09,转换为数字字符,09,的,ASCII,码:,mov al, 9,;al=一位十进制数,or al, 30h,;add al, 30h实现相同的功能,逻辑异或指令,XOR,对两个操作数执行逻辑异或运算,结果送到目的操作数,XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,XOR reg,imm/reg/mem,;regregimm/reg/mem,XOR mem,imm/reg,;memmemimm/reg,只有相“异或”的两位不相同,结果才是,1,;否则,结果为,0,例,5-36,:,逻辑异或运算,mov ax, 1234h,;,ax=1234h,xor ax, 00ffh,;,1234h,00ff h =12cbh,逻辑异或运算的应用,求反某些位,但不影响其他位。,这时只需将要求反的位同“,1,”异或,而维持不变的位同“0”异或就可以了。,清0,同时使CF也清0,实现编码的转换,大小写字母的相互转换,例,5-,37:,求反,;将,BL,中,D,0,和,D,3,求反,其余位不变,xor bl,00001001b,例,5-,38:,清,0,;将寄存器,EAX,清0,xor eax,eax,;eax=0,,,CF=OF=0,、,SF=0,、,ZF=1,、,PF=1,大小写转换,转换,AL,中字母的大小写只需一条指令:,xor al, 20h,逻辑非指令,NOT,对一个操作数执行逻辑非运算,NOT指令是一个单操作数指令,NOT指令不影响标志位,NOT reg/mem,;reg/mem,reg/mem,按位取反,原来是“,0”,的位变为“,1”,;原来是“,1”,的位变为“,0”,例,5-39,:逻辑非运算,mov al, 45h,;,al=01000101b,not al,;al=10111010b,;所有标志位都不变,测试指令,TEST,对两个操作数执行逻辑与运算,,结果不回送到目的操作数,AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,TEST reg,imm/reg/mem,;reg,imm/reg/mem,TEST mem,imm/reg,;mem,imm/reg,只有相“与”的两位都是,1,,结果才是,1,;否则,“与”的结果为,0,and和test,比较下面两条指令执行结果,:,and al, 0DFh,test al, 0DFh,位测试指令,对一个16位或32位的通用寄存器或存储器操作数中的指定二进制位进行必要的操作:,把指定位的值送给CF标志,对该位按指令要求进行操作。,位测试指令,BT,位测试并置位指令,BT,S,位测试并复位指令,BTR,位测试并取反指令,BTC,位测试指令,BT,将目的操作数中由源操作数指定的位送给,CF,标志。,位数从最右边开始,从,0,计数。,源操作数的大小不能超过目的操作数的长度。,BT对CF以外的其它标志位未定义,BT r16/m16, r16/i8,BT r32/m32, r32/i8,.data,var word 1234H,.code,mov eax, 2367h,mov ecx, 3,bt eax, 1,;测试,eax,的,D,1,位,,CF=1,bt eax, ecx,;测试,eax,的,D,3,位,,CF=0,bt var, cx ;测试var的D,3,位,CF=0,例,5-40,:,位测试指令,位测试并置位指令,BT,S,将目的操作数中由源操作数指定的位送给,CF,标志,并将目的操作数中该位置1,BTS对CF以外的其它标志位未定义,BTS r16/m16, r16/i8,BTS r32/m32, r32/i8,位测试并置位指令,BT,R,将目的操作数中由源操作数指定的位送给,CF,标志,并将目的操作数中该位置0.,BTR对CF以外的其它标志位未定义,BTR r16/m16, r16/i8,BTR r32/m32, r32/i8,位测试并置位指令,BTC,将目的操作数中由源操作数指定的位送给,CF,标志,并将目的操作数中该位求反.,BTC对CF以外的其它标志位未定义,BTC r16/m16, r16/i8,BTC r32/m32, r32/i8,.data,var word 1237h,.code,start:,mov eax, 2367h,mov ecx, 3,bts eax, ecx ; CF=0,并置eax的D3位为1,eax=236fh,bts var, 10 ; CF=0,并置var 的D10位为1,ax=2767h,btr ax, 1 ; CF=1,并将ax的D1位清0,al=65h,mov ecx, 20,btc eax, ecx,; CF=0,并将eax的D20位取反,eax=102367h,ret,例,5-41,:位测试指令,位扫描指令,对一个16位或32位的通用寄存器或存储器操作数进行扫描,将出现的第一个“1”的位置放入指定的寄存器中。,前向扫描指令,BSF,后向扫描指令,BSR,前向扫描指令,BSF,BSF对源操作数由低位到高位(前向)扫描,找到第一个“1”出现的位置,将该位的编号存入到目的操作数中。,如果源操作数是,0,,,ZF=1,;否则,ZF=0,。,对其它标志位无定义,BSF r16, r16/m16,BSF r32, r16/m32,后向扫描指令,BS,R,BSF对源操作数由高位到低位(后向)扫描,找到第一个“1”出现的位置,将该位的编号存入到目的操作数中。,如果源操作数是,0,,,ZF=1,;否则,ZF=0,。,对其它标志位无定义,BSR r16, reg/m16,BSR r32, reg/m32,.data,var word 1234h,.code,start:,mov eax, 76542368h,bsf ebx, eax ;ebx=3(eax的D3=1),ZF=0,bsf ax, var ;ax=2,ZF=0,bsr ax, var ;ax=12(var的D12=1),ZF=0,mov eax, 0,bsf ebx, eax;ZF=1,bsr ebx, eax ;ZF=1,例,5-42,:,位扫描指令,5.3.4,移位指令,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作,SHL reg/mem,1/CL/i8,;逻辑左移,最高位进入CF,最低位补0,SHR reg/mem,1/CL/i8,;逻辑右移,最低位进入CF,最高位补0,SAL reg/mem,1/CL/i8,;算术左移,最高位进入CF,最低位补0,SAR reg/mem,1/CL/i8,;算术右移,最低位进入CF,最高位不变,SAL与SHL相同,移位指令功能示意图,图5-1 移位指令的示意图,(a)逻辑/算术左移SHL/SAL,操作数,MSBLSB,0,CF,(b)逻辑右移SHR,操作数,MSBLSB,0,CF,(c)算术右移SAR,操作数,MSBLSB,CF,移位指令的操作数,移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元,后一个操作数表示移位位数,,该操作数,为1,,表示移动一位;当移位位数,大于1,时,在16位应用程序中用CL寄存器值表示,该操作数表达为,CL,在32位应用程序中仍可使用立即数表示。,移位指令对标志的影响,按照移入的位
展开阅读全文