汇编语言课程课件-第五章.ppt

上传人:牧羊曲112 文档编号:6439309 上传时间:2023-10-31 格式:PPT 页数:156 大小:521KB
返回 下载 相关 举报
汇编语言课程课件-第五章.ppt_第1页
第1页 / 共156页
汇编语言课程课件-第五章.ppt_第2页
第2页 / 共156页
汇编语言课程课件-第五章.ppt_第3页
第3页 / 共156页
汇编语言课程课件-第五章.ppt_第4页
第4页 / 共156页
汇编语言课程课件-第五章.ppt_第5页
第5页 / 共156页
点击查看更多>>
资源描述

《汇编语言课程课件-第五章.ppt》由会员分享,可在线阅读,更多相关《汇编语言课程课件-第五章.ppt(156页珍藏版)》请在三一办公上搜索。

1、第5章 数据操作,教学重点,数据传送算数运算位操作,5.1数据传送,数据传送是计算机中最基本、最重要的一种操作,由传送指令实现。除标志寄存器传送指令外,均不影响标志位,通用数据传送指令,通用数据传送指令包括MOVXCHGXLAT,传送指令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:

2、立即数传送,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;非法指令:05

3、0Ah为字,而AL为字节寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型,要小心段寄存器的操作,不允许立即数传送给段寄存器MOV DS,100H;非法指令:立即数不能传送段寄存器不允许直接改变CS值MOV CS,SI;不允许使用的指令不允许段寄存器之间的直接数据传送MOV DS,ES;非法指令:不允许段寄存器间传送,例5-2:寄存器传送,mov eax,ebx;eaxebxmov ah,al;ahalmov ebx,eax;DS:ebxeax,MOV,例5

4、-3:存储器传送,mov al,ebx;alds:ebxmov dx,ebp;dxss:ebpmov es,esi;esds:esi,不存在存储器向存储器的传送指令,MOV,继续,例5-4,;DA1单元的数据传送到DA2单元.dataDA1 dword 34567890hDA2 dword 12345678h.codemov eax,DA1;eaxDA1(将DA1内容送eax)mov DA2,eax;DA2eax;DA1、DA2实际表示直接寻址方式,MOV,例5-5:段寄存器传送,mov si,dsmov ax,esmov ds,ax,对段寄存器的操作有一些限制,MOV,交换指令XCHG(ex

5、change),把两个地方的数据进行互换,寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据,XCHG reg,reg/mem;reg reg/mem,例题5-7,例题5-6,例5-6:寄存器间交换,mov eax,12345678hmov ebx,9ABCDEF0hxchg eax,ebx;eax=9ABCDEF0h,ebx=12345678h xchg ax,bx;ax=5678h,bx=DEF0hxchg ah,al;ax=7856h,XCHG,.data b_da equ this bytew_da equ this wordda dword 100.

6、codexchg eax,da;双字交换;也可以表达为xchg da,eaxxchg ax,w_da;字交换;也可以表达为xchg w_da,axxchg al,b_da;字节交换;也可以表达为xchg b_da,al,例5-7:寄存器与存储器交换,XCHG,换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码表格首地址存放于EBX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码,3.换码指令XLAT(translate),将EBX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT,XLAT;alds:ebx+al,例题5-8,例5

7、-8(1/3):代码转换,;一位16进制数转换为ASCII码.386.MODEL FLAT,STDCALLinclude masm32includeio32.inc.stack,XLAT,继续,例5-8(2/3):代码转换,.dataASCII byte 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,41h,42h,43h,44h,45h,46hprompt byte input a number between:015,0dh,0ah,0,XLAT,继续,例5-8(3/3):代码转换,.codestart:mov ebx,offset ASCII;ebx存放

8、ASCII表的首地址WriteString promptReadUDecByte al;读入015之间的十进制数存放在al寄存器中xlat;换码al-ds:ebx+alWriteCrlf;显示回车换行WriteChar al;显示al中存放的字符retend start,XLAT,换码指令没有显式的操作数,但使用了EBX和AL;因为换码指令使用了隐含寻址方式采用默认操作数,返回,5.1.2 地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令 LEA指针传送指令 LDS和LES注意不是获取存储器单元的内容,有效地址传送指令LEA(load EA),将存储器操作数的有

9、效地址传送至指定的寄存器中。在实模式下,使用16位寄存器在保护模式下使用32位寄存器,LEA r16/r32,mem;r16mem的有效地址EA,LEA,例题5-8获取有效地址的指令:mov ebx,offset ASCII可以改写为:lea ebx,ASCII;EBX=offset ACII,获得主存单元的有效地址;不是物理地址,也不是该单元的内容 可以实现计算功能,指针传送指令,LDS r16,mem;r16mem,;DSmem+2实模式下,LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器。在保护模式下,LDS指令将主存中mem指定的前面4个字节送至32位寄存器,

10、并将mem的下一字送DS寄存器。,LES r16,mem;r16mem,;ESmem+2实模式下,LES指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器。在保护模式下,LES指令将主存中mem指定的前面4个字节送至32位寄存器,并将mem的下一字送DS寄存器。,例题5-9,例5-9:地址指针传送,fvar fword 0;定义地址指针fvarmov dword ptr fvar,offset ASCII;将ASCII偏移地址存入fvar的前两个字mov word ptr fvar+4,DS;将ASCII所在数据段DS的值存入fvar的后面一个字lds esi,fvar;将f

11、var中存放的前两个字装入esi,后一个字装入ds,fvar指定主存的连续6个字节作为逻辑地址(48位的地址指针),送入DS:r32或ES:r32,Windows2000/XP环境下的应用程序一般不使用地址指针传送指令,因为这种操作可能会造成系统崩溃。,例5-10(1/4):数据传送的综合实例,.386.model flat,stdcall.dataval1 WORD 1000hval2 WORD 2000harrayB BYTE 10h,20h,30h,40h,50harrayW WORD 100h,200h,300harrayD DWORD 10000h,20000h,例5-10(2/4)

12、:数据传送的综合实例,.codestart:;内存与内存之间的数据交换mov ax,val1;AX=1000hxchg ax,val2;AX=2000h,val2=1000hmov val1,ax;val1=2000h,例5-10(3/4):数据传送的综合实例,;字节数组访问mov al,arrayB;AL=10hmov al,arrayB+1;AL=20hmov al,arrayB+2;AL=30h;字数组访问mov ax,arrayW;AX=100hmov ax,arrayW+2;AX=200h,例5-10(4/4):数据传送的综合实例,;双字数组访问mov eax,arrayD;EAX=

13、10000hmov eax,arrayD+4;EAX=20000hmov eax,arrayD+TYPE arrayD;EAX=20000hEND start,调试,例5-11:移位64位数据,分析:为保证数据各位正确移位,64位数据的8个字节应从高 字节开始、依右而左依次左 移8位(一个字节),采用字 节传送指令。,例5-11(1/3):移位64位数据,.386.model flat,stdcall.stack.dataqvar qword,例5-11(2/3):移位64位数据,.codestart:mov al,byte ptr qvar6mov byte ptr qvar7,almov

14、al,byte ptr qvar5mov byte ptr qvar6,almov al,byte ptr qvar4mov byte ptr qvar5,almov al,byte ptr qvar3mov byte ptr qvar4,al,例5-11(3/3):移位64位数据,mov al,byte ptr qvar2mov byte ptr qvar3,almov al,byte ptr qvar1mov byte ptr qvar2,almov al,byte ptr qvar0mov byte ptr qvar1,almov byte ptr qvar0,0retend start

15、,示意图,例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 加法指令,执行双字,字或字节的加法运算。ADDADCINC,加法指令ADD,ADD指令将源与目的操作数相加,结果送到目的操作数ADD指令按状态标志的定义相应设置,ADD reg,imm/reg/mem;regregimm/reg/memADD mem,imm/reg;memmemimm/reg,例题

16、5-12,.data var1 dword 10000hvar2 dword 2000h.codestart:mov al,0fbh;al=0fbhadd al,07h;al=02hmov eax,var1;eax=10000hadd eax,var2;eax=12000hret,例5-12:加法运算,返回,设置标志位,ADD指令按照状态标志的定义相应设置标志位的0或1状态。在07+FBH02H运算后:标志寄存器的内容为00000213h,对应的OF=0、SF=0、ZF=0、AF=1、PF=0、CF=1在10000h+20000h=30000h运算后,标志寄存器Fl的内容为00000206h,

17、对应的OF=0、SF=0、ZF=0、AF=0、PF=1、CF=0。,注意,PF仅反映低8位中“1”的个数,AF只反映D3对D4位是否有进位。,大小写字符转换,加法指令也能用作其它的用途,比如大小写字母的转换。大写字母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标志,结果

18、送到目的操作数ADC指令按状态标志的定义相应设置ADC指令主要与ADD配合,实现多精度加法运算,ADC reg,imm/reg/mem;regregimm/reg/memCFADC mem,imm/reg;memmemimm/regCF,例题5-14a,.386.model flat,stdcall.stack 4096.datadvar1 dword 82347856h,67783000hdvar2 dword 12348998h,67762000hdvar3 dword 2 dup(?),例5-14a(1/2):无符号64位二进制加法运算,继续,.codestart:mov ebx,0mo

19、v esi,4mov eax,dvar1ebxadd eax,dvar2ebxmov dvar3bx,eaxmov eax,dvar1ebxesiadc eax,dvar2ebxesimov dvar3ebxesi,eaxretend start,例5-14a(2/2):无符号64位二进制加法运算,返回,增量指令INC(increment),INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志,INC reg/mem;reg/memreg/mem1,inc ebxinc byte ptrebx,例题5-14b,.386.model flat,stdcall.sta

20、ck 4096.datadvar1 dword 82347856h,67783000hdvar2 dword 12348998h,67762000hdvar3 dword 2 dup(?),例5-14b(1/3):无符号64位二进制加法运算,继续,修改例题5-11a的代码段,实现同样的功能,.codestart:mov ebx,0mov esi,0mov eax,dvar1ebxesi*4add eax,dvar2ebxesi*4mov dvar3bxesi*4,eax,例5-14b(2/3):无符号64位二进制加法运算,继续,inc esimov eax,dvar1ebxesi*4adc e

21、ax,dvar2ebxesi*4mov dvar3ebxesi*4,eaxretend start,例5-14b(3/3):无符号64位二进制加法运算,返回,5.2.2 减法指令,SUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志,SUB reg,imm/reg/mem;regregimm/reg/memSUB mem,imm/reg;memmemimm/reg,例5-15(1/2):减法运算,.datavar1 dword 10000hvar2 dword 2000h.codestart:mov al,0fbh;al=0fbhsub al,07h;al=

22、f4h,EFLAGS=00000282h,SUB,例5-15(2/2):减法运算,mov eax,var1;eax=10000hsub eax,var2;eax=0000e000h;EFLAGS=00000206hret,SUB,SUB指令设置标志位的状态,SUB指令按照状态标志的定义相应设置标志位的状态。在0fbh-07hf4h运算后:标志寄存器的内容为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。,

23、例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/memCFSBB mem,imm/reg;memmemimm/regCF,例题5.17,.386.model

24、flat,stdcall.stack 4096.datadvar1 dword 82347856h,67783000hdvar2 dword 12348998h,67762000hdvar3 dword 2 dup(?),例5-17(1/3):无符号64位二进制减法运算,继续,.codestart:mov ebx,0mov esi,4mov eax,dvar1ebxsub eax,dvar2ebxmov dvar3bx,eax,例5-17(2/3):无符号64位二进制减法运算,继续,mov eax,dvar1ebxesisbb eax,dvar2ebxesimov dvar3ebxesi,ea

25、xretend start,例5-17(3/3):无符号64位二进制减法运算,返回,减量指令DEC(decrement),DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志,DEC,DEC reg/mem;reg/memreg/mem1,dec ecxdec word ptr esi,INC指令和DEC指令都是单操作数指令 主要用于对计数器和地址指针的调整,求补指令NEG(negative),NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样,NEG,N

26、EG reg/mem;reg/mem0reg/mem,例题5-18,.386.MODEL FLAT,STDCALLinclude masm32includeio32.inc.stack.codestart:mov eax,-100neg eaxWriteSDecDword eaxretend start,例5-18:求一个数的相反数,比较指令CMP(compare),CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志CMP指令执行的功能与SUB指令,但结果不回送目的操作数,CMP reg,imm/reg/mem;regimm/reg/memCMP mem,imm/reg;memimm

27、/reg,5.2.3 乘法指令,乘法指令用来实现两个二进制操作数的相乘运算。无符号数乘法指令MUL有符号数乘法指令IMUL。,无符号数乘法指令MUL,MUL指令执行无符号二进制数的乘法运算。,MUL r8/m8;无符号字节乘:AXALr8/m8MUL r16/m16;无符号字乘:;DX.AXAXr16/m16MUL r32/m32;无符号双字乘:;EDX.EAXEAXr32/m32,例5-19,.386.MODEL FLAT,STDCALLinclude masm32includeio32.inc.stack.data prompt3 byte 0dh,0ah,x*y=,0 x word 0F

28、FFEh y word 001Eh result dword?,例5-19(1/2):16位无符号数乘法,继续,.codestart:mov ax,x;ax-x,mul y;乘法:ax*ymov word ptr result,ax;存放乘积的低字部分mov word ptr result+2,dx;存放乘积的高字部分WriteString prompt3WriteHexDword result;显示乘积retend start,例5-19(2/2):,返回,有符号数乘法指令IMUL,IMUL指令执行无符号二进制数的乘法运算。,IMUL r8/m8;有符号字节乘:AXALr8/m8IMUL r

29、16/m16;有符号字乘:DX.AXAXr16/m16IMUL r32/m32;有符号双字乘:;EDX.EAXEAXr32/m32,乘法指令对标志的影响,乘法指令如下影响OF和CF标志:MUL指令若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1IMUL指令若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1乘法指令对其他状态标志没有定义,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)对标志没有影响:指令执行不改变标志状态,IMUL的其他格式,IMUL r16,r16/m16/i8/i16;有符号字乘:r16r16r16/m16/

30、i8/i16IMUL r32,r32/m32/i8/i16/i32;有符号双字乘:;r32r32r32/m32/i32/i16/i8IMUL r16,r16/m16,i8/i16;有符号字乘:r16r16/m16*/i8/i16IMUL r32,r32/m32,i8/i32;有符号双字乘:r32r32/m32*/i8/i32,imul eax,ebx,2;eax-ebx*2,;x=FFFE,y=001E mov ax,x;ax-x,mul y;乘法:ax*ymov word ptr result,axmov word ptr result+2,dx;result=1DFFC4 mov ax,x

31、;ax-x,imul y;乘法:ax*ymov word ptr result,axmov word ptr result+2,dx;result=FFFFFFC4,MUL与IMUL,5.2.4 除法指令,除法指令执行两个二进制数的除法运算无符号二进制数除法指令DIV有符号二进制数除法指令IDIV两条指令除法指令使状态标志没有定义。,无符号二进制数除法指令DIV,DIV r8/m8;无符号字节除:ALAXr8/m8的商,;AHAXr8/m8的余数DIV r16/m16;无符号字除:AXDX.AXr16/m16的商,;DXDX.AXr16/m16的余数DIV r32/m32;无符号字除:EAXE

32、DX.EAXr32/m32的商,;EDXEDX.EAXr16/m32的余数,有符号数除法指令IDIV,IDIV r8/m8;无符号字节除:ALAXr8/m8的商,;AHAXr8/m8的余数IDIV r16/m16;无符号字除:AXDX.AXr16/m16的商,;DXDX.AXr16/m16的余数IDIV r32/m32;无符号字除:EAXEDX.EAXr32/m32的商,;EDXEDX.EAXr16/m32的余数,;x=FFFE,y=001E mov ax,x;ax-x,mov dx,0div y;除法:axy;ax=0888,dx000E mov ax,x;ax-x,mov dx,0idiv

33、 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

34、,或者在字节除时商超过8位,或者在字除时商超过16位,或者在双字除时商超过32位,则发生除法溢出。对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,或者在双字除时商不在-2322321范围内,则发生除法溢出。,例题,除法溢出,mov ax,20000mov bl,10div bl;20000102000;商在AL中放不下,产生溢出mov dx,0mov ax,20000mov bx,10div bx;20000102000;商在AX中可以放下,不产生溢出,返回,.386.MODEL FLAT,STDCALLinclude mas

35、m32includeio32.inc.stack.data prompt3 byte 0dh,0ah,quation=,0prompt4 byte remainder=,0 x word fffehy word 001ehremainder word?quation word?,例5-20(1/2):16位无符号数除法,继续,.codestart:mov ax,x;ax-x,mov dx,0div y;除法:axyWriteString prompt3WriteHexWord ax;显示商WriteString prompt4WriteHexWord dx;显示余数retend start,例

36、5-20(2/2):16位无符号数除法,返回,5.2.5 符号扩展指令,什么是符号扩展符号扩展指令常用于获得倍长的数据,不影响标志位,字节转换为字指令CBW 字转换为双字指令CWD 字转换为双字指令CWDE 双字转换为四个字指令CDQ 无符号扩展传送指令MOVZX 有符号扩展传送指令MOVSX,符号扩展的概念,符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)对于数据ff00H(表示有符号数256),其最

37、高位D15为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,

38、;x=FFFE,y=001E mov ax,x;ax-x,mov dx,0idiv y;除法:axymov ax,x;ax-x,cwdidiv y;除法:axy,修改例520,字转换为双字指令CWDE,CWDE;AX的符号扩展至EAX;如AX的最高有效位是0,则EAX的高字00;AX的最高有效位为1,则EAX的高字FFH。AX不变,计算有符号数EBX与AX内容之和cwdeadd ebx,eax,注意,不能直接把EBX和AX内容相加:add ebx,ax;非法指令,;因为两个操作数类型不一致,双字转换为四个字指令CDQ,CDQ;EAX符号扩展成EDX.EAX;如EAX的最高有效位是0,则EDX0

39、0;EAX的最高有效位为1,则EDXFFFFH。EAX不变,例5-22:计算有符号数xy.data x dword 34567y dword 567.codemov eax,xcdq;被除数扩展到edx.eaxidiv y,无符号扩展传送指令MOVZX,MOVZX r16/r32,r8/r16/m8/m16;r16/r32r8/r16/m8/m16,MOVZX指令把一个字节或者字操作数从源地址传送至目的地址,高位不足的部分用零填充,它实现的功能是将一个无符号的整数从8位扩展到16位,从16位扩展到32位,并且保持数值不变。,mov al,82h;al=82hmovzx bx,al;bx=008

40、2hmovzx ebx,al;ebx=00000082hmov cx,1000h;cx=1000hmovzx edx,cx;edx=00001000h,例5-23:MOVZX,movzx eax,x;eax-x,movzx ebx,ymul ebx;乘法:ax*ymov result,eax;存放乘积,修改例5-19,有符号扩展传送指令MOVSX,MOVSX r16/r32,r8/r16/m8/m16;r16/r32r8/r16/m8/m16,MOVSX指令把一个字节或者字操作数从源地址传送至目的地址,高位不足的部分用源操作数的符号位填充,它实现的功能是将一个无符号的整数从8位扩展到16位,从

41、16位扩展到32位,并且保持数值不变。,mov al,82h;al=82hmovsx bx,al;bx=FF82hmovsx ebx,al;ebx=FFFFFF82hmov cx,1000h;cx=1000hmovsx edx,cx;edx=00001000h,例5-24:MOVSX,.datax word 100y word 200result dword?.codemovsx eax,x;eax-x,movsx ebx,yimul ebx;乘法:ax*ymov result,eax;存放乘积,用32位有符号乘法指令实现16位有符号数的乘法,.386.model flat,stdcall.s

42、tack.dataX dword 5Y dword 6Z dword 7W dword?,例5-25(1/2):x+y+z,.codestart:mov eax,Xadd eax,Yadd eax,Zmov W,eaxretend start,例5-25(2/2):x+y+z,例5-26(1/3):温度转换,;F=(9/5)*C+32,.386.MODEL FLATINCLUDE io32.h.STACK 4096.DATA Prompt1 byte 0dh,0ah,byte Input Temputer C:,0Answer byte 0dh,0ah,byte equal to F temp

43、uter:“,0,.CODE start:WriteString Prompt1 ReadSDecDword aximul ax,9;C*9add ax,2,例5-26(2/3):温度转换,mov bx,5;除数cwd;被除数扩展idiv bx;C*9/5add ax,32;C*9/5+32WriteString Answer;显示结果WriteSDecDword axretEND START,例5-26(3/3):温度转换,5.3 位操作,位操作是指对操作数的某一位或某些位进行操作。逻辑运算指令位测试指令位扫描指令基本移位指令循环移位指令双精度移位指令,逻辑运算指令,逻辑运算指令用来对字或字

44、节按位进行逻辑运算逻辑与AND逻辑或 OR逻辑非NOT逻辑异或XOR测试TEST,逻辑与指令AND,对两个操作数执行逻辑与运算,结果送到目的操作数,AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,例5-27:逻辑与运算,mov al,01000101b;al=45hand al,00001111b;45h0fh=05h;CF=OF=0;SF=0;ZF=0;PF=1,逻辑与运算的应用,复位某些位,但不影响其他位。这时只需将要置0的位同“0”相与,而维持不变的位同“1”相与就可以了。实现编码的转换 小写字

45、母转换为大写字母 数字字符09的ASCII码转换为数值09 用来取2n的余数,例5-28,例5-29,例5-30,例5-31,例5-28:清零,and bl,01101111b,例5-28:将BL中的D7位和D4位进行清零,其他位不变,例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,xand edx,00000007h;edx=edx

46、mod 85,逻辑或指令OR,对两个操作数执行逻辑或运算,结果送到目的操作数,OR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,例5-32:逻辑或运算,mov eax,12345678h;eax=12345678hor eax,0000ffffh;12345678h0000ffffh=1234ffffh;两条指令执行后:;eax=1234ffffh,CF=OF=0;SF=0;ZF=0;PF=0。,逻辑或运算的应用,置位某些位,但不影响其他位。这时只需将要置1的位同“1”相或,而维持不变的位同“0”相或就可以了

47、。实现编码的转换 大写字母转换为小写字母 数值09转换数字字符09,例5-33:置1,;将BL中D0和D3置1,其余位不变or bl,00001001b,例5-34:大写字母转换为小写字母,or al,00100000h;将D5位置1,例5-35:数字转换为字符,将一位十进制数09转换为数字字符09的ASCII码:,mov al,9;al=一位十进制数or al,30h;add al,30h实现相同的功能,逻辑异或指令XOR,对两个操作数执行逻辑异或运算,结果送到目的操作数,XOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“异或”的两位不相同,结果才是1;

48、否则,结果为0,例5-36:逻辑异或运算,mov ax,1234h;ax=1234hxor ax,00ffh;1234h00ff h=12cbh,逻辑异或运算的应用,求反某些位,但不影响其他位。这时只需将要求反的位同“1”异或,而维持不变的位同“0”异或就可以了。清0,同时使CF也清0 实现编码的转换 大小写字母的相互转换,例5-37:求反,;将BL中D0和D3求反,其余位不变 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,

49、20h,逻辑非指令NOT,对一个操作数执行逻辑非运算,NOT指令是一个单操作数指令NOT指令不影响标志位,NOT reg/mem;reg/memreg/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未定义,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,and和test,比较下面两条指

50、令执行结果:and al,0DFhtest al,0DFh,位测试指令,对一个16位或32位的通用寄存器或存储器操作数中的指定二进制位进行必要的操作:把指定位的值送给CF标志对该位按指令要求进行操作。位测试指令 BT 位测试并置位指令 BTS位测试并复位指令 BTR 位测试并取反指令 BTC,位测试指令 BT,将目的操作数中由源操作数指定的位送给CF标志。,位数从最右边开始,从0计数。源操作数的大小不能超过目的操作数的长度。BT对CF以外的其它标志位未定义,BT r16/m16,r16/i8,BT r32/m32,r32/i8,.datavar word 1234H.codemov eax,2

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号