青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

聚星亭

吾笨笨且懶散兮 急須改之而奮進
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

笨鳥先飛學編程系列之一理解程序中的數據

       說實話,我還沒有想好這個系列到底該怎么講,今天下午粗略的想了下,我覺得程序都是靠代碼來操作數據的,所以,我就起了這么個破標題。由于我本身水平實在是菜的可以,所以我理解的絕對不可能一點錯誤沒有,只希望能通過我寫的這些文字讓更多的入門編程這個精彩的世界,倘若讀者發現我寫的有錯誤的地方,一定要回帖告知我改之,以免誤人子弟,再次謝過。

 

       先說一下這篇文字主要內容。

  1. 什么是數據及其在電腦中的存儲方式。
  2. 數據類型 —— 區分數據的唯一指標。
  3. 變量的定義和使用方法。
  4. 結束語。

 

下面開始進入正題。

一、           什么是數據及其在電腦中的存儲方式。

學過計算機基礎知識的朋友,尤其是學過編程的朋友,一定知道,現在的CPU是只認識二進制數據的,也只能進行二進制的數值運算,在實際操作中,由于二進制太過煩瑣,而且容易失誤,外加上十六進制與二進制之間在轉換有很多的方便,所以一般的用十六進制表示其二進制數值:因此,我們看到的一些編輯器,調試器等分析出來的機器碼都是十六進制的。(事無巨細,如果不明白十六進制、十進制、二進制等概念的朋友,請自行百度進制轉換原反補碼

1.         什么是數據。

好現在讓我們開下OD,看看下它分析出來的數據是什么模樣:

         

如果你細心觀察,就會發現,OD的數據視圖中,用一些虛豎線,將這些數據每4個一組分割開了,如上圖。

讓我們再看下通用寄存器、看堆棧,如下圖:

            

也都是4個一組,為什么呢?

現在主流的 操作系統 如(X86 XPSP6 OS)都是32位的操作系統,這些操作系統在32位的硬件環境下,能夠直接處理32位的數據,而且,數據以32位的單位對齊運行速度也是最快的,如果大家熟悉各進制之間轉換的話,應該知道,十六進制與二進制之間的轉換格式是14,就是說,1個十六進制的數能代表4位二進制的數據,(0xFF 就是二進制的 1111 1111),八個十六進制的數就是32位了!

      

2.         數據在電腦中的存儲方式

這些數據在存放到內存里的時候,有兩種存放方式,學名字叫:Big Endian Little Endian

 

這兩個存取方式決定了內存存放數據的原則是 高高低低 原則 還是 高低低高 原則,比如:我有一個數據,是0xA5A1,它在存放到內存中是怎樣存放的呢?如果存成A5A1那就是高高低低存放的,如上圖選中的部分,因為在我們平時的書寫中,A5是高位,A1在低位,存放到內存中的時候,如上圖,A1存放在00438400這個位置,而A5存放在00438401這個位置,高位存放在內存的高地址中,低位存放在低地址中,這種方式就是Little Endian,另一種方式就是Big Endian,現在絕大多數都是使用Little Endian 方式存放的(至今我還沒有見到過Big Endian方式存數的數據。),如上圖中大家看到的A1A50000這個數據,其實它的真實的內容是:0x0000A5A1

 

到這里大家可能有個疑問:如果我要存一堆小的數據,每個數據都在內存里占4個字節的位置,是不是太占資源了啊!再說,如果我要存放的一個數據遠大于0xFFFFFFFF,怎么辦啊,如果我要存放的數據是:0x0089D8F4D326849A,在內存是會是什么樣子呢?如下圖:

 

 

如果我們按照我們剛才的分析方法,這個64位的大數就被分成了兩個數:0xD326849A0x0089D8F4 這顯然是錯誤的,那我們怎么來表示,怎么才能不讓程序讀一個錯誤的數據出來呢?那就要提前規定好數據的大小。

二、           數據類型 —— 區分數據的唯一指標。

通過上一章節的講解,我們知道,要想完整的讀取出一個數據,必須提前知道這個數據的大小。那么我們怎么知道或者怎么規定一個數據的大小呢?本小節就來解決這個問題。

1.         什么是數據類型。

在日常生活中,我們經常把一些物品,事物歸類處理,由此我們可以大概的猜測出來數據類型它的作用是什么。

數據類型的作用就是讓程序知道自己要從內存里讀多大的一個數據出來!比如上圖中的大數,我可以只讀一個0x9A出來,也可以讀0x849A等等。

 

如果大家有看過編程相關的書,那一定看到過什么整型,字符型,邏輯布爾型,數組,結構體類型,等等一大堆!再什么時候該用什么類型,在不同類型的數據之間進行相互轉換的時候,犯愁了,不知道怎么樣轉換才合法,怎么樣轉換數據才能正常?

 

在一小節,我們就來剖析一下我們常見的數據類型。

 

其實,我們沒有必要關心那么多數據類型的,只要知道,數據類型就是定義數據的大小,這一句就足夠了:

Ø         BYTE就是一個字節的大小,如上圖中9A就是一個BYTE類型的數據,

Ø         int ,DWORD就是兩個字節的大小,如上圖中849A就是個DWORD或者int類型的數據

Ø         其它更大的類型(如INT64 等)……

 

以后,在編程的時候,當我們需要進行類型轉換的時候,只要知道,小的數據類別往大數據類別上轉換沒有問題,反過來由于內存分配的空間不夠就會導致數據丟失,精確度不高等問題!

 

下面我們來看一下小數(浮點類型:float)在內存里的表示方法:

            

大家看到,這個表示的數據,貌似不是小數啊,而且這個數據,跟上面圖中的數據沒有什么區別啊,都是一個模樣……

 

讓我們在換個視圖,在OD的數據區右擊,選擇float,如下圖:



數據變成這個樣子了:

 哈哈,這樣就清楚了,我們的數據是圓周率(至于小數與十六進制轉換的問題,大家可以自行百度,這里不做具體講解)。

 

到這里,我們就又知道數據類型的另一個作用:數據類型就是規定數據的表現形式,同樣的內存數據,它可以是一個整數也可以是一個小數,甚至是一個字母或者漢字……

 

為了證明這一點,我們再說一下字符,漢字等的概念:

 

就像大家如上面的小數中看到的一樣,其實電腦遠沒有人腦智能,它根本不認識什么小數,什么字符什么整數,它認識的只是10這兩個數,其它的它都不認識,因此我們說的字母,標點符號,漢字等等也都是一樣的,其實在計算機的世界里,大家看到的那些文字,其實都是寫數字,只不過是因為數據類型的特性讓它顯示成了漢字,字母等。如下圖:

                 

               如上圖,其實,大家可以看到關閉的文字,其實它的數據在內存中被表示成了:B9 D8 B1 D5

              如果大家以DWORD形式讀出來,數據就是0xD5B1D8B9,一個很大的數字!

看到上圖中的“sOK”這三個字母了嗎?他們的數據就是73 4F 4B,如果大家有ASCII表的話,一查就能知道,由此可見,其實,電腦識別字母也好,識別漢字也好,其實都是根據表硬轉換過來的,隨便一個數據,他都能轉換,順利的話,轉換出來的就是我們能識別的漢字,不順利的話,轉換出來的就是一堆亂碼……

 

如果細心的朋友,可能發現一個問題,我們說:數據類型決定了數據的大小和表現形式,那一個字符串怎么規定大小啊?難道還有4個字節大小的字符串,12個字節大小的字符串類型?

 

哈哈,其實,字符串就是一個連續的BYTE(或者char)類型的數據串,由于字符串可大可小,不可以具體規定它有多大,所以大家都規定,字符串以0結尾,如果要從內存里將數據以一個字符串的形式讀出來的話,那程序就是從字符串的第一個字符開始,一直讀到0 處,算做讀取完畢。

2.         字符編碼問題。

既然提到漢字,就不能不提Unicode編碼,很多的同學對這個編碼問題很是迷茫,總是把這個跟數據類型混淆在一起,所以我就把這兩個問題放在一起說了。

 

其實,關于字符編碼,我們在日常使用電腦是會經常遇到,應該說,我們對它是不陌生的,舉個簡單的例子:

       我們在用IE瀏覽器訪問國外站點時,經常會出現亂碼,比如在訪問一些俄語,阿拉伯語等站點時,我們經常會像下圖這樣切換編碼方式以便別看到亂碼:

不多廢話,我們進入正題。

林子大了,什么鳥都有,一樣,這個世界大了,用什么語言的人都有,無奈,計算機是有說英語的人發明的,他們在考慮計算機里面字符編碼的時候,只考慮到英語用到的字符,感覺一些字符占一個字節足夠,也沒有考慮過像中國,韓國,日本及東南亞等國的漢字錄入問題(感覺跟90年代時的千年蟲問題歸根同源~),很多的字符都不能正常的在計算機中存放,于是便有了Unicode編碼,由于原先多字節(BYTE為單位)不夠表示這么多的寬字符。

 

因此,大家就規定Unicode編碼以(WORD)為單位,存放數據,這樣每個字符就大了一倍的空間來表示字符數據,表示的范圍也就大了很多,由下面的一個圖來說明一下他們的區別吧:

            

發現他們的區別了嗎?中間多了很多的00,就這點區別,剩下的該是ASCII編碼表轉換還是這樣轉換的,沒變!

到這里,或許又有朋友郁悶了,35 00 32 00 中間有0了,結束了,那字符還怎么能正常的讀啊,這不是沖突嗎?再說,3500,跟35區別很大的,怎么都能表示5”這個字符 ???

 

呵呵,按照我們在本文開頭將的內存數據的存儲方式中Little Endian方式的高高低低原則來讀取這些字符,以WORD為單位來轉換一下這些數據,就變成了:0035 0032 0070 …… ,實質上就如同,101的區別一樣,沒有區別,唯一的區別就是表示的范圍大了……

 

由于在Unicode方式下,原先在多字節方式下占一個字節的字符都變成了占兩個字節,所以,單純的00 Unicode方式變成了 00 00 ,自然的,Unicode的字符串都是以 00 00 結尾的,這下什么就都清楚了吧!

 

當然,如果仔細想下。Unicode下的普通英文字符中間都被0隔開了呀,0asc編碼下字符串的結束符啊,電腦是怎么區別ascUnicode編碼的呀。由此,就要引出下一個問題:Unicode編碼下的字符數據類型。

 

為了減少篇幅,這里只講述一個技巧:如果字符類型的關鍵字中包含‘W’那就差不多應該是Unicode編碼的數據類型,比如WCHAR, wchar_t等等。(具體內容,建議參看:Windows via C/C++[Fifth Edition]Chapter 2: Working with Characters and Strings

3.         數據類型的小結

               數據類型:

就是定義數據的大小,和數據表現形式的一個規定,或者說一個模板,根據這個模板我們可以生成更多符合這個模板的數據!

一般的,數據類型有兩種特性,一個是它的屬性,一個是它的方法(也就是動作)。

我們拿字符串這個數據類型來講:

字符串的屬性有:

a)         字符串的大小(有多少個字符組成)

b)        字符串的結尾標志(0

字符串的方法(也就是動作)有:

a)         將十六進制的數據轉換成字符的形式顯示的控制臺上.

 

推而廣之,我們現在所講的什么面向對象變成,什么類,對象的概念,其實在像C之類面向過程的編程中已經應用到了,在C++中只是把這些做了個升級,讓我們來做了數據類型定義的工作,所謂的類,對象等其實就是數據類型和變量,換了個名字而已……

 

 在這里,或許有的朋友不明白,屬性和方法是什么概念,其實通俗點講,屬性就是變量,方法就是函數,這個我會在后面的文章中詳細講述,由于我們還有學到編程相關的知識,這里暫不描述!

 

下面進入我們的下一節,變量的使用。

三、           變量的定義和使用方法

1.         什么是變量。

估計大家都知道,我們程序訪問的數據一般的都是存放在內存或者寄存器中。自然的,如上次課所講的那些數據也都是存放在內存中的,那我們在程序中,如何使用這些內存空間呢?這就有了變量的概念。如下圖:

 

這里的00438400就是一個變量~,如果以一個字節的方式來讀的話,它是一個BYTE類型的變量,它的內容是0xA100438401的內容就是0xA5,如果以WORD類型來讀的話,00438400的內容是0xA5A1,如果以DWORD類型來讀的話,00438400的內容是0x0000A5A1,想必經過上節的學習,我們已經能夠理解這些概念了!

 

那變量的含義也就很清楚了,變量就是內存地址。學過編程的可能覺得不理解,編程高手可能就笑我不求甚解了,所以,如果我有什么理解不對的,不深刻的,還請各位大牛指教!

 

稍微熟悉點程序的人,應該知道,我們的程序被分成了代碼段,數據段,資源段,堆棧段等等……

上面我們說到過 變量就是地址,那反過來說,地址就是變量,似乎也是成立的!

比如: 我們的程序代碼是寫在內存里的,也就是說,我們的代碼也可以當作變量來使用!

 

想想我們寫程序,不就是用代碼通過變量來操作數據嗎?我們寫的程序本身就是在內存里放著的,代碼的每個字節都有一個虛擬地址與它對應,也就是說,我們的代碼本身就是一些數據。

 

從這里來看,似乎高手們講的什么鉤子,代碼自變形,甚至我們的代碼是可以放在數據區執行的等等技術,似乎也不是什么謠不可及的……

 

想必,大家對普通的變量應該有一定的認識了,這里呢,我就給出變量在C語言中的聲明和表示方法!

2.         變量的定義和使用方法。

C語言中,我們的變量聲明格式是:  

數據類型   變量名;

或者   

數據類型   變量名 = 常量;     //  常量就是一個具體的數值!

例如

int     x = 2;              //  定義了一個變量x它的內容是2

float   y = 3.14;           //  定義了一個浮點型變量,內容是3.14

在使用這些變量(xy)時,經過我們上面的定義,x就代表2這個數值,y就代表3.14這個小數,直到我們改變了它的數值為止。

3.         指針、數組、結構體

在上一節,我們講數據類型的時候,我們講過字符串類型,它是一串兒charbyte)類型的序列。如果我們要定義一個連續的字符串,那就要用到了數組的概念。

C語言中,定義一個數組變量的格式如下:

數據類型   變量名[元素個數];  

或者   

數據類型   變量名[元素個數可以留空] = {常量, [常量2|…]};  //  常量就是一個具體的數值!

比如: 

char     addrName[]    = 52pojie.cn\0;         // 定義一個字符數組,并初始化。

int      ntemp[5] = {0,2,4,6,8};              // 定義一個有個元素的整型數組,并初始化。

float    fTemp[10];                                // 聲明一個有個元素的浮點型數組,沒初始化。

比如上例中第一個字符數組,addrName[0]中的內容就是‘5addrName[1]中的內容就是‘2addrName[6]中的內容就是’e’了,依次類推!

    這個字符串它在內存中的樣子大概如下:
      

也就是說,我們的addrName[0]就是內存中的地址0x00438AC0addrName[1]就是內存中的地址0x00438AC1

這里需要說明的一點,就是,所有的變量名,函數名,對象名等等,都是它所代表的內存地址的首地址!也就是說:  addrName == addrName[0] == 0x00438AC0

好了,由于我還沒有能力寫基礎教程,所以,這里對C變量相關的基礎就說到這里,再次回到我們的主題:變量就是地址!

如果我們有一個需求,就是將我們上面聲明的這個字符串變量輸出出來,那我們的程序需要怎么寫呢?

// test.cpp : Defines the entry point for the application.

//

#include "stdio.h"

#include <windows.h>

char     addrName[] = "52pojie.cn\0";

char     *szTitle = "Null\0";

// Foward declarations of functions included in this code module:

int main()

{

     MessageBoxA(NULL, addrName , szTitle, MB_OK);

     return 0;

}

像我們搞破解搞逆向的,一定不會對這個MessageBoxA函數陌生吧~~,它反匯編的樣子大概是:

                 

               相關內存的帖圖:

                  

大家自己根據我提供的截圖,算一下上面push后面的地址的內容想必就應該很清楚的發現,我們在程序中使用的變量就是直接使用的地址,比如:

00401008  |.  68 30604000   push    00406030                         ; |Text = "52pojie.cn"

這里的00406030 就是字符串52pojie.cn的首個地址,那EAX中的是什么內容啊?應該也是地址吧~~~

我們看一下0x0040603C中的內容,也就是EAX的內容:0x00406040,再看一下0x00406040中的內容,很容易的發現,原來是“Null”,奇特吧~~~

這個就是我們C語言中說到的指針的概念,很多沒有好好學C語言的朋友可能都迷糊指針的概念,我們通過這個例子就應該可以很容易的明白,指針就是存放變量的地址的變量 或者直接說 指針就是地址的地址!

指針在C語言中的表示就是*,在匯編語言中的表示就是[],至于為什么要有指針,指針到底有什么作用,在寫程序的過程中,指針的功能到底應該怎么使用,我會在以后的指針的課題中詳細介紹!

 

              下面講一下結構體。

              如果說,數組是一串連續的相同類型數據的序列,那結構體就可以理解為一串連續的不同類型的數據的序列。

              C語言中,定義結構體的語法格式是:

struct 結構體名稱

{

基礎類型1 成員變量名1;

基礎類型2 成員變量名2;

……

}結構體變量名01, 結構體變量名02;

 

在實際使用的過程中,我們一般用typedef關鍵字來定義結構體類型(自定義數據類型),然后使用我們自己定義的數據類型來聲明結構體變量,這樣使用起來更加條例,比如:

typedef struct _GAME_OBJECT_INFO

{

     DWORD         UnKnown1[15];          //   未知 offset   0

     float         fX;                         //   X坐標    offset   0x3C

     float         fZ;                         //   Z坐標    offset   0x40

     float         fY;                         //   Y坐標    offset   0x44

     DWORD         UnKnown2[55];          //   未知 offset   0x48

     DWORD         dwSID;                      //   怪物ID   offset   0x124

     DWORD         UnKnown3[78];          //   未知 offset   0x128

     wchar_t       *wszName;              //   名字 offset   0x260

}GAME_OBJECT_INFO, *PGAME_OBJECT_INFO;

這樣我們就很容易的定義了兩個游戲對象信息的數據類型,在使用這個類型來聲明這個結構體的變量就很合規矩了。如下:

GAME_OBJECT_INFO   Goi;                             //   聲明一個結構體變量

PGAME_OBJECT_INFO  pGOI = NULL;                     //   聲明一個結構體指針

RtlZeroMemory(pGOI, sizeof(GAME_OBJECT_INFO));     //   給結構體指針初始化。

 

當然,在現在版本的C++中,它支持在結構體中使用函數(允許結構體中有成員函數),也就是說,結構體可以當做類來直接使用,深入的研究結構體可以弄明白現在C++中一些類的基礎概念,為了節省篇幅,我就不再這里牢騷了。

四、           結束語

本文講述了很多的東西,很雜,而且幾乎都不是很深入,我的表述能力有限,我自認為是用我認為最普通的方式,講述這些東西了,肯定還有很多的同學不明白我講了寫什么,我也深知我沒有能力講述更基礎的教程了,就寫到這里,希望大家能先看基礎的一些C/C++教程,然后再參考本文,以加深理解,也避免我文中錯誤的理解誤導大家。

 

              本文中肯定存在很多的錯誤,希望大家能多多指教。

Feedback

# re: 笨鳥先飛學編程系列之一理解程序中的數據  回復  更多評論   

2009-12-08 01:56 by RockHacker
牛B啊。收藏

# re: 笨鳥先飛學編程系列之一理解程序中的數據  回復  更多評論   

2010-07-22 14:11 by zanewin
1位十六進制的數能代表4位二進制的數據,四位十六進制的數就是32位了?

# re: 笨鳥先飛學編程系列之一理解程序中的數據  回復  更多評論   

2010-07-24 13:34 by besterChen
@zanewin

哦,以前有朋友跟我說過了,我忘記在博客上改了,(*^__^*) 嘻嘻……
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩视频专区在线播放| 午夜精品影院| 欧美成人午夜激情| 久久日韩粉嫩一区二区三区| 久久亚洲一区二区三区四区| 久久综合九色| 欧美看片网站| 欧美午夜精品久久久久久久| 国产麻豆精品视频| 在线观看亚洲视频| 一本大道久久a久久精二百| 亚洲一线二线三线久久久| 久久国产精品网站| 欧美大片一区| 亚洲香蕉网站| 麻豆成人在线| 国产精品久久影院| 亚洲国产日韩欧美在线99| 亚洲手机成人高清视频| 久久精精品视频| 亚洲高清精品中出| 一级日韩一区在线观看| 久久精品五月| 国产精品久久久久影院色老大| 激情综合网址| 午夜在线播放视频欧美| 欧美粗暴jizz性欧美20| 亚洲欧美激情一区| 欧美精品激情在线观看| 又紧又大又爽精品一区二区| 亚洲一区二区三区欧美| 亚洲大片av| 久久精品国产精品| 国产精品嫩草久久久久| 99re6这里只有精品| 麻豆成人精品| 久久精品国产999大香线蕉| 国产精品女主播一区二区三区| 亚洲麻豆一区| 欧美激情亚洲自拍| 久久精品国产亚洲5555| 国产精品久久久久天堂| 99国产精品久久久久久久久久 | 午夜国产不卡在线观看视频| 久热综合在线亚洲精品| 国产一区二区激情| 性娇小13――14欧美| 亚洲美女在线观看| 葵司免费一区二区三区四区五区| 国产精品色婷婷久久58| 亚洲小说欧美另类社区| 日韩图片一区| 欧美视频一区二区三区四区| 欧美福利影院| 久久精品国产久精国产爱| 欧美电影免费网站| 亚洲福利在线观看| 欧美电影免费观看高清完整版 | 欧美欧美全黄| 亚洲七七久久综合桃花剧情介绍| 蜜臀av性久久久久蜜臀aⅴ| 久久精品电影| 亚洲国产一区二区三区a毛片| 老司机午夜精品视频在线观看| 欧美影院成人| 在线看片第一页欧美| 免费看黄裸体一级大秀欧美| 狂野欧美激情性xxxx欧美| 亚洲激情视频在线观看| 亚洲国产欧洲综合997久久| 欧美r片在线| 一区二区欧美激情| 在线视频你懂得一区二区三区| 国产精品国产精品| 午夜精品久久久久久久99热浪潮| 亚洲一区二区三区四区中文| 国产日韩一区二区三区| 男男成人高潮片免费网站| 欧美激情精品久久久久久久变态| 一区二区三区波多野结衣在线观看| 中国亚洲黄色| 国产一区成人| 欧美韩日一区二区三区| 欧美视频中文一区二区三区在线观看| 亚洲在线一区二区三区| 午夜在线不卡| 91久久黄色| 亚洲综合第一| 亚洲精品一区二区三区樱花| 亚洲蜜桃精久久久久久久| 国产欧美丝祙| 91久久精品美女高潮| 国产精品午夜av在线| 欧美承认网站| 国产精品亚洲一区| 亚洲电影在线观看| 国产日本欧美一区二区三区在线| 牛牛国产精品| 国产精品区一区二区三| 亚洲第一二三四五区| 国产一区二区三区久久久久久久久| 亚洲国产成人tv| 国产一区二区三区在线观看网站| 亚洲国产精品视频一区| 激情成人av| 亚洲视频在线观看| 亚洲人成欧美中文字幕| 欧美一区三区三区高中清蜜桃| 中文在线一区| 欧美成人免费全部| 久久日韩精品| 国产麻豆午夜三级精品| 日韩一区二区久久| 99re66热这里只有精品3直播| 久久九九久久九九| 欧美国产高清| 久久婷婷蜜乳一本欲蜜臀| 久久婷婷亚洲| 久久精品视频一| 欧美三级在线视频| 亚洲激情二区| 亚洲国产精品一区二区www| 欧美一区二区三区精品| 欧美亚洲专区| 国产精品视频在线观看| 99亚洲视频| 亚洲一区高清| 国产精品theporn| 99国内精品久久| 中日韩男男gay无套| 欧美精品一区在线发布| 欧美激情中文字幕乱码免费| 在线观看精品| 免费中文日韩| 亚洲国产精品第一区二区三区| 在线观看国产欧美| 久久综合九色欧美综合狠狠| 蜜桃av综合| 亚洲美女电影在线| 欧美日韩专区在线| 亚洲一区二区久久| 欧美在线免费| 韩国成人精品a∨在线观看| 欧美在线视频免费| 女女同性精品视频| 亚洲欧洲日韩女同| 欧美日韩麻豆| 午夜视频久久久| 蘑菇福利视频一区播放| 亚洲乱码日产精品bd| 欧美日韩一区二区三区免费| 在线视频精品一区| 久久久xxx| 亚洲欧洲久久| 国产精品免费一区二区三区在线观看| 亚洲午夜av在线| 久久久久久久久久看片| 亚洲电影免费观看高清| 欧美日韩国产影片| 午夜精品久久一牛影视| 美女视频黄a大片欧美| 99在线精品观看| 国产午夜精品美女视频明星a级 | 欧美亚洲免费电影| 欧美α欧美αv大片| 一区二区三区偷拍| 国产一区二区三区不卡在线观看 | 亚洲香蕉网站| 国产一二三精品| 欧美巨乳波霸| 久久精品三级| 9l国产精品久久久久麻豆| 久久久精品国产99久久精品芒果| 亚洲国产精品综合| 国产精品久久网站| 蜜桃av一区二区在线观看| 中文日韩电影网站| 嫩草伊人久久精品少妇av杨幂| 中文有码久久| 亚洲国产欧美一区二区三区丁香婷 | 一区二区欧美日韩视频| 欧美一区二区三区电影在线观看| 欧美韩日一区| 欧美一区二区视频在线观看2020| 亚洲成在线观看| 国产精品爽黄69| 欧美另类99xxxxx| 免播放器亚洲一区| 欧美在线播放| 一区二区三区视频在线观看| 欧美/亚洲一区| 久久精品国产久精国产思思| 亚洲午夜精品| 日韩天堂av| 在线电影欧美日韩一区二区私密| 国产精品男人爽免费视频1| 欧美日韩精品系列| 欧美大片91| 久久人人超碰| 久久免费视频观看|