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



《汇编语言课程课件-第五章》由会员分享,可在线阅读,更多相关《汇编语言课程课件-第五章(156页珍藏版)》请在装配图网上搜索。
1、郑州大学 计算机系 穆玲玲 iellmu@,,,,,,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,32位汇编语言程序设计,第5章,数据操作,教学重点,,数据传送,,算数运算,,位操作,,,5.1数据传送,数据传送是计算机中最基本、最重要的一种操作,由传送指令实现。,,除标志寄存器传送指令外,均,不影响标志,位,通用数据传送指令,通用数据传送指令包括,,MOV,,XCHG,,XLAT,传送指令MOV,(move),把一个字节,字或者双字的操作数从源地址传送至目的地址,MOV reg/mem,imm,,;立即数送寄存器或主存,例题5-1,MO
2、V reg/mem/seg,reg,,;寄存器送(段)寄存器或主存,例题5-2,MOV reg/seg,mem,,;主存送(段)寄存器,例题5-3,MOV reg/mem,seg,,;段寄存器送寄存器或主存,例题5-5,例5-1:立即数传送,mov al,4 ;al←4,字节传送,,mov cx,0ffh ;cx←00ffh,字传送,,mov esi,200h,,;esi←00000200h,双字传送,,mov byte ptr [esi],0ah,,;ds:[esi] ←0ah,byte ptr说明是字节操作,,mov dword ptr [esi+4],0bh,,;ds:[esi+2] ←
3、0000000bh,,,;dword ptr说明是双字操作,,注意立即数是字节量,,,字量还是双字量,,,明确指令是字节操作,字操作还是双字操作,MOV,两个操作数的类型要一致,,绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令,,MOV AL,050AH,,;非法指令:050Ah为字,而AL为字节,,寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型,,对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型,要小心段寄存器的操作,,不允许立即数传送给段寄存器,,MOV DS
4、,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],,
5、不存在存储器向存储器的传送指令,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),把两个地方的数据进行互换,寄存器与寄存器
6、之间对换数据,,寄存器与存储器之间对换数据,,不能在存储器与存储器之间对换数据,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
7、,,.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指定的位移处的一个字节
8、数据取出赋给AL,XLAT,XLAT,;al←ds:[ebx+al],例题5-8,例5-8(1/3):代码转换,;,一位,16,进制数转换为,ASCII,码,,.386,,.MODEL FLAT,STDCALL,,include \masm32\include\io32.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:0
9、~15",0dh, 0ah,0,XLAT,继续,例5-8(3/3):代码转换,.code,,start:,,mov ebx, offset ASCII,,;ebx,存放,ASCII,表的首地址,,WriteString prompt,,ReadUDecByte al,,;,读入,0~15,之间的十进制数存放在,al,寄存器中,,xlat ;,换码,al< - ds:[ebx+al],,WriteCrlf ;,显示回车换行,,WriteChar al ;,显示,al,中存放的字符,,ret,,end start,XLAT,,换码指令没有显式的操作数,但使用了,EBX,和,AL,;,因为
10、换码指令使用了隐含寻址方式,——,采用默认操作数,返回,5.1.2 地址传送指令,,地址传送指令将存储器单元的逻辑地址送至指定的寄存器,,有效地址传送指令 LEA,,指针传送指令 LDS和LES,,注意不是获取存储器单元的内容,有效地址传送指令LEA,(load EA),将存储器操作数的有效地址传送至指定的寄存器中。,,在实模式下,使用,16,位寄存器,,在保护模式下使用,32,位寄存器,,LEA r16/r32,mem,,;r16←mem的有效地址EA,LEA,,例题,5-8,获取有效地址的指令:,,,mov ebx, offset ASCII,,可以改写为:,,,lea ebx,AS
11、CII;,E,BX=offset ACII,,获得主存单元的有效地址;不是物理地址,也不是该单元的内容,,可以实现计算功能,指针传送指令,,LDS r16,mem,,;r16←mem,,,;DS←mem+2,,实模式下,,LDS,指令将主存中,mem,指定的字送至,r16,,并将,mem,的下一字送,DS,寄存器。,,在保护模式下,,LDS,指令将主存中,mem,指定的前面,4,个字节送至,32,位寄存器,并将,mem,的下一字送,DS,寄存器,。,LES r16,mem,,;r16←mem,,,;ES←mem+2,,实模式下,,L,E,S,指令将主存中,mem,指定的字送至,r16,,并将,
12、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,指定主存的连续
13、,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)
14、,:,数据传送的综合实例,,.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 ;
15、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-,1
16、1(1/3),:移位64位数据,,.386,,.model flat,stdcall,,.stack,,.data,,q,var qword,,例,5-,11(2/3),:移位64位数据,,.code,,start:,,mov al,byte ptr qvar[6],,mov byte ptr qvar[7],al,,mov al,byte ptr qvar[5],,mov byte ptr qvar[6],al,,mov al,byte ptr qvar[4],,mov byte ptr qvar[5],al,,mov al,byte ptr qvar[3],,mov byte ptr
17、qvar[4],al,例,5-,11(3/3),:移位64位数据,,mov al,byte ptr qvar[2],,mov byte ptr qvar[3],al,,mov al,byte ptr qvar[1],,mov byte ptr qvar[2],al,,mov al,byte ptr qvar[0],,mov byte ptr qvar[1],al,,mov byte ptr qvar[0],0,,ret,,end start,,示意图,例5-11示意图,,12,34,56,78,87,65,43,21,,,,,,,,,12,34,56,78,87,65,43,0,5.2 算术
18、运算,算术运算是,IA-32,指令系统中另外一种基本的操作指令,可以用来执行字节,字或双字的二进制加减乘除算术运算。,,这类指令会根据计算结果设置相应的标志位。,,5.2.1 加法指令,执行双字,字或字节的加法运算。,,,ADD,,ADC,,INC,,加法指令ADD,ADD指令将源与目的操作数相加,结果送到目的操作数,,ADD指令按状态标志的定义相应设置,ADD reg,imm/reg/mem,,,;reg←reg+imm/reg/mem,,ADD mem,imm/reg,,,;mem←mem+imm/reg,例题5-12,.data,,var1 dword 10000h,,var2 dwo
19、rd 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,运算后,
20、标志寄存器,Fl,的内容为,00000206h,,对应的,OF=0,、,SF=0,、,ZF=0,、,AF=0,、,PF=1,、,CF=0,。,,注意,,PF,仅反映低,8,位中“,1,”,的个数,,AF,只反映,D,3,对,D,4,位是否有进位。,,大小写字符转换,,加法指令也能用作其它的用途,比如大小写字母的转换。,,,大写字母,A~Z,的,ASCII,码是,41h~5ah,,小写字母,a~z,的,ASCII,码是,61h~7ah,,它们之间相差,20h,,要将大写字母转换为相应的小写字母只需要加上,20h,即可。,,例5-13,mov al,’A’,;,al=41h,(‘,A’,的,ASC
21、II,码),,add al, 20h;al=61h,(,’a’,的,ASCII,码),例,5-,13:,大写字母转换为小写字母,返回,带进位加法指令ADC,ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数,,ADC指令按状态标志的定义相应设置,,ADC指令主要与ADD配合,实现多精度加法运算,ADC reg,imm/reg/mem,,,;reg←reg+imm/reg/mem+CF,,ADC mem,imm/reg,,,;mem←mem+imm/reg+CF,例题5-14a,.386,,.model flat, stdcall,,.stack 4096,,.data,,d
22、,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,dvar1[ebx],,add eax,dvar2[ebx],,mov dvar3[bx],eax,,mov eax,dvar1[ebx][esi],,adc eax,dvar2[ebx][esi],,mov dvar3[ebx][esi],eax,,ret,,end
23、 start,例,5-,14a(2/2):,无符号64位二进制加法运算,返回,增量指令INC,(increment),INC指令对操作数加1(增量),,INC指令不影响进位CF标志,按定义设置其他状态标志,INC reg/mem,,;reg/mem←reg/mem+1,inc ebx,,inc byte ptr[ebx],,例题5-14b,.386,,.model flat, stdcall,,.stack 4096,,.data,,d,var1 dword 82347856h,67783000h,,d,var2 dword 12348998h,67762000h,,d,var3 dword
24、2 dup(?),例,5-,14b(1/3):,无符号64位二进制加法运算,继续,修改例题,5-11a,的代码段,实现同样的功能,.code,,start:,,mov ebx,0,,mov esi,0,,mov eax,dvar1[ebx][esi*4],,add eax, dvar2[ebx][esi*4],,mov dvar3[bx][esi*4],eax,例,5-,14b(2/3):,无符号64位二进制加法运算,继续,inc esi,,mov eax,dvar1[ebx][esi*4],,adc eax, dvar2[ebx][esi*4],,mov dvar3[ebx][esi*4],
25、eax,,ret,,end start,例,5-,14b(3/3):,无符号64位二进制加法运算,返回,5.2.2 减法指令,SUB指令将目的操作数减去源操作数,结果送到目的操作数,,SUB指令按照定义相应设置状态标志,SUB reg,imm/reg/mem,,,;reg←reg-imm/reg/mem,,SUB mem,imm/reg,,,;mem←mem-imm/reg,例5-15(1/2):减法运算,.data,,var1 dword 10000h,,var2 dword 2000h,,.code,,start:,,mov al,0fbh ;al=0fbh,,sub al,07h,
26、,;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,的内
27、容为,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配合,实现多精度减法
28、运算,SBB reg,imm/reg/mem,,,;reg←reg-imm/reg/mem-CF,,SBB mem,imm/reg,,,;mem←mem-imm/reg-CF,例题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,
29、,mov eax,dvar1[ebx],,sub eax,dvar2[ebx],,mov dvar3[bx],eax,例,5-17(2/3),:,无符号,64,位二进制减法运算,,继续,,mov eax,dvar1[ebx][esi],,sbb eax,dvar2[ebx][esi],,mov dvar3[ebx][esi],eax,,ret,,end start,例,5-17(3/3),:,无符号,64,位二进制减法运算,,返回,减量指令DEC,(decrement),DEC指令对操作数减1(减量),,DEC指令不影响进位CF标志,按定义设置其他状态标志,DEC,DEC reg/mem,,;
30、reg/mem←reg/mem-1,dec ecx,,dec word ptr [esi],,INC,指令和,DEC,指令都是单操作数指令,,主要用于对计数器和地址指针的调整,求补指令NEG,(negative),NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数,,求补运算也可以表达成:将操作数按位取反后加1,,NEG指令对标志的影响与用零作减法的SUB指令一样,NEG,NEG reg/mem,,;reg/mem←0-reg/mem,例题5-18,.386,,.MODEL FLAT,STDCALL,,include \masm32\include\io32.inc,,.sta
31、ck,,.code,,start:,,mov eax, -100,,neg eax,,WriteSDecDword eax,,ret,,end start,例,5-18,:,求一个数的相反数,比较指令CMP,(compare),CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志,,CMP指令执行的功能与SUB指令,但结果不回送目的操作数,CMP reg,imm/reg/mem,,,;reg-imm/reg/mem,,CMP mem,imm/reg,,,;mem-imm/reg,5.2.3 乘法指令,乘法指令用来实现两个二进制操作数的相乘运算,。,,无符号数乘法指令,MUL,,
32、有符号数乘法指令,IMUL,。,,,无符号数乘法指令,MUL,,MUL,指令执行无符号二进制数的乘法运算,。,MUL r8/m8 ;无符号字节乘:AX←AL×r8/m8,,MUL r16/m16 ;无符号字乘:,,; DX.AX←AX×r16/m16,,MUL r32/m32 ;无符号双字乘:,,; EDX.EAX←EAX×r32/m32,例5-19,.386,,.MODEL FLAT,STDCALL,,include \masm32\include\io32.inc,,.stack,,.data,,prompt3 byte 0dh, 0ah, "x*y = ",0,,x word 0FFFE
33、h,,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指令执行无符号二
34、进制数的乘法运算,。,IMUL r8/m8 ;有符号字节乘:AX←AL×r8/m8,,IMUL r16/m16 ;有符号字乘:DX.AX←AX×r16/m16,,IMUL r32/m32 ;有符号双字乘:,,; EDX.EAX←EAX×r32/m32,乘法指令对标志的影响,,乘法指令如下影响OF和CF标志:,,MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1,,IMUL指令——若乘积的高一半是低一半的,符号扩展,,则OF=CF=0;否则均为1,,乘法指令对其他状态标志,没有定义,,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是,0,还
35、是,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,,,
36、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 除法指令,除法指令执行两个二进制数的除法运算,,无符号二进制数除法
37、指令,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,,ID
38、IV 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 ;除法:ax÷y,,;,ax=0888,dx=000
39、E,,mov ax,x;ax<-x,,,mov dx,0,,idiv y ;除法:ax÷y,,;,ax=0888,dx=000E,错误,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,除法溢出,,当被除数远
40、大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器不能表达,便产生溢出,,对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,或者在双字除时商超过32位,则发生除法溢出。,,对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,或者在双字除时商不在-2,32,~2,32,-1范围内,则发生除法溢出。,例题,除法溢出,,mov ax, 20000,,mov bl,10,,div bl,,;20000÷10=2000,,;商在AL中放不下,产生溢出,,mov dx, 0,,mov ax, 2
41、0000,,mov bx,10,,div bx,,;20000÷10=2000,,;商在AX中可以放下,不产生溢出,返回,.386,,.MODEL FLAT,STDCALL,,include \masm32\include\io32.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,位,无符号数除法,,继续,.
42、code,,start:,,mov ax,x;ax<-x,,,mov dx,0,,div y ;除法:ax÷y,,WriteString prompt3,,WriteHexWord ax ;显示商,,WriteString prompt4,,WriteHexWord dx;显示余数,,ret,,end start,例,5-20(2/2),:,16,位,无符号数除法,,返回,5.2.5 符号扩展指令,,什么是,符号扩展,,符号扩展指令常用于获得倍长的数据,,不影响标志位,字节转换为字指令,CBW,,,字转换为双字指令,CWD,,,字转换为双字指令,CWDE,,,双字转换为四个字指
43、令,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,则AH
44、=00,,;AL的最高有效位为1,则AH=FFH。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,则DX=00,,;AX的最高有效位为1,则DX=FFH。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 ;除法:
45、ax÷y,,,mov ax,x,;,ax<-x,,,cwd,,i,div y,;除法:,ax,÷,y,,修改例5-20,字转换为双字指令,CWD,E,CWD E,;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的最高有效位
46、是0,则EDX=00,,;EAX的最高有效位为1,则EDX=FFFFH。EAX不变,例5-22:计算有符号数x÷y,,.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/r32←r8/r16/m8/m16,,MOVZX,指令把一个字节或者字操作数从源地址传送至目的地址,高位不足的部分用零填充,它实现的功能是将一个无符号的整数从,8,位扩展到,16,位,从,16,位扩展到,32,位,并且
47、保持数值不变。,,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/r32←r8/r16/m8/m
48、16,,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
49、 ?,,.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
50、,例,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
51、 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 位操作,位操作是指对操作数的某一位或某些位进行操作。,,逻辑运算指令,,位测试指令,,位扫描指令,,基本移位指令,,循环移位指令,,双精度移位指令,,逻辑运
52、算指令,逻辑运算指令用来对字或字节按位进行逻辑运算,,逻辑与,AND,,逻辑或,OR,,逻辑非,NOT,,逻辑异或,XOR,,测试,TEST,,逻辑与指令AND,对两个操作数执行逻辑与运算,结果送到目的操作数,AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,AND reg,imm/reg/mem,;reg←reg,∧,imm/reg/mem,AND mem,imm/reg,;mem←mem,∧,imm/reg,,只有相“与”的两位都是,1,,结果才是,1,;否则,“与”的结果为,0,例,5-27,:逻辑与运算,mov al, 01000101b ; a
53、l=45h,,and al, 00001111b ;45h∧0fh=05h,,;CF=OF=0,;,SF=0,;,ZF=0,;,PF=1,,,逻辑与运算的应用,,复位某些位,但不影响其他位。,,这时只需将要置,0,的位同“,0,”相与,而维持不变的位同“,1,”相与就可以了。,,,实现编码的转换,,,小写字母转换为大写字母,,,数字字符,0~9,的,ASCII,码转换为数值,0~9,,,用来取,2,n,的余数,,例,5-28,例,5-2,9,例,5-,30,例,5-,31,例,5-28:,清零,,and bl, 01101111b,,例,5-28,:,将,BL,中的,D,7,位和,D,4,
54、位进行清零,其他位不变,例,5-29:,小写字母转换为大写字母,,and al, 111011111h,;,,例,5-30:,字符转换为数字,数字字符,0~9,的,ASCII,码转换为数值,0~9,:,,,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
55、,根据结果设置SF、ZF和PF状态,而对AF未定义,OR reg,imm/reg/mem,;reg←reg,∨,imm/reg/mem,OR mem,imm/reg,;mem←mem,∨,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=
56、0,。,,逻辑或运算的应用,,置位某些位,但不影响其他位。,,这时只需将要置,1,的位同“,1,”相或,而维持不变的位同“,0,”相或就可以了。,,,实现编码的转换,,,大写字母转换为小写字母,,,数值,0~9,转换数字字符,0~9,例,5-,33:置1,;将,BL,中,D,0,和,D,3,置,1,,其余位不变,,,,or bl,00001001b,例,5-,34:,大写字母转换为小写字母,or al, 00100000h,;将,D5,位置,1,例,5-3,5:数字转换为字符,将一位十进制数,0~9,转换为数字字符,0~9,的,ASCII,码:,,,mov al, 9,,;al=一位十进制数,
57、,or al, 30h,,;add al, 30h实现相同的功能,逻辑异或指令,XOR,,对两个操作数执行逻辑异或运算,结果送到目的操作数,XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义,XOR reg,imm/reg/mem,;reg←reg⊕imm/reg/mem,XOR mem,imm/reg,;mem←mem⊕imm/reg,,只有相“异或”的两位不相同,结果才是,1,;否则,结果为,0,例,5-36,:,逻辑异或运算,mov ax, 1234h,;,ax=1234h,,xor ax, 00ffh,;,1234h,,00ff h =12c
58、bh,,逻辑异或运算的应用,,求反某些位,但不影响其他位。,,这时只需将要求反的位同“,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,,对一个操作数
59、执行逻辑非运算,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,∧,im
60、m/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,
61、标志。,位数从最右边开始,从,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,将目的操作
62、数中由源操作数指定的位送给,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
63、 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,:位测试指令,,位扫描指
64、令,,对一个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
65、=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
66、.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位应用程序中仍可使用立即数表示。,移位指令对标志的影响,,按照移入的位
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。