《汇编语言课程课件》由会员分享,可在线阅读,更多相关《汇编语言课程课件(156页珍藏版)》请在金锄头文库上搜索。
1、郑州大学 计算机系 穆玲玲 32位汇编语言程序设计教学重点教学重点数据传送数据传送算数运算算数运算位操作位操作郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.15.1数据传送数据传送 数据传送是计算机中最基本、最重要数据传送是计算机中最基本、最重要的一种操作的一种操作, ,由传送指令实现。由传送指令实现。除标志寄存器传送指令外,均除标志寄存器传送指令外,均不影响不影响标志标志位位郑州大学 计算机系 穆玲玲 32位汇编语言程序设计通用数据传送指令通用数据传送指令 通用数据传送指令包括通用数据传送指令包括qMOVqXCHGqXLAT郑州大学 计算机系 穆玲玲 32位汇编语言程序设计传送指令传
2、送指令MOV(move)把一个字节,字或者双字的操作数从把一个字节,字或者双字的操作数从源地址传送至目的地址源地址传送至目的地址MOV reg/mem,immMOV reg/mem,imm;立即数送寄存器或主存;立即数送寄存器或主存例题例题5-1MOV reg/mem/seg,regMOV reg/mem/seg,reg;寄存器送(段)寄存器或主存;寄存器送(段)寄存器或主存例题例题5-2MOV reg/seg,memMOV reg/seg,mem;主存送(段)寄存器;主存送(段)寄存器例题例题5-3MOV reg/mem,segMOV reg/mem,seg;段寄存器送寄存器或主存;段寄存器
3、送寄存器或主存例题例题5-5郑州大学 计算机系 穆玲玲 32位汇编语言程序设计交换指令交换指令XCHG(exchange)把两个地方的数据进行互换把两个地方的数据进行互换寄存器与寄存器之间对换数据寄存器与寄存器之间对换数据寄存器与存储器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据不能在存储器与存储器之间对换数据XCHG reg,reg/memXCHG reg,reg/mem;reg reg reg/memreg/mem例题例题5-7例题例题5-6郑州大学 计算机系 穆玲玲 32位汇编语言程序设计换码指令执行前:换码指令执行前:在主存建立一个在主存建立一个字节量表格字节
4、量表格,内含要转换成的目的代码,内含要转换成的目的代码表格首地址表格首地址存放于存放于E EBXBX,ALAL存放相对表格首地址的存放相对表格首地址的位移量位移量换码指令执行后:换码指令执行后:将将ALAL寄存器的内容转换为寄存器的内容转换为目标代码目标代码3. 换码指令换码指令XLAT(translate)将将EBX指定的缓冲区中、指定的缓冲区中、AL指定的位指定的位移处的一个字节数据取出赋给移处的一个字节数据取出赋给ALXLATXLATXLATXLAT;alds:ebx+alalds:ebx+al例题例题5-8郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.1.2 地址传送指令地址传
5、送指令地址传送指令将存储器单元的逻辑地址传送指令将存储器单元的逻辑地址送至指定的寄存器地址送至指定的寄存器q有效地址传送指令有效地址传送指令 LEAq指针传送指令指针传送指令 LDS和和LES注意不是获取存储器单元的内容注意不是获取存储器单元的内容郑州大学 计算机系 穆玲玲 32位汇编语言程序设计有效地址传送指令有效地址传送指令LEA(load EA)将存储器操作数的有效地址传送至将存储器操作数的有效地址传送至指定的寄存器中。指定的寄存器中。q在实模式下,使用在实模式下,使用16位寄存器位寄存器q在保护模式下使用在保护模式下使用32位寄存器位寄存器LEA r16/r32,memLEA r16/
6、r32,mem;r16memr16mem的有效地址的有效地址EAEALEALEA郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例题例题5-8获取有效地址的指令:获取有效地址的指令:mov ebx, offset ASCIImov ebx, offset ASCII可以改写为:可以改写为:lea ebx,ASCII; lea ebx,ASCII; E EBX=offset ACIIBX=offset ACII 获获得得主主存存单单元元的的有有效效地地址址;不不是是物物理理地地址,也不是该单元的内容址,也不是该单元的内容 可以实现计算功能可以实现计算功能指针传送指令指针传送指令LDS r16,
7、memLDS r16,mem;r16memr16mem,;DSmem+2DSmem+2n实实模模式式下下,LDS指指令令将将主主存存中中mem指指定定的的字字送送至至r16,并并将将mem的的下下一一字字送送DS寄存器。寄存器。n在在保保护护模模式式下下,LDS指指令令将将主主存存中中mem指指定定的的前前面面4个个字字节节送送至至32位位寄寄存存器器,并并将将mem的的下下一一字字送送DS寄寄存器存器。LES r16,memLES r16,mem;r16memr16mem,;ESmem+2ESmem+2n实实模模式式下下,LES指指令令将将主主存存中中mem指指定定的的字字送送至至r16,并
8、并将将mem的的下下一一字字送送DS寄存器。寄存器。n在在保保护护模模式式下下,LES指指令令将将主主存存中中mem指指定定的的前前面面4个个字字节节送送至至32位位寄寄存存器器,并并将将mem的的下下一一字字送送DS寄存器寄存器。例题例题5-9例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):数据传
9、送的综合实例 .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 = 20
10、0h例5-10(4/4):数据传送的综合实例 ; 双字数组访问双字数组访问mov eax,arrayD; EAX = 10000hmov eax,arrayD+4; EAX = 20000hmov eax,arrayD+TYPE arrayD; EAX = 20000hEND start郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-115-11:移位:移位6464位数据位数据分分析析:为为保保证证数数据据各各位位正正确确移移位位, 64位位数数据据的的8个个字字节节应应从从高高 字字节节开开始始、依依右右而而左左依依次次左左 移移8位位(一一个个字字节节),采采用用字字 节传送指令
11、。节传送指令。郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-11示意图示意图12 34 56 78 87 65 43 2112 34 56 78 87 65 430郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.2 5.2 算术运算算术运算 算术运算是算术运算是IA-32指令系统中另外指令系统中另外一种基本的操作指令,可以用来执一种基本的操作指令,可以用来执行字节,字或双字的二进制加减乘行字节,字或双字的二进制加减乘除算术运算。除算术运算。这类指令会根据计算结果设置相应这类指令会根据计算结果设置相应的标志位。的标志位。 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.2
12、.1 5.2.1 加法指令加法指令 执行双字,字或字节的加法运算。执行双字,字或字节的加法运算。q ADDqADCqINC 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计加法指令加法指令ADD ADD ADD指令将源与目的操作数相加,结指令将源与目的操作数相加,结果送到目的操作数果送到目的操作数ADD指令按状态标志的定义相应设置指令按状态标志的定义相应设置ADD reg,imm/reg/memADD reg,imm/reg/mem;regregregregimm/reg/memimm/reg/memADD mem,imm/regADD mem,imm/reg;memmemmemmemimm
13、/regimm/reg例题例题5-12郑州大学 计算机系 穆玲玲 32位汇编语言程序设计设置标志位设置标志位 ADD指令按照状态标志的定义相应设指令按照状态标志的定义相应设置标志位的置标志位的0或或1状态。状态。q在在07+FBH02H运算后:标志寄存器的运算后:标志寄存器的内容为内容为00000213h,对应的,对应的OF=0、SF=0、ZF=0、AF=1、PF=0、CF=1q在在10000h+20000h=30000h运算后,运算后,标志寄存器标志寄存器Fl的内容为的内容为00000206h,对,对应的应的OF=0、SF=0、ZF=0、AF=0、PF=1、CF=0。 注注意意,PF仅仅反反
14、映映低低8位位中中“1”的的个个数数,AF只反映只反映D3对对D4位是否有进位。位是否有进位。 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计大小写字符转换大小写字符转换 加法指令也能用作其它的用途,比如加法指令也能用作其它的用途,比如大小写字母的转换。大小写字母的转换。 q大写字母大写字母AZ的的ASCII码是码是41h5ahq小写字母小写字母az的的ASCII码是码是61h7ahq它们之间相差它们之间相差20h要将大写字母转换为相应的小写字母要将大写字母转换为相应的小写字母只需要加上只需要加上20h即可。即可。 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计带进位加法指令带进位加法
15、指令ADC ADC ADC指令将源与目的操作数相加,再加上进指令将源与目的操作数相加,再加上进位位CF标志,结果送到目的操作数标志,结果送到目的操作数ADC指令按状态标志的定义相应设置指令按状态标志的定义相应设置ADC指令主要与指令主要与ADD配合,实现多精度加法配合,实现多精度加法运算运算ADC reg,imm/reg/memADC reg,imm/reg/mem;regregregregimm/reg/memimm/reg/memCFCFADC mem,imm/regADC mem,imm/reg;memmemmemmemimm/regimm/regCFCF例题例题5-14a郑州大学 计算
16、机系 穆玲玲 32位汇编语言程序设计增量指令增量指令INC(increment)INC指令对操作数加指令对操作数加1(增量)(增量)INC指令不影响进位指令不影响进位CF标志,按定义标志,按定义设置其他状态标志设置其他状态标志INC reg/memINC reg/mem;reg/memreg/memreg/memreg/mem1 1inc ebxinc ebxinc byte ptrebx 例题例题5-14b郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.2.2 5.2.2 减法指令减法指令 SUB指令将目的操作数减去源操作数,指令将目的操作数减去源操作数,结果送到目的操作数结果送到目的
17、操作数SUB指令按照定义相应设置状态标志指令按照定义相应设置状态标志SUB reg,imm/reg/memSUB reg,imm/reg/mem;regregregregimm/reg/memimm/reg/memSUB mem,imm/regSUB mem,imm/reg;memmemmemmemimm/regimm/reg郑州大学 计算机系 穆玲玲 32位汇编语言程序设计SUBSUB指令设置标志位的状态指令设置标志位的状态 SUB指指令令按按照照状状态态标标志志的的定定义义相相应应设设置置标标志位的状态。志位的状态。q在在0fbh-07hf4h运运算算后后:标标志志寄寄存存器器的的内内容容
18、为为00000282h,对对应应的的OF=0、SF=1、ZF=0、AF=0、PF=1、CF=0。q在在10000h-2000h=e000h运运算算后后,标标志志寄寄存存器器Fl的的内内容容为为00000206h,对对应应的的OF=0、SF=0、ZF=0、AF=0、PF=1、CF=0。郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-16 小写字母转换为大写字母小写字母转换为大写字母减法指令也能用于大小写字母的转换。减法指令也能用于大小写字母的转换。分分析析:要要将将小小写写字字母母转转换换为为相相应应的的大大写字母只需要减去写字母只需要减去20h即可。即可。mov al,a;al=61
19、h(a的的ASCII码)码)sub al, 20h;al=41h(A的的ASCII码)码)郑州大学 计算机系 穆玲玲 32位汇编语言程序设计带借位减法指令带借位减法指令SBBSBB指令将目的操作数减去源操作数,再减指令将目的操作数减去源操作数,再减去借位去借位CF(进位),结果送到目的操作数。(进位),结果送到目的操作数。SBB指令按照定义相应设置状态标志指令按照定义相应设置状态标志SBB指令主要与指令主要与SUB配合,实现多精度减法配合,实现多精度减法运算运算SBB reg,imm/reg/memSBB reg,imm/reg/mem;regregregregimm/reg/memimm/r
20、eg/memCFCFSBB mem,imm/regSBB mem,imm/reg;memmemmemmemimm/regimm/regCFCF例题例题5.17郑州大学 计算机系 穆玲玲 32位汇编语言程序设计减量指令减量指令DEC(decrement)DEC指令对操作数减指令对操作数减1(减量)(减量)DEC指令不影响进位指令不影响进位CF标志,按定义标志,按定义设置其他状态标志设置其他状态标志DECDECDEC reg/memDEC reg/mem;reg/memreg/memreg/memreg/mem1 1dec ecxdec ecxdec word ptr esidec word pt
21、r esi INC指令和指令和DEC指令都是单操作数指令指令都是单操作数指令 主要用于对计数器和地址指针的调整主要用于对计数器和地址指针的调整郑州大学 计算机系 穆玲玲 32位汇编语言程序设计求补指令求补指令NEG(negative)NEG指令对操作数执行求补运算:用指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按求补运算也可以表达成:将操作数按位取反后加位取反后加1NEG指令对标志的影响与用零作减法指令对标志的影响与用零作减法的的SUB指令一样指令一样NEGNEGNEG reg/memNEG reg/mem;reg/
22、mem0reg/mem0reg/memreg/mem例题例题5-18郑州大学 计算机系 穆玲玲 32位汇编语言程序设计比较指令比较指令CMP(compare)CMP指令将目的操作数减去源操作数,指令将目的操作数减去源操作数,按照定义相应设置状态标志按照定义相应设置状态标志CMP指令执行的功能与指令执行的功能与SUB指令,但指令,但结果不回送目的操作数结果不回送目的操作数CMP reg,imm/reg/memCMP reg,imm/reg/mem;regregimm/reg/memimm/reg/memCMP mem,imm/regCMP mem,imm/reg;memmemimm/regimm
23、/reg郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.2.3 5.2.3 乘法指令乘法指令 乘法指令用来实现两个二进制操作乘法指令用来实现两个二进制操作数的相乘运算数的相乘运算 。q无符号数乘法指令无符号数乘法指令MULq有符号数乘法指令有符号数乘法指令IMUL。 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计无符号数乘法指令无符号数乘法指令MUL MUL指令执行无符号二进制数的乘法指令执行无符号二进制数的乘法运算运算 。MUL r8/m8MUL r8/m8; ;无符号字节乘:无符号字节乘:AXALr8/m8AXALr8/m8MUL r16/m16MUL r16/m16; ;无符号
24、字乘:无符号字乘:; DX.AXAXr16/m16; DX.AXAXr16/m16MUL r32/m32MUL r32/m32; ;无符号双字乘:无符号双字乘:; EDX.EAXEAXr32/m32; EDX.EAXEAXr32/m32郑州大学 计算机系 穆玲玲 32位汇编语言程序设计有符号数乘法指令有符号数乘法指令IMULIMUL IMULIMUL指令执行无符号二进制数的乘法指令执行无符号二进制数的乘法运算运算 。IMUL r8/m8IMUL r8/m8; ;有符号字节乘:有符号字节乘:AXALr8/m8AXALr8/m8IMUL r16/m16IMUL r16/m16 ; ;有符号字乘:有
25、符号字乘:DX.AXAXr16/m16DX.AXAXr16/m16IMUL r32/m32IMUL r32/m32 ; ;有符号双字乘:有符号双字乘:; EDX.EAXEAXr32/m32; EDX.EAXEAXr32/m32郑州大学 计算机系 穆玲玲 32位汇编语言程序设计IMUL的其他格式的其他格式IMUL r16,r16/m16/i8/i16;有符号字乘:有符号字乘:r16r16r16/m16/i8/i16IMUL r32,r32/m32/i8/i16/i32;有符号双字乘:有符号双字乘:; ;r32r32r32/m32/i32/i16/i8IMUL r16,r16/m16,i8/i16
26、;有符号字乘:有符号字乘:r16r16/m16*/i8/i16IMUL r32,r32/m32,i8/i32;有符号双字乘:有符号双字乘:r32r32/m32*/i8/i32imul 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;ax-x,imul y ;乘法:乘法:ax*ymov word ptr result , axmov word ptr result+2,
27、dx;result=FFFFFFC4 MUL与IMUL郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.2.4 5.2.4 除法指令除法指令 除法指令执行两个二进制数的除法除法指令执行两个二进制数的除法运算运算q无符号二进制数除法指令无符号二进制数除法指令DIVq有符号二进制数除法指令有符号二进制数除法指令IDIV两条两条指令指令除法指令使状态标志没有定义。除法指令使状态标志没有定义。 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计无符号二进制数除法指令无符号二进制数除法指令DIVDIV r8/m8;无符号字节除:无符号字节除:ALAXr8/m8的商,的商,;AHAXr8/m8的余数的
28、余数DIV r16/m16;无符号字除:无符号字除:AXDX.AXr16/m16的商,的商,;DXDX.AXr16/m16的余数的余数DIV r32/m32;无符号字除:无符号字除:EAXEDX.EAXr32/m32的商,的商,;EDXEDX.EAXr16/m32的余数的余数郑州大学 计算机系 穆玲玲 32位汇编语言程序设计有符号数除法指令有符号数除法指令IDIV IDIV r8/m8;无符号字节除:无符号字节除:ALAXr8/m8的商,的商,;AHAXr8/m8的余数的余数IDIV r16/m16;无符号字除:无符号字除:AXDX.AXr16/m16的商,的商,;DXDX.AXr16/m16
29、的余数的余数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 y ;除法:除法:axy; ax=0888,dx000E,错误,错误DIV与IDIV郑州大学 计算机系 穆玲玲 32位汇编语言程序设计除法指令的功能除法指令的功能除法指令分无符号和有符号除法指令除法指令分无符号和有符号除法指令除法指令的除数显式给出
30、,隐含使用另一除法指令的除数显式给出,隐含使用另一个操作数个操作数AX和和DX作为被除数作为被除数q字节量除法:字节量除法:AX除以除以r8/m8,8位商存入位商存入AL,8位余数存入位余数存入AHq字量除法:字量除法:DX.AX除以除以r16/m16,16位商存位商存入入AX,16位余数存入位余数存入DXq字量除法:字量除法:EDX.EAX除以除以r32/m32,32位位商存入商存入EAX,32位余数存入位余数存入EDX除法指令对标志没有定义除法指令对标志没有定义除法指令会除法指令会产生结果溢出产生结果溢出5.2.5 符号扩展指令符号扩展指令n什么是什么是符号扩展符号扩展n符号扩展指令常用于
31、获得倍长的数据符号扩展指令常用于获得倍长的数据 不影响标志位不影响标志位n字节转换为字指令字节转换为字指令CBW n字转换为双字指令字转换为双字指令CWD n字转换为双字指令字转换为双字指令CWDE n双字转换为四个字指令双字转换为四个字指令CDQ n无符号扩展传送指令无符号扩展传送指令MOVZX n有符号扩展传送指令有符号扩展传送指令MOVSX 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计字节转换为字指令字节转换为字指令CBW CBWCBW;ALAL的符号扩展至的符号扩展至AHAH;如;如ALAL的最高有效位是的最高有效位是0 0,则,则AHAH0000;ALAL的最高有效位为的最高有
32、效位为1 1,则,则AHAHFFHFFH。ALAL不变不变例例5-215-21:符号扩展:符号扩展 mov al,80hmov al,80h;al=80h;al=80h cbwcbw;ax=ff80h;ax=ff80h add al,255add al,255;al=7fh;al=7fh cbwcbw;ax=007fh ;ax=007fh 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计字转换为双字指令字转换为双字指令CWD CWDCWD;AXAX的符号扩展至的符号扩展至DX.AXDX.AX;如;如AXAX的最高有效位是的最高有效位是0 0,则,则DXDX0000;AXAX的最高有效位为的最
33、高有效位为1 1,则,则DXDXFFHFFH。AXAX不变不变mov ax,-256mov ax,-256;ax=FF00h;ax=FF00h cwdcwd; DX=FFFFh,ax=ff00h; DX=FFFFh,ax=ff00h;x=FFFE, y=001E mov ax,x;ax-x,mov dx,0idiv y ;除法:除法:axymov ax,x;ax-x,cwdidiv y ;除法:;除法:axy修改例520郑州大学 计算机系 穆玲玲 32位汇编语言程序设计字转换为双字指令字转换为双字指令CWDECWDCWDE E;AXAX的符号扩展至的符号扩展至EAXEAX;如;如AXAX的最高
34、有效位是的最高有效位是0 0,则,则EAXEAX的高字的高字0000;AXAX的最高有效位为的最高有效位为1 1,则,则EAXEAX的高字的高字FFHFFH。AXAX不变不变计算有符号数计算有符号数EBX与与AX内容之和内容之和cwdeadd ebx, eax注意,不能直接把注意,不能直接把EBX和和AX内容相加:内容相加:add ebx, ax;非法指令,非法指令,;因为两个操作数类型不一致;因为两个操作数类型不一致郑州大学 计算机系 穆玲玲 32位汇编语言程序设计双字转换为四个字指令双字转换为四个字指令CDQ CDQCDQ;EAXEAX符号扩展成符号扩展成EDX.EAX EDX.EAX ;
35、如;如EAXEAX的最高有效位是的最高有效位是0 0,则,则EDXEDX0000;EAXEAX的最高有效位为的最高有效位为1 1,则,则EDXEDXFFFFHFFFFH。EAXEAX不变不变例例5-225-22:计算有符号数:计算有符号数xyxy.data.data x dword x dword 3456734567y dword 567y dword 567.code.codemov eax, xmov eax, xcdqcdq;被除数扩展到;被除数扩展到edx.eaxedx.eaxidiv yidiv y郑州大学 计算机系 穆玲玲 32位汇编语言程序设计无符号扩展传送指令无符号扩展传送指
36、令MOVZX MOVZX r16/r32,r8/r16/m8/m16MOVZX r16/r32,r8/r16/m8/m16; r16/r32r8/r16/m8/m16 ; r16/r32r8/r16/m8/m16 MOVZX指令把一个字节或者字操作数从源地址指令把一个字节或者字操作数从源地址传送至目的地址,高位不足的部分用零填充,传送至目的地址,高位不足的部分用零填充,它实现的功能是将一个无符号的整数从它实现的功能是将一个无符号的整数从8位扩展位扩展到到16位,从位,从16位扩展到位扩展到32位,并且保持数值不位,并且保持数值不变。变。mov al, 82h;al=82hmovzx bx, a
37、l;bx=0082hmovzx 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郑州大学 计算机系 穆玲玲 32位汇编语言程序设计有符号扩展传送指令有符号扩展传送指令MOVSX MOVSX r16/r32,r8/r16/m8/m16MOVSX r16/r32,r8/r16/m8/m16; r16/r32r8/r16/m
38、8/m16 ; r16/r32r8/r16/m8/m16 MOVSX指指令令把把一一个个字字节节或或者者字字操操作作数数从从源源地地址址传送至目的地址,高位不足的部分用源传送至目的地址,高位不足的部分用源操作数的符号位填充,它实现的功能是将一个操作数的符号位填充,它实现的功能是将一个无符号的整数从无符号的整数从8位扩展到位扩展到16位,从位,从16位扩展位扩展到到32位,并且保持数值不变。位,并且保持数值不变。 mov al, 82h;al=82hmovsx bx, al;bx=FF82hmovsx ebx, al;ebx=FFFFFF82hmov cx, 1000h;cx=1000hmovs
39、x 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.stack.dataX dword 5Y dword 6Z dword 7W dword ?例例5-25(1/2) :x+y+z.codestart:m
40、ov 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.386.MODEL FLAT.MODEL FLATINCLUDE io32.hINCLUDE io32.h.STACK 4096 .STACK 4096 .DATA .DATA Prompt1 byte 0dh,0ah,Prompt1 byte 0dh,0ah, byte Input Temputer C:,0 byte Input Temputer C:,0Answer byt
41、e 0dh,0ah,Answer byte 0dh,0ah, byte equal to F temputer byte equal to F temputer:“,0 “,0 .CODE .CODE start:start:WriteString Prompt1 WriteString Prompt1 ReadSDecDword axReadSDecDword aximul ax,9 ; C*9imul ax,9 ; C*9add ax,2 add ax,2 例例5-26(2/3):温度转换:温度转换 mov bx,5 ; mov bx,5 ; 除数除数cwd ; cwd ; 被除数扩展被除
42、数扩展idiv bx ; C*9/5idiv bx ; C*9/5add ax,32 ; C*9/5 + 32add ax,32 ; C*9/5 + 32WriteString Answer ; WriteString Answer ; 显示结果显示结果WriteSDecDword axWriteSDecDword axretretEND STARTEND START例例5-26(3/3):温度转换:温度转换 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.3 5.3 位操作位操作 位操作是指对操作数的某一位或某位操作是指对操作数的某一位或某些位进行操作。些位进行操作。q逻辑运算指令逻辑
43、运算指令q位测试指令位测试指令q位扫描指令位扫描指令q基本移位指令基本移位指令q循环移位指令循环移位指令q双精度移位指令双精度移位指令 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑运算指令逻辑运算指令逻辑运算指令用来对字或字节按位逻辑运算指令用来对字或字节按位进行逻辑运算进行逻辑运算q逻辑与逻辑与ANDq逻辑或逻辑或 ORq逻辑非逻辑非NOTq逻辑异或逻辑异或XORq测试测试TEST 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑与指令逻辑与指令AND对两个操作数执行逻辑与运算,结果对两个操作数执行逻辑与运算,结果送到目的操作数送到目的操作数AND指令设置指令设置CF = O
44、F = 0,根据结果,根据结果设置设置SF、ZF和和PF状态,而对状态,而对AF未定义未定义AND reg,imm/reg/mem AND reg,imm/reg/mem ;regregregregimm/reg/memimm/reg/memAND mem,imm/reg AND mem,imm/reg ;memmemmemmemimm/regimm/reg 只只有有相相“与与”的的两两位位都都是是1,结结果果才才是是1;否否则则,“与与”的的结结果果为为0郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-27:逻辑与运算:逻辑与运算mov al, 01000101b ; al=45h
45、and al, 00001111b ;45h 0fh=05h;CF=OF=0;SF=0; ZF=0;PF=1 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑与运算的应用逻辑与运算的应用复位某些位,但不影响其他位。复位某些位,但不影响其他位。q这时只需将要置这时只需将要置0的位同的位同“0”相与,相与,而维持不变的位同而维持不变的位同“1”相与就可以相与就可以了。了。 实现编码的转换实现编码的转换 q小写字母转换为大写字母小写字母转换为大写字母 q数字字符数字字符09的的ASCII码转换为数码转换为数值值09 用来取用来取2n的余数的余数 例例5-28例例5-29例例5-30例例5-31
46、郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-28:清零清零 and bl, 01101111b 例例5-28:将将BL中的中的D7位和位和D4位位进行清零,其他位不变进行清零,其他位不变郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-29:小写字母转换为大写字母小写字母转换为大写字母and al, 111011111h;郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-30:字符转换为数字字符转换为数字数字字符数字字符09的的ASCII码转换为数值码转换为数值09:mov al, 9;al=数字字符数字字符ASCII码码and al, 0fh;sub al, 3
47、0h实现相同的功能实现相同的功能郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-31:求余:求余求求x mod 8的指令序列:的指令序列: mov edx, xand edx, 00000007h ;edx=edx mod 85郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑或指令逻辑或指令OR 对两个操作数执行逻辑或运算,结果对两个操作数执行逻辑或运算,结果送到目的操作数送到目的操作数OR指令设置指令设置CF = OF = 0,根据结果,根据结果设置设置SF、ZF和和PF状态,而对状态,而对AF未定义未定义OR reg,imm/reg/mem OR reg,imm/reg/m
48、em ;regregregregimm/reg/memimm/reg/memOR mem,imm/reg OR mem,imm/reg ;memmemmemmemimm/regimm/reg 只只要要相相“或或”的的两两位位有有一一位位是是1,结果就是,结果就是1;否则,结果为;否则,结果为0郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-32:逻辑或运算逻辑或运算mov eax, 12345678h;eax=12345678hor eax,0000ffffh ;12345678h0000ffffh=1234ffffh;两条指令执行后:;两条指令执行后:;eax =1234ffffh
49、,CF=OF=0;SF=0; ZF=0;PF=0。 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑或运算的应用逻辑或运算的应用置位某些位,但不影响其他位。置位某些位,但不影响其他位。q这时只需将要置这时只需将要置1的位同的位同“1”相或,相或,而维持不变的位同而维持不变的位同“0”相或就可以相或就可以了。了。 实现编码的转换实现编码的转换 q大写字母转换为小写字母大写字母转换为小写字母 q数值数值09转换数字字符转换数字字符09郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-33:置:置1;将;将BL中中D0和和D3置置1,其余位不变,其余位不变 or bl,00001001
50、b郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-34:大写字母转换为小写字母大写字母转换为小写字母or al, 00100000h;将;将D5位置位置1郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-35:数字转换为字符:数字转换为字符将将一一位位十十进进制制数数09转转换换为为数数字字字字符符09的的ASCII码:码: mov al, 9mov al, 9;al=;al=一位十进制数一位十进制数or al, 30hor al, 30h;add al, 30h;add al, 30h实现相同的功能实现相同的功能郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑异或指令
51、逻辑异或指令XOR 对两个操作数执行逻辑异或运算,结对两个操作数执行逻辑异或运算,结果送到目的操作数果送到目的操作数XOR指令设置指令设置CF = OF = 0,根据结果,根据结果设置设置SF、ZF和和PF状态,而对状态,而对AF未定义未定义XOR reg,imm/reg/mem XOR reg,imm/reg/mem ;regregimm/reg/memregregimm/reg/memXOR mem,imm/reg XOR mem,imm/reg ;memmemimm/regmemmemimm/reg 只只有有相相“异异或或”的的两两位位不不相相同同,结果才是结果才是1;否则,结果为;否则
52、,结果为0郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-36:逻辑异或运算逻辑异或运算mov ax, 1234h ;ax=1234hxor ax, 00ffh ;1234h 00ff h =12cbh 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑异或运算的应用逻辑异或运算的应用求反某些位,但不影响其他位。求反某些位,但不影响其他位。q这时只需将要求反的位同这时只需将要求反的位同“1”异或,异或,而维持不变的位同而维持不变的位同“0”“0”异或就可以异或就可以了。了。 清清0 0,同时使,同时使CFCF也清也清0 0 实现编码的转换实现编码的转换 q大小写字母的相互转换大小
53、写字母的相互转换 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-37:求反求反; ;将将BL中中D0和和D3求反,其余位不变求反,其余位不变 xor bl,00001001b郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-38:清清0; ;将寄存器将寄存器EAX清清0xor eax,eax;eax=0,CF=OF=0、SF=0、ZF=1、PF=1郑州大学 计算机系 穆玲玲 32位汇编语言程序设计大小写转换大小写转换转换转换AL中字母的大小写只需一条指令:中字母的大小写只需一条指令:xor al, 20h 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计逻辑非指令逻辑非指
54、令NOT 对一个操作数执行逻辑非运算对一个操作数执行逻辑非运算NOT指令是一个单操作数指令指令是一个单操作数指令NOT指令不影响标志位指令不影响标志位NOT reg/mem NOT reg/mem ;reg/memreg/memreg/memreg/mem 按按位位取取反反,原原来来是是“0”的的位位变变为为“1”;原原来来是是“1”的的位位变变为为“0”郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-39:逻辑非运算:逻辑非运算mov al, 45h;al=01000101b not al ;al=10111010b ;所有标志位都不变所有标志位都不变郑州大学 计算机系 穆玲玲 3
55、2位汇编语言程序设计测试指令测试指令TEST 对两个操作数执行逻辑与运算,对两个操作数执行逻辑与运算,结果结果不回送到目的操作数不回送到目的操作数AND指令设置指令设置CF = OF = 0,根据结果,根据结果设置设置SF、ZF和和PF状态,而对状态,而对AF未定义未定义TEST reg,imm/reg/memTEST reg,imm/reg/mem;regregimm/reg/memimm/reg/memTEST mem,imm/regTEST mem,imm/reg;memmemimm/regimm/reg只只有有相相“与与”的的两两位位都都是是1,结结果果才才是是1;否否则则,“与与”的
56、的结结果果为为0郑州大学 计算机系 穆玲玲 32位汇编语言程序设计and和和test比较下面两条指令执行结果比较下面两条指令执行结果 :and al, 0DFhtest al, 0DFh郑州大学 计算机系 穆玲玲 32位汇编语言程序设计位测试指令位测试指令 对一个对一个1616位或位或3232位的通用寄存器或存位的通用寄存器或存储器操作数中的指定二进制位进行必储器操作数中的指定二进制位进行必要的操作:要的操作:q把指定位的值送给把指定位的值送给CFCF标志标志q对该位按指令要求进行操作。对该位按指令要求进行操作。 位测试指令位测试指令 BT 位测试并置位指令位测试并置位指令 BTS位测试并复位
57、指令位测试并复位指令 BTR 位测试并取反指令位测试并取反指令 BTC 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计位测试指令位测试指令 BT 将目的操作数中由源操作数指定的位将目的操作数中由源操作数指定的位送给送给CF标志。标志。位数从最右边开始,从位数从最右边开始,从0计数。计数。源操作数的大小不能超过目的操作数的源操作数的大小不能超过目的操作数的长度。长度。 BT对对CF以外的其它标志位未定义以外的其它标志位未定义BT r16/m16, r16/i8 BT r16/m16, r16/i8 BT r32/m32, r32/i8 BT r32/m32, r32/i8 .data.dat
58、avar word 1234Hvar word 1234H.code.codemov eax, 2367hmov eax, 2367hmov ecx, 3mov ecx, 3bt eax, 1 bt eax, 1 ;测试;测试eaxeax的的D D1 1位,位,CF=1CF=1bt eax, ecxbt eax, ecx;测试;测试eaxeax的的D D3 3位,位,CF=0CF=0bt var, cx bt var, cx ;测试;测试varvar的的D D3 3位,位,CF=0 CF=0 例例5-40:位测试指令位测试指令 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计位测试并置位指令
59、位测试并置位指令 BTS将目的操作数中由源操作数指定的位送将目的操作数中由源操作数指定的位送给给CF标志标志, ,并将目的操作数中该位置并将目的操作数中该位置1 1BTS对对CF以外的其它标志位未定义以外的其它标志位未定义BTS r16/m16, r16/i8 BTS r16/m16, r16/i8 BTS r32/m32, r32/i8 BTS r32/m32, r32/i8 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计位测试并置位指令位测试并置位指令 BTR将目的操作数中由源操作数指定的将目的操作数中由源操作数指定的位送给位送给CF标志标志, ,并将目的操作数中并将目的操作数中该位置
60、该位置0. 0. BTR对对CF以外的其它标志位未定义以外的其它标志位未定义BTR r16/m16, r16/i8 BTR r16/m16, r16/i8 BTR r32/m32, r32/i8 BTR r32/m32, r32/i8 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计位测试并置位指令位测试并置位指令 BTC将目的操作数中由源操作数指定的将目的操作数中由源操作数指定的位送给位送给CF标志标志, ,并将目的操作数中并将目的操作数中该位求反该位求反. . BTC对对CF以外的其它标志位未定义以外的其它标志位未定义BTC r16/m16, r16/i8 BTC r16/m16, r1
61、6/i8 BTC r32/m32, r32/i8 BTC r32/m32, r32/i8 .data.datavar word 1237hvar word 1237h.code.codestart:start:mov eax, 2367hmov eax, 2367hmov ecx, 3mov ecx, 3bts eax, ecx ; CF=0,bts eax, ecx ; CF=0,并置并置eaxeax的的D3D3位为位为1 1,eax=236fheax=236fhbts var, 10 ; CF=0,bts var, 10 ; CF=0,并置并置var var 的的D10D10位为位为1 1
62、,ax=2767hax=2767hbtr ax, 1 ; CF=1,btr ax, 1 ; CF=1,并将并将axax的的D1D1位清位清0 0,al=65hal=65hmov ecx, 20mov ecx, 20btc eax, ecx btc eax, ecx ; CF=0,; CF=0,并将并将eaxeax的的D20D20位取反位取反,eax=102367h,eax=102367hretret例例5-41:位测试指令:位测试指令 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.3.3位扫描指令位扫描指令 对一个对一个1616位或位或3232位的通用寄存器或位的通用寄存器或存储器操作
63、数进行扫描,将出现的存储器操作数进行扫描,将出现的第一个第一个“1”“1”的位置放入指定的寄的位置放入指定的寄存器中。存器中。 q前向扫描指令前向扫描指令 BSF q后向扫描指令后向扫描指令 BSR 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计前向扫描指令前向扫描指令 BSFBSFBSF对源操作数由低位到高位(前对源操作数由低位到高位(前向)扫描,找到第一个向)扫描,找到第一个“1”“1”出现出现的位置,将该位的编号存入到目的的位置,将该位的编号存入到目的操作数中。操作数中。 如果源操作数是如果源操作数是0,ZF=1;否则;否则ZF=0。对其它标志位无定义对其它标志位无定义BSF r16
64、, r16/m16BSF r16, r16/m16BSF r32, r16/m32 BSF r32, r16/m32 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计后向扫描指令后向扫描指令 BSRBSFBSF对源操作数由高位到低位(后对源操作数由高位到低位(后向)扫描,找到第一个向)扫描,找到第一个“1”“1”出现出现的位置,将该位的编号存入到目的的位置,将该位的编号存入到目的操作数中。操作数中。 如果源操作数是如果源操作数是0,ZF=1;否则;否则ZF=0。对其它标志位无定义对其它标志位无定义BSR r16, reg/m16BSR r16, reg/m16BSR r32, reg/m32
65、 BSR r32, reg/m32 .data.datavar word 1234hvar word 1234h.code.codestart:start:mov eax, 76542368hmov eax, 76542368hbsf ebx, eax bsf ebx, eax ;ebx=3;ebx=3(eaxeax的的D3=1D3=1),ZF=0,ZF=0bsf ax, var bsf ax, var ;ax=2;ax=2,ZF=0ZF=0bsr ax, var bsr ax, var ;ax=12;ax=12(varvar的的D12=1D12=1),ZF=0,ZF=0mov eax, 0m
66、ov eax, 0bsf ebx, eaxbsf ebx, eax;ZF=1;ZF=1bsr ebx, eax ;ZF=1bsr ebx, eax ;ZF=1例例5-42:位扫描指令位扫描指令 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.3.4 移位指令移位指令 将操作数移动一位或多位,分成逻辑移位和将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作算术移位,分别具有左移或右移操作SHL reg/mem,1/CL/i8SHL reg/mem,1/CL/i8;逻辑左移,最高位进入;逻辑左移,最高位进入CFCF,最低位补,最低位补0 0SHR reg/mem,1/CL
67、/i8SHR reg/mem,1/CL/i8;逻辑右移,最低位进入;逻辑右移,最低位进入CFCF,最高位补,最高位补0 0SAL reg/mem,1/CL/i8SAL reg/mem,1/CL/i8;算术左移,最高位进入;算术左移,最高位进入CFCF,最低位补,最低位补0 0SAR reg/mem,1/CL/i8SAR reg/mem,1/CL/i8;算术右移,最低位进入;算术右移,最低位进入CFCF,最高位不变,最高位不变SALSAL与与SHLSHL相同相同郑州大学 计算机系 穆玲玲 32位汇编语言程序设计移位指令功能示意图移位指令功能示意图图5-1 移位指令的示意图(a)逻辑/算术左移SH
68、L/SAL操作数MSBLSB0CF(b)逻辑右移SHR操作数MSBLSB0CF(c)算术右移SAR操作数MSBLSBCF郑州大学 计算机系 穆玲玲 32位汇编语言程序设计移位指令的操作数移位指令的操作数移位指令的第一个操作数是指定的被移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储移位的操作数,可以是寄存器或存储单元单元后一个操作数表示移位位数后一个操作数表示移位位数,该操作,该操作数数为为1,表示移动一位;当移位位数,表示移动一位;当移位位数大大于于1时,在时,在16位应用程序中用位应用程序中用CL寄存寄存器值表示,该操作数表达为器值表示,该操作数表达为CL,在,在32位应用
69、程序中仍可使用立即数表示。位应用程序中仍可使用立即数表示。郑州大学 计算机系 穆玲玲 32位汇编语言程序设计移位指令对标志的影响移位指令对标志的影响按照移入的位设置进位标志按照移入的位设置进位标志CF根据移位后的结果影响根据移位后的结果影响SF、ZF、PF对对AF没有定义没有定义如果进行一位移动,则按照操作数的如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出最高符号位是否改变,相应设置溢出标志标志OF:如果移位前的操作数最高位:如果移位前的操作数最高位与移位后操作数的最高位不同(有变与移位后操作数的最高位不同(有变化),则化),则OF = 1;否则;否则OF = 0。当移。当移
70、位次数大于位次数大于1时,时,OF不确定不确定mov cl,4mov eax,0a9d7c6e5h;eax=0a9d7c6e5hmov eax,0a9d7c6e5h;eax=0a9d7c6e5hshr eax,1;eax=54ebhshr eax,1;eax=54ebh;CF=1;CF=1,SF=1SF=1、ZF=0ZF=0、PF=1 OF=1PF=1 OF=1mov eax,0a9d7c6e5h;eax=0a9d7hmov eax,0a9d7c6e5h;eax=0a9d7hsar eax,1;eax=0d4ebhsar eax,1;eax=0d4ebh;CF=1;CF=1,SF=1SF=1、
71、ZF=0ZF=0、PF=1 OF=0PF=1 OF=0;CF=1,SF=1、ZF=0、PF=1 OF=0例例5-43:移位指令移位指令(1/2)(1/2) sal eax,8sal eax,8;eax=04eb0h;eax=04eb0h;CF=1;CF=1,SF=0SF=0、ZF=0ZF=0、PF=0PF=0、OF=1OF=1shr eax,clshr eax,cl;eax=004ebh;eax=004ebh;CF=0;CF=0,SF=0SF=0、ZF=0ZF=0、PF=1PF=1、OF=0OF=0例例5-43:移位指令移位指令(2/2)(2/2) 郑州大学 计算机系 穆玲玲 32位汇编语言程
72、序设计操操作作数数逻逻辑辑左左移移一一位位,相相当当于于无无符符号号数数的的乘乘2,逻逻辑辑左左移移n位位,相相当当于于无无符符号号数数的的乘乘2n;逻逻辑辑右右移移一一位位,相相当当于于无无符符号号数数除除以以2,右右移移n位位,相相当当于于无无符符号号数数除除以以2n,商商在在目目的的操作数中,余数由操作数中,余数由CF标志反映。标志反映。操作数算术右移一位,相当于有符号数除以操作数算术右移一位,相当于有符号数除以2,右移,右移n位,相当于有符号数除以位,相当于有符号数除以2n。 q当操作数为负(最高位为当操作数为负(最高位为1),并且最低位有),并且最低位有1移出时,移出时,SAR指令产
73、生的结果与等效的指令产生的结果与等效的IDIV指令指令的结果不同。的结果不同。 利利用用移移位位指指令令计计算算EDX3EAX7EBX,假设为无符号数运算,无进位。假设为无符号数运算,无进位。mov esi,eaxshl esi,1;esi2eaxadd esi,eax;esi3eaxmov edx,ebxshl edx,3;edx8ebxsub edx,ebx;edx7ebxadd edx,esi;edx7ebx3eax 例例5-44: 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.3.5 循环移位指令循环移位指令 将操作数从一端移出的位返回到另一将操作数从一端移出的位返回到另一端形
74、成循环,分成不带进位和带进位,端形成循环,分成不带进位和带进位,分别具有左移或右移操作分别具有左移或右移操作ROL reg/mem,1/CL/i8 ROL reg/mem,1/CL/i8 ;不带进位循环左移;不带进位循环左移ROR reg/mem,1/CL/i8 ROR reg/mem,1/CL/i8 ;不带进位循环右移;不带进位循环右移RCL reg/mem,1/CL/i8 RCL reg/mem,1/CL/i8 ;带进位循环左移;带进位循环左移RCR reg/mem,1/CL/i8 RCR reg/mem,1/CL/i8 ;带进位循环右移;带进位循环右移郑州大学 计算机系 穆玲玲 32位汇
75、编语言程序设计循环移位指令功能示意图循环移位指令功能示意图图5-2 循环移位指令的示意图(a)左循环移位ROL操作数MSBLSBCF(b)右循环移位ROR操作数MSBLSBCF(c)带进位左循环移位RCL操作数MSBLSBCF(d)带进位右循环移位RCR操作数MSBLSBCF郑州大学 计算机系 穆玲玲 32位汇编语言程序设计循环移位指令对标志的影响循环移位指令对标志的影响按照指令功能设置进位标志按照指令功能设置进位标志CF不影响不影响SF、ZF、PF、AF如果进行一位移动,则按照操作数的如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出最高符号位是否改变,相应设置溢出标志标志OF
76、:如果移位前的操作数最高位:如果移位前的操作数最高位与移位后操作数的最高位不同(有变与移位后操作数的最高位不同(有变化),则化),则OF = 1;否则;否则OF = 0。当移。当移位次数大于位次数大于1时,时,OF不确定不确定将将寄寄存存器器EAX :EBX :ECX中中联联合合存存放放的的48位数据左移位数据左移1位。位。.codestart:shl ecx, 1rcl ebx, 1rcl eax, 1例例5-45: EAXEBXECXCF例例5-46:把把EAX最最低低位位送送EBX最最低低位位,但但保保持持EAX不变不变ror ebx,1ror eax,1rcl ebx,1rol eax
77、,1例例5-46: ; ;十六进制字符的形式保存十六进制字符的形式保存AL寄存器的内容。寄存器的内容。.dataASCII byte 0123456789ABCDEF;09,AF对应的对应的ASCII码表码表HexStr byte 2 dup(?),0;存放转换后的十六进制字符串;存放转换后的十六进制字符串x byte ? ;要转换的无符号数要转换的无符号数 例例5-47(1/3): .codemov al, xmov ebx, offset ASCII;ebx=ASCII表的首地址表的首地址mov bl, al;保存;保存al寄存器的值寄存器的值shr al, 4;取取al的高四位的高四位x
78、lat;换码;换码; ;al=高四位对应的高四位对应的ASCII码,码,al-ebx+al 例例5-47(2/3): mov HexStr, al;高四位对应的十六进制字符存入;高四位对应的十六进制字符存入HexStrmov al, bl;恢复寄存器;恢复寄存器ALand al, 0fh;取取AL的低四位的低四位Xlat; al=低四位对应的低四位对应的ASCII码,码,al-ebx+almov HexStr+1, al;低低四四位位对对应应的的十十六六进进制制字字符符存存入入HexStr+1 例例5-47(3/3): 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计5.3.6双精度移位指令
79、双精度移位指令 实现双精度操作数的移位实现双精度操作数的移位 SHLD r16/m16,r16,CL/i8SHLD r16/m16,r16,CL/i8SHLD r32/m32,r32,CL/i8SHLD r32/m32,r32,CL/i8 SHRD r16/m16,r16,CL/i8SHRD r16/m16,r16,CL/i8 SHRD r32/m32,r32,CL/i8 SHRD r32/m32,r32,CL/i8 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计双精度移位指令的操作数双精度移位指令的操作数双双精精度度移移位位指指令令中中有有三三个个操操作作数数。第第一一个个操操作作数数和
80、和第第二二个个操操作作数数联联合合构构成成的的要要移移位位的的数数据据,第第一一个个操操作作数数可可以以是是16或或32位位通通用用寄寄存存器器或或存存储储器器,第第二二个个操操作作数数只只能能是是与与第第一一个个操操作作数数位位数数相相同同的的通通用用寄寄存存器器,第第三三个个操操作作数数是是移移位位次次数数,可可以以用用8位位立立即即数数或或CL表表示。示。郑州大学 计算机系 穆玲玲 32位汇编语言程序设计SHLD执行的功能执行的功能SHLD将第一个操作数将第一个操作数r16/m16左左移移CL/i8位,空出的低位部分由第位,空出的低位部分由第二个操作数从左边起的二个操作数从左边起的CL/
81、i8位填位填充,相当于组合数据左移充,相当于组合数据左移CL/i8位。位。第二个和第三个操作数的内容不变。第二个和第三个操作数的内容不变。郑州大学 计算机系 穆玲玲 32位汇编语言程序设计SHRD执行的功能执行的功能SHRD将第一个操作数将第一个操作数r16/m16右右移移CL/i8位,空出的低位部分由第位,空出的低位部分由第二个操作数从右边起的二个操作数从右边起的CL/i8位填位填充,相当于组合数据右移充,相当于组合数据右移CL/i8位。位。第二个和第三个操作数的内容不变。第二个和第三个操作数的内容不变。郑州大学 计算机系 穆玲玲 32位汇编语言程序设计双精度移位指令对标志的影响双精度移位指
82、令对标志的影响按照指令功能设置进位标志按照指令功能设置进位标志CF根据结果设置根据结果设置 SF、ZF、PF、AF如果进行一位移动,则按照操作数的如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出最高符号位是否改变,相应设置溢出标志标志OF:如果移位前的操作数最高位:如果移位前的操作数最高位与移位后操作数的最高位不同(有变与移位后操作数的最高位不同(有变化),则化),则OF = 1;否则;否则OF = 0。当移。当移位次数大于位次数大于1时,时,OF不确定不确定mov ebx, 5678hmov ecx, 1234hmov eax, 9abchshld ecx, ebx, 4 ;
83、e ecx=12340h,e ebx=5678h,CF=0shrd eax, ebx, 8 ;e eax=00009ah,e ebx=5678h,CF=1 例例5-48:双精度移位双精度移位 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计例例5-49:数据组合:数据组合将将寄寄存存器器EAX,EBX和和ECXECX的的有有效效位位组组合合到到双字变量双字变量varvar中。中。假假设设EAX低低7位位有有效效,EBXEBX低低1212位位有有效效,ECXECX低低1313位位有有效效组组合合到到双双字字变变量量varvar中中以以后后,varvar的的高高7位位为为EAX,中中间间12位位
84、是是EBX,低低13位位为为ECXECX。用用双双精精度度移移位位指指令令很很容容易实现这个功能。易实现这个功能。.data .data var dword ?var dword ?.code.codestart:start:shrd var, ecxshrd var, ecx, 13, 13shrd var, ebxshrd var, ebx, 12, 12shrd var, eaxshrd var, eax, 7, 7 例例5-49:数据组合数据组合 郑州大学 计算机系 穆玲玲 32位汇编语言程序设计教学要求教学要求熟练掌握数据传送,算术运算和位熟练掌握数据传送,算术运算和位操作的编程方法;操作的编程方法;掌握常用的数据操作指令;掌握常用的数据操作指令;能够编程实现简单的数据变换和组能够编程实现简单的数据变换和组合合