《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > 簡明x86匯編語言教程(六)

簡明x86匯編語言教程(六)

2017-06-10
關鍵詞: 匯編

4.0 利用子程序與中斷

已經掌握了匯編語言?沒錯,你現在已經可以去破譯別人代碼中的秘密。然而,我們還有一件重要的東西沒有提到,那就是自程序和中斷。這兩件東西是如此的重要,以至于你的程序幾乎不可能離開它們。

4.1 子程序

在高級語言中我們經常要用到子程序。高級語言中,子程序是如此的神奇,我們能夠定義和主程序,或其他子程序一樣的變量名,而訪問不同的變量,并且,還不和程序的其他部分相沖突。

然而遺憾的是,這種“優勢”在匯編語言中是不存在的。

匯編語言并不注重如何減輕程序員的負擔;相反,匯編語言依賴程序員的良好設計,以期發揮CPU的最佳性能。匯編語言不是結構化的語言,因此,它不提供直接的“局部變量”。如果需要“局部變量”,只能通過堆或棧自行實現。

從這個意義上講,匯編語言的子程序更像GWBASIC中的GOSUB調用的那些“子程序”。所有的“變量”(本質上,屬于進程的內存和寄存器)為整個程序所共享,高級語言編譯器所做的,將局部變量放到堆或棧中的操作,只能自行實現。

參數的傳遞是靠寄存器和堆棧來完成的。高級語言中,子程序(函數、過程,或類似概念的東西)依賴于堆和棧來傳遞。

讓我們來簡單地分析一下一般高級語言的子程序的執行過程。無論C、C++、BASIC、Pascal,這一部分基本都是一致的。

調用者將子程序執行完成時應返回的地址、參數壓入堆棧 子程序使用BP指針+偏移量對棧中的參數尋址,并取出、完成操作 子程序使用RET或RETF指令返回。此時,CPU將IP置為堆棧中保存的地址,并繼續予以執行

毋庸置疑,堆棧在整個過程中發揮著非常重要的作用。不過,本質上對子程序最重要的還是返回地址。如果子程序不知道這個地址,那么系統將會崩潰。

調用子程序的指令是CALL,對應的返回指令是RET。此外,還有一組指令,即ENTER和LEAVE,它們可以幫助進行堆棧的維護。

CALL指令的參數是被調用子程序的地址。使用宏匯編的時候,這通常是一個標號。CALL和RET,以及ENTER和LEAVE配對,可以實現對于堆棧的自動操作,而不需要程序員進行PUSH/POP,以及跳轉的操作,從而提高了效率。

作為一個編譯器的實現實例,我用Visual C++編譯了一段C++程序代碼,這段匯編代碼是使用特定的編譯選項得到的結果,正常的RELEASE代碼會比它精簡得多。包含源代碼的部分反匯編結果如下(取自Visual C++調試器的運行結果,我刪除了10條int 3指令,并加上了一些注釋,除此之外,沒有做任何修改):

1: int myTransform(int nInput){
00401000 push ebp          ; 保護現場原先的EBP指針
00401001 mov ebp,esp
2: return (nInput*2 + 3) % 7;
00401003 mov eax,dword ptr [nInput] ; 取參數
00401006 lea eax,[eax+eax+3]    ; LEA比ADD加法更快
0040100A cdq            ; DWORD->QWORD(擴展字長)
0040100B mov ecx,7         ; 除數
00401010 idiv eax,ecx        ; 除
00401012 mov eax,edx        ; 商->eax(eax中保存返回值)
3: }
00401014 pop ebp          ; 恢復現場的ebp指針
00401015 ret            ; 返回
; 此處刪除10條int 3指令,它們是方便調試用的,并不影響程序行為。
4:
5: int main(int argc, char* argv[])
6: {
00401020 push ebp          ; 保護現場原先的EBP指針
00401021 mov ebp,esp
00401023 sub esp,10h        ; 為取argc, argv修正堆棧指針。
7: int a[3];
8: for(register int i=0; i<3; i++){
00401026 mov dword ptr [i],0    ; 0->i
0040102D jmp main+18h (00401038)  ; 判斷循環條件
0040102F mov eax,dword ptr [i]   ; i->eax
00401032 add eax,1         ; eax ++
00401035 mov dword ptr [i],eax   ; eax->i
00401038 cmp dword ptr [i],3    ; 循環條件: i與3比較
0040103C jge main+33h (00401053)  ; 如果不符合條件,則應結束循環
9: a[i] = myTransform(i);
0040103E mov ecx,dword ptr [i]   ; i->ecx
00401041 push ecx          ; ecx (i) -> 堆棧
00401042 call myTransform (00401000); 調用myTransform
00401047 add esp,4         ; esp+=4: 在堆中的新單元
                  ; 準備存放返回結果
0040104A mov edx,dword ptr [i]   ; i->edx
0040104D mov dword ptr a[edx*4],eax ; 將eax(myTransform返回值)
                  ; 放回a[i]
10: }
00401051 jmp main+0Fh (0040102f)  ; 計算i++,并繼續循環
11: return 0;
00401053 xor eax,eax        ; 返回值應該是0
12: }
00401055 mov esp,ebp        ; 恢復堆棧指針
00401057 pop ebp          ; 恢復BP
00401058 ret            ; 返回調用者(C++運行環境)

上述代碼確實做了一些無用功,當然,這是因為編譯器沒有對這段代碼進行優化。讓我們來關注一下這段代碼中,是如何調用子程序的。不考慮myTransform這個函數實際進行的數值運算,最讓我感興趣的是這一行代碼:

00401003 mov eax,dword ptr [nInput] ; 取參數

這里nInput是一個簡簡單單的變量符號嗎?Visual C++的調試器顯然不能告訴我們答案——它的設計目標是為了方便程序調試,而不是向你揭示編譯器生成的代碼的實際構造。我用另外一個反匯編器得到的結果是:

00401003 mov eax,dword ptr [ebp+8]  ; 取參數

這和我們在main()中看到的壓棧順序是完全吻合的(注意,程序運行到這個地方的時候,EBP=ESP)。main()最終將i的值通過堆棧傳遞給了myTransform()。

剖析上面的程序只是說明了我前面所提到的子程序的一部分用法。對于匯編語言來說,完全沒有必要拘泥于結構化程序設計的框架(在今天,使用匯編的主要目的在于提高執行效率,而不是方便程序的維護和調試,因為匯編不可能在這一點上做得比C++更好)。考慮下面的程序:

void myTransform1(int nCount, char* sBytes){
 for(register int i=1; i<nCount; i++)
  sBytes[i] += sBytes[i-1];
 for(i=0; i<nCount; i++)
  sBytes[i] <<= 1;
}
void myTransform2(int nCount, char* sBytes){
 for(register int i=0; i<nCount; i++)
  sBytes[i] <<= 1;
}

很容易看出,這兩個函數包含了公共部分,即

for(i=0; i<nCount; i++)
  sBytes[i] <<= 1;

目前,還沒有編譯器能夠做到將這兩部分合并。依然沿用剛才的編譯選項,得到的反匯編結果是(同樣地刪除了int 3):

1: void myTransform1(int nCount, char* sBytes){
00401000 push ebp
00401001 mov ebp,esp
00401003 push ecx
2: for(register int i=1; i<nCount; i++)
00401004 mov dword ptr [i],1
0040100B jmp myTransform1+16h (00401016)
0040100D mov eax,dword ptr [i]
00401010 add eax,1
00401013 mov dword ptr [i],eax
00401016 mov ecx,dword ptr [i]
00401019 cmp ecx,dword ptr [nCount]
0040101C jge myTransform1+3Dh (0040103d)
3: sBytes[i] += sBytes[i-1];
0040101E mov edx,dword ptr [sBytes]
00401021 add edx,dword ptr [i]
00401024 movsx eax,byte ptr [edx-1]
00401028 mov ecx,dword ptr [sBytes]
0040102B add ecx,dword ptr [i]
0040102E movsx edx,byte ptr [ecx]
00401031 add edx,eax
00401033 mov eax,dword ptr [sBytes]
00401036 add eax,dword ptr [i]
00401039 mov byte ptr [eax],dl
0040103B jmp myTransform1+0Dh (0040100d)
4: for(i=0; i<nCount; i++)
0040103D mov dword ptr [i],0
00401044 jmp myTransform1+4Fh (0040104f)
00401046 mov ecx,dword ptr [i]
00401049 add ecx,1
0040104C mov dword ptr [i],ecx
0040104F mov edx,dword ptr [i]
00401052 cmp edx,dword ptr [nCount]
00401055 jge myTransform1+6Bh (0040106b)
5: sBytes[i] <<= 1;
00401057 mov eax,dword ptr [sBytes]
0040105A add eax,dword ptr [i]
0040105D mov cl,byte ptr [eax]
0040105F shl cl,1
00401061 mov edx,dword ptr [sBytes]
00401064 add edx,dword ptr [i]
00401067 mov byte ptr [edx],cl
00401069 jmp myTransform1+46h (00401046)
6: }
0040106B mov esp,ebp
0040106D pop ebp
0040106E ret
7:
8: void myTransform2(int nCount, char* sBytes){
00401070 push ebp
00401071 mov ebp,esp
00401073 push ecx
9: for(register int i=0; i<nCount; i++)
00401074 mov dword ptr [i],0
0040107B jmp myTransform2+16h (00401086)
0040107D mov eax,dword ptr [i]
00401080 add eax,1
00401083 mov dword ptr [i],eax
00401086 mov ecx,dword ptr [i]
00401089 cmp ecx,dword ptr [nCount]
0040108C jge myTransform2+32h (004010a2)
10: sBytes[i] <<= 1;
0040108E mov edx,dword ptr [sBytes]
00401091 add edx,dword ptr [i]
00401094 mov al,byte ptr [edx]
00401096 shl al,1
00401098 mov ecx,dword ptr [sBytes]
0040109B add ecx,dword ptr [i]
0040109E mov byte ptr [ecx],al
004010A0 jmp myTransform2+0Dh (0040107d)
11: }
004010A2 mov esp,ebp
004010A4 pop ebp
004010A5 ret
12:
13: int main(int argc, char* argv[])
14: {
004010B0 push ebp
004010B1 mov ebp,esp
004010B3 sub esp,0CCh
15: char a[200];
16: for(register int i=0; i<200; i++)a[i]=i;
004010B9 mov dword ptr [i],0
004010C3 jmp main+24h (004010d4)
004010C5 mov eax,dword ptr [i]
004010CB add eax,1
004010CE mov dword ptr [i],eax
004010D4 cmp dword ptr [i],0C8h
004010DE jge main+45h (004010f5)
004010E0 mov ecx,dword ptr [i]
004010E6 mov dl,byte ptr [i]
004010EC mov byte ptr a[ecx],dl
004010F3 jmp main+15h (004010c5)
17: myTransform1(200, a);
004010F5 lea eax,[a]
004010FB push eax
004010FC push 0C8h
00401101 call myTransform1 (00401000)
00401106 add esp,8
18: myTransform2(200, a);
00401109 lea ecx,[a]
0040110F push ecx
00401110 push 0C8h
00401115 call myTransform2 (00401070)
0040111A add esp,8
19: return 0;
0040111D xor eax,eax
20: }
0040111F mov esp,ebp
00401121 pop ebp
00401122 ret

非常明顯地,0040103d-0040106e和00401074-004010a5這兩段代碼存在少量的差別,但很顯然只是對寄存器的偏好不同(編譯器在優化時,這可能會減少堆棧操作,從而提高性能,但在這里只是使用了不同的寄存器而已)

對代碼進行合并的好處是非常明顯的。新的操作系統往往使用頁式內存管理。當內存不足時,程序往往會頻繁引發頁面失效(Page faults),從而引發操作系統從磁盤中讀取一些東西。磁盤的速度趕不上內存的速度,因此,這一行為將導致性能的下降。通過合并一部分代碼,可以減少程序的大小,這意味著減少頁面失效的可能性,從而軟件的性能會有所提高?/p>

當然,這樣做的代價也不算低——你的程序將變得難懂,并且難于維護。因此,再進行這樣的優化之前,一定要注意:

優化前的程序必須是正確的。如果你不能確保這一點,那么這種優化必將給你的調試帶來極大的麻煩。 優化前的程序實現最好是最優的。仔細檢查你的設計,看看是否已經使用了最合適(即,對于此程序而言最優)的算法,并且已經在高級語言許可的范圍內進行了最好的實現。 優化最好能夠非常有效地減少程序大小(例如,如果只是減少十幾個字節,恐怕就沒什么必要了),或非常有效地提高程序的運行速度(如果代碼只是運行一次,并且只是節省幾個時鐘周期,那么在多數場合都沒有意義)。否則,這種優化將得不償失。4.2 中斷

中斷應該說是一個陳舊的話題。在新的系統中,它的作用正在逐漸被削弱,而變成操作系統專用的東西。并不是所有的計算機系統都提供中斷,然而在x86系統中,它的作用是不可替代的。

中斷實際上是一類特殊的子程序。它通常由系統調用,以響應突發事件。

例如,進行磁盤操作時,為了提高性能,可能會使用DMA方式進行操作。CPU向DMA控制器發出指令,要求外設和內存直接交換數據,而不通過CPU。然后,CPU轉去進行起他的操作;當數據交換結束時,CPU可能需要進行一些后續操作,但此時它如何才能知道DMA已經完成了操作呢?

很顯然不是依靠CPU去查詢狀態——這樣DMA的優勢就不明顯了。為了盡可能地利用DMA的優勢,在完成DMA操作的時候,DMA會告訴CPU“這事兒我辦完了”,然后CPU會根據需要進行處理。

這種處理可能很復雜,需要若干條指令來完成。子程序是一個不錯的主意,不過,CALL指令需要指定地址,讓外設強迫CPU執行一條CALL指令也違背了CPU作為核心控制單元的設計初衷。考慮到這些,在x86系統中引入了中斷向量的概念。

中斷向量表是保存在系統數據區(實模式下,是0:0開始的一段區域)的一組指針。這組指針指向每一個中斷服務程序的地址。整個中斷向量表的結構是一個線性表。

每一個中斷服務有自己的唯一的編號,我們通常稱之為中斷號。每一個中斷號對應中斷向量表中的一項,也就是一個中斷向量。外設向CPU發出中斷請求,而CPU自己將根據當前的程序狀態決定是否中斷當前程序并調用相應的中斷服務。

不難根據造成中斷的原因將中斷分為兩類:硬件中斷和軟件中斷。硬件中斷有很多分類方法,如根據是否可以屏蔽分類、根據優先級高低分類,等等。考慮到這些分類并不一定科學,并且對于我們介紹中斷的使用沒有太大的幫助,因此我并不打算太詳細地介紹它(在本教程的高級篇中,關于加密解密的部分會提到某些硬件中斷的利用,但那是后話)。

在設計操作系統時,中斷向量的概念曾經帶來過很大的便利。操作系統隨時可能升級,這樣,通過CALL來調用操作系統的服務(如果說每個程序都包含對于文件系統、進程表這些應該由操作系統管理的數據的直接操作的話,不僅會造成程序的臃腫,而且不利于系統的安全)就顯得不太合適了——沒人能知道,以后的操作系統的服務程序入口點會不會是那兒。軟件中斷的存在為解決這個問題提供了方便。

對于一臺包含了BIOS的計算機來說,啟動的時候系統已經提供了一部分服務,例如顯示服務。無論你的BIOS、顯示卡有多么的“個性”,只要他們和IBM PC兼容,那么此時你肯定可以通過調用16(10h)號中斷來使用顯示服務。調用中斷的指令是


int 中斷號
 

這將引發CPU去調用一個中斷。CPU將保存當前的程序狀態字,清除Trap和Interrupt兩個標志,將即將執行的指令地址壓入堆棧,并調用中斷服務(根據中斷向量表)。

編寫中斷服務程序不是一件容易的事情。很多時候,中斷服務程序必須寫成可重入代碼(或純代碼,pure code)。所謂可重入代碼是指,程序的運行過程中可以被打斷,并由開始處再次執行,并且在合理的范圍內(多次重入,而不造成堆棧溢出等其他問題),程序可以在被打斷處繼續執行,并且執行結果不受影響。

由于在多線程環境中等其他一些地方進行程序設計時也需要考慮這個因素,因此這里著重講一下可重入代碼的編寫。

可重入代碼最主要的要求就是,程序不應使用某個指定的內存地址的內存(對于高級語言來說,這通常是全局變量,或對象的成員)。如果可能的話,應使用寄存器,或其他方式來解決。如果不能做到這一點,則必須在開始、結束的時候分別禁止和啟用中斷,并且,運行時間不能太長。

下面用C語言分別舉一個可重入函數,和兩個非可重入函數的例子(注. 這些例子應該是在某本多線程或操作系統的書上看到的,遺憾的是我想不起來是哪本書了,在這里先感謝那位作者提供的范例):

可重入函數:

void strcpy(char* lpszDest, char* lpszSrc){
 while(*dest++=*src++);
 *dest=0;
}

非可重入函數

char cTemp;                  // 全局變量
void SwapChar(char* lpcX, char* lpcY){
 cTemp = *lpcX; *lpcX = *lpcY; lpcY = cTemp; // 引用了全局變量,在分享內存的多個線程中可能造成問題
}

非可重入函數

void SwapChar2(char* lpcX, char* lpcY){
 static char cTemp;              // 靜態變量
 cTemp = *lpcX; *lpcX = *lpcY; lpcY = cTemp; // 引用了靜態變量,在分享內存的多個線程中可能造成問題
}

中斷利用的是系統的棧。棧操作是可重入的(因為棧可以保證“先進后出”),因此,我們并不需要考慮棧操作的重入問題。使用宏匯編器寫出可重入的匯編代碼需要注意一些問題。簡單地說,干脆不要用標號作為變量是一個不錯的主意。

使用高級語言編寫可重入程序相對來講輕松一些。把持住不訪問那些全局(或當前對象的)變量,不使用靜態局部變量,堅持只適用局部變量,寫出的程序就將是可重入的。

書歸正傳,調用軟件中斷時,通常都是通過寄存器傳進、傳出參數。這意味著你的int指令周圍也許會存在一些“幫手”,比如下面的代碼:

mov ax, 4c00h
int 21h

就是通過調用DOS中斷服務返回父進程,并帶回錯誤反饋碼0。其中,ax中的數據4c00h就是傳遞給DOS中斷服務的參數。

到這里,x86匯編語言的基礎部分就基本上講完了,《簡明x86匯編語言教程》的初級篇——匯編語言基礎也就到此告一段落。當然,目前為止,我只是蜻蜓點水一般提到了一些學習x86匯編語言中我認為需要注意的重要概念。許多東西,包括全部匯編語句的時序特性(指令執行周期數,以及指令周期中各個階段的節拍數等)、功能、參數等等,限于個人水平和篇幅我都沒有作詳細介紹。如果您對這些內容感興趣,請參考Intel和AMD兩大CPU供應商網站上提供的開發人員參考。

在以后的簡明x86匯編語言教程中級篇和高級篇中,我將著重介紹匯編語言的調試技術、優化,以及一些具體的應用技巧,包括反跟蹤、反反跟蹤、加密解密、病毒與反病毒等等。


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 可以看av的网站 | 欧美中文字幕在线播放 | 开心激情av| 成人网站免费看黄a站视频 欧美性猛交xxxx黑人 | 日本极度另类 | 国产在线导航 | 三级网站视频 | 好紧好湿好爽免费视频 | 91视频久久久| 亚洲阿v天堂 | 女人扒开腿让男人桶到爽 | 久久久婷婷成人综合激情 | 国产一区视频网站 | 久久久aa | 性欧美牲交xxxxx视频 | 波多野结衣一区二区三区在线观看 | www一区二区www免费 | 久久久久国产一区二区三区四区 | 久久久精品国产免大香伊 | 黑人干亚洲| av中文字幕观看 | 亚洲成人激情在线 | 夜夜爽夜夜叫夜夜高潮漏水 | 警花av一区二区三区 | 蜜臀av在线免费观看 | 欧美激情性做爰免费视频 | 欧美aaa在线观看 | 亚洲xx站 | 亚洲精品系列 | 毛片天天看 | 超碰97人人草 | 亚洲国产成人久久综合一区77 | 国产精品午夜无码体验区 | 日本日皮视频 | 久久久成人999亚洲区美女 | 一级黄色在线 | av成人免费在线 | 夜夜高潮夜夜爽夜夜爱爱 | 中文精品视频 | 少妇高潮久久久久久潘金莲 | 久久55| 成人片免费视频 | 成人午夜高潮a∨猛片 | 国产精品成人一区二区不卡 | 日韩污视频在线观看 | 中文字幕一区二区三区在线观看 | 久热精品视频 | 精品人伦一区二区三区四区蜜桃牛 | 日本婷婷免费久久毛片 | 国产午夜三级一二三区 | 偷窥自拍青青草 | www.17c.com喷水少妇 | 免费a级毛片在线播放 | 日韩一级二级视频 | 日本ts人妖系列在线专区 | 天堂网视频在线观看 | 91亚色网站 | 亚洲精品欧美二区三区中文字幕 | 成人av观看 | 69174欧美丰满少妇猛烈 | 女主播户外勾搭啪啪 | 国产精品久久久久久久久久精爆 | 九九九九久久久久 | 国产精品初高中害羞小美女文 | 亚洲国产精品综合久久网各 | 狠狠色狠狠色综合网 | 亚洲iv一区二区三区 | 午夜三级影院 | 日韩成人av片 | 美女福利片 | 久草在线视频网 | 国产人妖视频 | 午夜爽视频 | 精品成人av一区二区三区 | 亚洲 精品 主播 自拍 | 天堂a区 | 亚洲成色777777女色窝 | 绯色av粉嫩av蜜臀av | 国产97在线 | 亚洲 | 正在播放adn156松下纱荣子 | 国产极品美女高潮抽搐免费网站 | 牛牛超碰 | 亚洲男人天堂2020 | 污污免费观看 | 一级一级特黄女人精品毛片 | av免费在线观看网站 | 天堂av国产夫妇精品自在线 | 亚洲国产影院 | 国产精品综合一区二区三区 | 国产精品九 | 日本涩涩网站 | 亚洲国产精品久久人人爱 | 99久久精品国产亚洲 | 伊人久久视频 | 大胸女上下晃奶视频 | 沈阳熟女露脸对白视频 | 超乳hitomi在线播放痴汉 | 欧洲美熟女乱又伦av影片 | 中文字幕一区二区三区在线乱码 | 香蕉成人伊视频在线观看 | 91天堂网| 一二三区不卡 | 国产suv精品一区二区883 | 国产精品理论片在线观看 | 亚l州综合另中文字幕 | 亚洲三区av | 免费的黄色影片 | 日本大胆欧美人术艺术 | 激情小说图片视频 | 国产人妻人伦精品1国产丝袜 | 日韩欧av| 国产片久久久 | 91国偷自产一区二区使用方法 | 亚洲成a人一区二区三区 | 国产日韩在线免费观看 | 最新av观看 | 131mm少妇做爰视频 | 色偷偷888欧美精品久久久 | 青青草在线视频免费观看 | 日韩一区二区三区不卡 | 日本大乳奶做爰洗澡三级 | 日本福利在线观看 | 天天av天天操 | 久色在线| 亚洲成av人的天堂在线观看 | 久久久成| 国产精品igao视频网入口 | 999成人网 | 日本羞羞网站 | 538国产精品视频一区二区 | 人人爱人人射 | 国产午夜手机精彩视频 | 婷婷国产天堂久久综合五月 | 一区一区三区四区产品动漫 | 少妇综合网 | 欧美性受xxxx | 亚洲黄色片免费看 | 粉嫩av一区二区三区入口 | 国产精品二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 欧美三级a做爰在线观看 | 五月婷婷啪啪 | 波霸ol色综合久久 | 中文中幕a在线 | 国产无套水多在线观看 | 日本一区二区三区在线视频 | 老汉av网站 | 偷偷操网站 | 国产精品女人和拘 | 亚洲日本va在线视频观看 | 成熟丰满熟妇高潮xxxxx视频 | 毛片在线免费观看网站 | 国产精品久久久久久久久久免费看 | 中文字幕精品三级久久久 | av不卡在线看 | 国产综合av| 日韩精品你懂的 | 九色丨9lpony丨大学生 | 我的邻居在线观看 | 国产片淫级awww | 少妇又紧又色又爽又刺激视频 | 亚洲欧洲日产国码久在线 | 久久亚洲私人国产精品 | 欧美最猛黑人xxxx黑人猛交98 | 成人国产一区二区三区 | 欧美日韩一区二区三区在线 | 九色视频91 | 欧美激情性生活 | 国产一区二区三区四区 | 97婷婷狠狠成为人免费视频 | 久久久社区 | 中文字幕第五页 | 国产精品欧美一区二区三区 | 精品无码日韩国产不卡av | 精品久久一二三区 | jizz色| 亚洲综合一二三 | 亚洲精品国产乱码在线看蜜月 | 久热这里只有精品6 | 在线无码va中文字幕无码 | а√中文在线8 | 爆操无毛白虎 | 狠狠色丁香婷婷久久综合 | jizz毛片| 13一15女人毛片 | 亚洲一区二区av在线观看 | 上海富婆spa又高潮了 | 国内精品国产三级国产aⅴ久 | 色01看片网 | 红桃17c视频永久免费入口 | 91福利免费视频 | 欧美午夜一区二区福利视频 | 国产精品视频资源 | 欧美jizz18性欧美 | 在线无码免费的毛片视频 | 超碰97人人在线 | 毛茸茸熟妇丰满张开腿呻吟性视频 | 华人永久免费视频 | 国产69精品久久久久999小说 | 97人人精品| 亚洲毛片精品 | 亚洲狠狠色丁香婷婷综合 | 日本少妇中文字幕 | 成人亚洲国产精品一区不卡 | 精品国产sm最大网站 | 国产精品国语对白 | 另类亚洲小说图片综合区 | 成人激情小视频 | 国产精品欧美综合 | 国产一级特黄aaa大片 | 日韩在线播放一区二区 | 亚洲区视频在线观看 | 新搬来的女邻居麻豆av评分 | 日韩欧美手机在线 | 2023精品国色卡一卡二 | 欧美性生交大片免费看 | 国产午夜精品一区二区三区 | 免费手机av | 国产一区二区三区免费 | 国产无遮挡裸体免费视频在线观看 | 亚洲人成在线播放网站 | 少妇人妻丰满做爰xxx | 欧美国产激情18 | 黑人玩弄人妻中文在线 | 日韩1级片 | 女女百合av大片一区二区三区九县 | 午夜爽爽影院 | 国产精品一区二区视频 | 福利在线视频导航 | 日韩欧美一区在线观看 | 亚洲啪| www91在线观看 | 人人妻在人人 | 色综合久久88色综合天天提莫 | 四虎在线网址 | 国内a∨免费播放 | 久久综合第一页 | 毛片免费全部无码播放 | 久久疯狂做爰流白浆xx | 欧美人狂配大交3d怪物一区 | 日韩精品视频在线观看一区二区三区 | 国产亚洲第一伦理片在线c 国产亚洲精品久久久久动 国产亚洲精品久久久久久大师 | 日本中文在线 | 男女草比视频 | 好吊妞精品视频 | 久草在线视频福利资源站 | 欧美性生交大片免费视频 | 成人免费影片在线观看 | 国产偷窥熟女精品视频 | 天天操婷婷| 欧美性猛交久久久乱大交小说 | 日本全棵写真视频在线观看 | 裸体欧美bbbb极品bbbb | 国产精品亚洲日韩欧美色窝窝色欲 | 秋霞成人午夜鲁丝一区二区三区 | 国产 欧美 视频一区二区三区 | 亚洲熟妇毛茸茸 | 亚洲国产色图 | 久久亚洲精品成人av | 成人羞羞国产免费软件动漫 | 伊人夜色| 操人视频免费 | 欧美激情网站 | av无码免费永久在线观看 | 欧美国产精品日韩在线 | 国产九色蝌蚪 | 欧美性娇小| 亚洲精品国偷拍自产在线观看 | 国产四区 | 日本亲与子乱ay中文 | 亚洲一区二区福利视频 | 男女深夜福利 | 精品一区二区免费看 | 免费看黄色三级三级 | 缅甸午夜性猛交xxxx | 天天干夜夜爽 | 沈阳45老熟女高潮喷水亮点 | 久草在线新时代的视觉体验 | 99在线精品视频观看 | 成人一级黄色片 | 国产精品96久久久久久又黄又硬 | 国产又粗又猛又爽又黄的免费视频 | а√在线中文网新版地址在线 | 国产精品黄视频 | 精品九九九 | 久久久久亚洲精品无码网址 | 少妇小芸h系列小说 | 天堂av中文网 | 国产无遮挡裸体免费视频在线观看 | 日本黄色三级 | 国产精品国色综合久久 | 少妇又紧又色又硬又爽 | 日产精品高潮呻吟av久久 | 99热久久这里只精品国产www | av亚州| 日本乱偷互换人妻中文字幕 | 99av成人精品国语自产拍 | 久久天堂 | 青青免费视频在线 | 日韩性av| 欧美自偷自拍 | 天天插伊人 | 99久re热视频这里只有精品6 | 老司机成人网 | www,欧美| 久久久久se色偷偷亚洲精品av | 91视频免费视频 | 亚洲午夜视频在线观看 | 国产露脸精品国产沙发 | 九九热爱视频精品视频 | 免费毛片a| 成人精品在线播放 | 国产又爽又大又黄a片 | 日韩国产精品一区 | av免费观看在线 | 精品日产乱码久久久久久仙踪林 | www.在线观看av | 国产a级全部精品 | 久久久毛片| 本站只有精品 | 色噜噜狠狠狠狠色综合久一 | 香蕉视频在线观看网址 | 91视频蝌蚪| 天天操天天操天天操天天 | 青青青手机在线视频 | 久久精品三级 | 亚洲va欧美va久久久久久久 | 久久久午夜精品 | 亚洲已满18点击进入在线看片 | 韩国三级丰满少妇高潮 | 黄网站色 | 92看片淫黄大片看国产片图片 | 182tv成人福利视频免费看 | 五月天综合视频 | 亚洲成人激情在线 | 国产成人精品一区二区三区免费 | 精品国产乱码久久久久久虫虫 | 曰本女人与公拘交酡免费视频 | 国产成人精品亚洲7777 | 亚洲情综合五月天 | 日本高清熟妇老熟妇 | 亚洲青青草原 | 石榴视频成人在线观看 | 国产精成人品日日拍夜夜免费 | 国产成人在线免费视频 | 精品视频www | 亚洲精品一区二区三区98年 | 偷窥村妇洗澡毛毛多 | www夜夜爱| 校园春色自拍偷拍 | 中国美女毛茸茸撒尿 | 久久久久国产一区二区三区 | 国产一区二区三区四区精 | 妇女伦子伦视频高清在线 | 国产精品国产精品国产专区不蜜 | 欧美野外疯狂做受xxxx高潮 | 青青草香蕉 | 日韩丝袜一区 | 在线成人播放 | 欧美日韩在线视频 | 激情婷婷丁香 | 黑人精品一区二区 | 中国挤奶哺乳午夜片 | 久久视频这里只有精品 | 国产精品xxx在线观看 | 国产精品无需播放器在线观看 | 国产chinese | 手机看片1024在线 | 国产黄色片免费观看 | 91视频美女| 日本特黄特色a大片免费高清观看视频 | 国产麻传媒精品国产av | 高清久久久 | 日韩视频免费播放 | 久久99热这里只频精品6 | 懂色av中文一区二区三区 | 天天摸日日干 | 国产精品一品二区三区的使用体验 | 成人午夜视频在线免费观看 | 欧美日本另类 | 少妇熟女视频一区二区三区 | 全肉乱妇杂乱视频在线观看 | 一区二区三区国产视频 | 少妇真实被内射视频三四区 | av不卡一区 | 国产精品久久久久久亚洲影视 | 91传媒入口 | 最近免费中文字幕mv在线视频3 | 黑人vs日本人ⅹxxxhd | 欧美性第一页 | 九九热视频在线播放 | 久久艹久久 | 国产人妖视频一区二区 | 午夜一级视频 | 亚洲天堂在线视频播放 | 天天射天天干天天色 | 精品亚洲成a人在线观看 | 可以直接免费观看的av网站 | 三级福利视频 | 日日摸夜夜添夜夜添毛片av | 欧美一a一片一级一片 | 亚洲精品午夜久久久久久久灵蛇爱 | 欧美孕妇孕交黑巨大网站 | 亚洲 日本 欧美 中文幕 | 九九在线免费视频 | 久久国产精品久久久久久 | 精品久久久噜噜噜久久久 | 就要操av | 国产亚洲成av片在线观看 | 日本淫片免费啪啪3 | 日本久久一区 | 久久精品 | 在线播放免费播放av片 | 国模精品一区二区三区 | 天天做日日做 | 久久国产网 | 一个色综合导航 | 制服 丝袜 激情 欧洲 亚洲 | 肉体公尝中文字幕第三部 | 亚洲色一区二区三区四区 | 国产污视频在线 | 公么大龟弄得我好舒服秀婷视频 | 少妇精品视频一区二区免费看 | 精品国产99久久久久久 | 日本亚洲精品一区二区三区 | 亚洲区小说区图片区qvod | 欧美中文字幕 | 男人边吻奶边挵进去视频 | 国产精品成熟老女人 | 亚洲人成色77777在线观看 | 五月网婷婷 | 国产手机av | 午夜精品亚洲 | 日韩一卡二卡 | 英语老师丝袜娇喘好爽视频 | 欧美在线观看网站 | 日韩六区| 鸭子tv国产在线永久播放 | 天天干视频在线观看 | 成人啪啪18免费网站 | 亚洲综合色视频 | 国产情侣自拍av | 成人蜜桃视频 | 中文字幕在线免费看线人 | 日本在线一级片 | 第五色婷婷| 老司机一区二区 | 嫖妓丰满肥熟妇在线精品 | 欧美激情精品久久久久久变态 | 亚洲一区 在线播放 | 国产丝袜一区二区三区免费视频 | 久久久美女视频 | 91成人久久 | 国产区视频在线观看 | 91porny在线| 婷婷综合精品 | 98国产精品综合一区二区三区 | 探花视频在线免费观看 | 久久人妻无码中文字幕 | 欧美一区二区三区激情视频 | 国产午夜成人久久无码一区二区 | 97久人人做人人妻人人玩精品 | 中文字字幕在线中文 | 欧美深夜福利视频 | 日本少妇翘臀后式gif动态图 | a天堂资源在线 | 大尺度激情吻胸视频 | 国产人妻久久精品二区三区老狼 | 18视频在线观看网站 | 亚洲人成网站18禁止人 | 狂猛欧美激情性xxxx大豆行情 | 天天看国91产在线精品福利桃色 | 成人妇女免费播放久久久 | 中文字幕在线观看线人 | 成年人午夜视频 | 国产a国产片国产 | 美女拉屎视频pooping | 好吊操这里只有精品 | 清清草视频 | 久久免费视频1 | 91啪在线| 国产在线无码精品电影网 | 一区二区三区日本久久九 | 日韩另类片 | 夜夜春夜夜爽 | www视频在线观看免费 | 欧美xxxx胸大| 香蕉久久久久久av成人 | 每日更新av | 中文字幕日韩av | sese综合| 欧美野外疯狂做受xxxx高潮 | 人人草人人爱 | 羞羞成人| 免费视频91| 91麻豆精品秘密 | jizz日本在线观看 | 偷拍av网| 日本无码人妻精品一区二区蜜桃 | 两个人做羞羞的视频 | 啪啪综合网 | 色综合久久天天综合网 | 国产911| 欧美福利第一页 | 亚洲成人高清在线 | 欧美自拍区 | av导航网址 | 欧美午夜性春猛交xxxx按摩师 | jizzxxxx18高清喷水 | 91蜜臀精品国产自偷在线 | 福利二区视频 | av在线麻豆| 国产伦理av| 国产精品亚洲精品日韩已满 | 国语对白做受xxxxx在线中国 | 国产精品夜夜春夜夜爽 | 五月婷婷六月香 | 日本欧美在线观看视频 | 国产精品偷拍 | 久久国产精品影视 | 久久久久高潮毛片免费全部播放 | 日本免费在线播放 | 免费啪啪小视频 | 天天操夜夜躁 | 午夜寂寞福利 | 又粗又黄又硬又爽的免费视频 | jizz 亚洲大全| 欧美日韩久久久久久 | 一级片麻豆 | 黄色小视频免费观看 | 在线成人www免费观看视频 | 嫖妓丰满肥熟妇在线精品 | 精品在线视频一区 | 日韩免费高清 | 少妇坐莲好爽91 | 女人被狂躁c到高潮喷水一区二区 | 一级一级一片免费 | 欧洲熟妇色xxxx欧美老妇软件 | 亚洲精品国产a久久久久久 51国偷自产一区二区三区 | 成人午夜精品久久久久久久网站 | 欧美日韩v | 久一区二区三区 | аⅴ资源天堂资源库在线 | 成人毛片100部 | 天天干天天干天天干天天 | 亚洲熟妇毛茸茸 | 久久黄色片视频 | 葵司免费一区二区三区四区五区 | 91久久久一线二线三线品牌 | 国产精品久久久久久久久久了 | 漂亮少妇videoshd忠贞 | 干片网在线观看 | 国产午夜人做人免费视频 | 天天干天天色天天射 | 成年男人裸j网站 | 精品欧洲av无码一区二区 | 色屋永久 | 亚洲无吗在线视频 | 好爽好黄的视频 | 极品美妇后花庭翘臀娇吟小说 | 国产女人18毛片水真多1kt∧ | 国产亚洲成av人片在线观看下载 | 52avavjizz亚洲精品 | 欧美大片高清免费观看 | 日本一区二区三区高清在线观看 | 久久精品嫩草影院 | 亚洲区免费视频 | 玖玖资源站无码专区 | 国产熟妇高潮呻吟喷水 | 91麻豆精品国产91久久久使用方法 | 欧美午夜视频 | 91丨porny丨海角社区 | 小拗女一区二区三区 | 成人av片在线观看 | 少妇做爰免费视频网站色黄 | 成人精品少妇免费啪啪18 | 成人免费网视频 | 老汉色av影院 | 欧美天堂一区二区三区 | 深爱激情丁香 | 国产亚洲欧美在线视频 | 大奶子在线 | 成人精品一区二区三区在线观看 | 爱看av在线入口 | 超碰在线观看免费版 | 999久久久| 久久精品高清一区二区三区 | 美女视频黄a视频免费全程软件 | 国产精品免费看久久久 | 精品国产片一区二区三区 | 狠狠五月深爱婷婷网 | 精品国产一区二区三区av爱情岛 | 日本久久丰满的少妇三区 | 精品深夜av无码一区二区 | 欧美与黑人午夜性猛交久久久 | 强开小婷嫩苞又嫩又紧视频韩国 | 亚洲怡红院av | 欧美亚洲国产成人 | 欧美性黑人极品hd | 加勒比成人在线 | 欧美色视频在线 | 大屁股大乳丰满人妻 | 欧美毛片在线 | 成人精品三级av在线看 | 国产乱人伦av在线无码 | 涩涩成人 | 欧美一区二区视频在线 | 精品无码久久久久久久久水蜜桃 | 国产人妻人伦精品1国产丝袜 | 在线观看福利视频 | 久久亚洲一区二区三区成人国产 | 久久综合色鬼综合色 | 中国少妇内射xxxx狠干 | 亚洲欧美黄色片 | 亚洲麻豆 |