作用將源操作數(shù)的值復(fù)制到目的操作數(shù);這里規(guī)定源和目標(biāo)操作不能都指向存儲器位置,從一個存儲器位置復(fù)制到另一個存儲器位置需要兩條指令,第一條指令將源操作數(shù)加載到寄存器,第二條將寄存器的值寫到目標(biāo)位置
指令 動作 描述
MOV S,D D<-S 傳送
Movb 傳送字節(jié)
Movw 傳送字
Movl 傳送雙字
MOVS S,D D<-S(符號擴(kuò)展) 傳送擴(kuò)展字節(jié)
Movsbw 傳送做了符號擴(kuò)展字節(jié)到字
Movsbl 傳送做了符號擴(kuò)展字節(jié)到雙字
Movswl 傳送做了符號擴(kuò)展字到雙字
MOVZ S,D D<-S(零擴(kuò)展) 傳送擴(kuò)展字節(jié)
Movzbw 傳送做了符號擴(kuò)展字節(jié)到字
Movzbl 傳送做了符號擴(kuò)展字節(jié)到雙字
Movzwl 傳送做了符號擴(kuò)展字到雙字
Push S R[%esp]<-R[%esp]-4 雙字壓棧
M[R[%esp]]<-S
Popl D D<-M[R[%esp]]; 雙字出棧
R[%esp]<-R[%esp]+4
Movs和Movz都是將較小的數(shù)值復(fù)制較大的數(shù)據(jù)位置中。符號擴(kuò)展的目標(biāo)位置的高位都是源數(shù)值的高位填充,零擴(kuò)展的目標(biāo)位置的高位全部用零填充。
Mov指令組合(5種):
Movl $0x2050,%eax 立即數(shù)----寄存器 4字節(jié)
Movw %bp,%sp 寄存器---寄存器 2字節(jié)
Movb (%edi,%ecx),%ah 存儲器---寄存器 1字節(jié)
Movb $-17,(%esp) 立即數(shù)---存儲器 1字節(jié)
Movl %eax,-12(%ebp) 寄存器---存儲器 4字節(jié)
Movb、movsbl、movzbl的差別:比如:%dh=ab,%eax=23456789
Mov %dh,%al %eax=234567ab
Movsbl %dh,%eax %eax=fffffffab
Movzbl %dh,%eax %eax=000000ab
Push1把數(shù)據(jù)壓棧,popl是把數(shù)據(jù)出棧
IA32的棧是向低地址增長,因此壓棧是減少棧指針(寄存器%esp)的值,并把數(shù)據(jù)放到存儲器中;
出棧是從存儲器中讀(數(shù)據(jù)),并增加棧指針的值。
Pushl %ebp等價以下指令:subl $4,%esp movl %ebp,(%esp)
兩者區(qū)別pushl指令編碼是1個字節(jié),上面兩條指令是6個字節(jié)
Popl %edx等價以下指令:movl (%esp),%eax addl $4,%esp
Esp總是指向棧頂?shù)闹羔?/span>,ebp是存取棧頂?shù)闹羔?/span>
int change(int* xp,int y)
{
int x = *xp;
*xp = y;
return x;
}
這個函數(shù)的匯編代碼如下:
change:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %eax 取形參,第N個形參在棧上的位置為(N+1)*4+%ebp
movl (%eax), %eax 把形參指向的地址單元的值賦給%eax
movl %eax, -4(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl %eax, (%edx)
movl -4(%ebp), %eax
leave
ret
.size change, .-change
從上面的代碼中我們可以看到指針的實(shí)質(zhì)就是地址,間接應(yīng)用不過就是將該指針放到一個寄存器,然后在存儲器中使用這個寄存器;
局部變量通常保存在寄存器中,寄存器訪問比存儲器要快得多s
上面是沒有優(yōu)化的匯編代碼,在編譯的時候加上-O2,匯編指令如下:
change:
7 | pushl|%ebp
8 | movl| %esp, %ebp
9 | movl| 8(%ebp), %edx
10 | movl| 12(%ebp), %ecx
11 | movl| (%edx), %eax
12 | movl| %ecx, (%edx)
13 | popl| %ebp
14 | ret
15 | .size|change, .-change
16 | .p2align 4,,15
開啟了-O2之后,gcc大量使用寄存器,極大的減少了多余的尋址操作