wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2493|回復: 0
收起左側

X86匯編語言學習手記

[復制鏈接]
ID:107189 發表于 2016-3-6 00:15 | 顯示全部樓層 |閱讀模式
最近發現了幾個錯誤,更新一下,需要的話,我的blog有參考:

抱歉,文中的一些鏈接參考文檔在轉帖中丟失,另外,中間的棧的插圖也亂了,文章排版也有些混亂,如果需要參考可以看我blog上的原文:



版權所有: 轉載時請務必以超鏈接形式標明文章原始出處、作者信息及本聲明


這是作者在學習X86匯編過程中的學習筆記,難免有錯誤和疏漏之處,歡迎指正。
作者將隨時修改錯誤并將新的版本發布在自己的Blog站點上。
嚴格說來,本篇文檔更側重于C語言和C編譯器方面的知識,如果涉及到具體匯編語言
的內容,可以參考相關文檔。


1. 編譯環境

   OS: Solaris 9 X86
   Compiler: gcc 3.3.2
   Linker: Solaris Link Editors 5.x
   Debug Tool: mdb
   Editor: vi

   注:關于編譯環境的安裝和設置,可以參考文章:Solaris 上的開發環境安裝及設置。
       mdb是Solaris提供的kernel debug工具,這里用它做反匯編和匯編語言調試工具。
       如果在Linux平臺可以用gdb進行反匯編和調試。

2. 最簡C代碼分析

    為簡化問題,來分析一下最簡的c代碼生成的匯編代碼:
    # vi test1.c
      
    int main()
    {
        return 0;
    }   
     
    編譯該程序,產生二進制文件:
    # gcc test1.c -o test1
    # file test1   
    test1: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped  

    test1是一個ELF格式32位小端(Little Endian)的可執行文件,動態鏈接并且符號表沒有去除。
    這正是Unix/Linux平臺典型的可執行文件格式。
    用mdb反匯編可以觀察生成的匯編代碼:

    # mdb test1
    Loading modules: [ libc.so.1 ]
    >; main::dis                       ; 反匯編main函數,mdb的命令一般格式為  <地址>;::dis
    main:          pushl   %ebp       ; ebp寄存器內容壓棧,即保存main函數的上級調用函數的;刂
    main+1:        movl    %esp,%ebp  ; esp值賦給ebp,設置main函數的;
    main+3:          subl    $8,%esp
    main+6:          andl    $0xf0,%esp
    main+9:          movl    $0,%eax
    main+0xe:        subl    %eax,%esp
    main+0x10:     movl    $0,%eax    ; 設置函數返回值0
    main+0x15:     leave              ; 將ebp值賦給esp,pop先前棧內的上級函數棧的基地址給ebp,恢復原棧基址
    main+0x16:     ret                ; main函數返回,回到上級調用
    >;  

    注:這里得到的匯編語言語法格式與Intel的手冊有很大不同,Unix/Linux采用AT&T匯編格式作為匯編語言的語法格式
         如果想了解AT&T匯編可以參考文章:Linux AT&T 匯編語言開發指南  

    問題:誰調用了 main函數?
      
     在C語言的層面來看,main函數是一個程序的起始入口點,而實際上,ELF可執行文件的入口點并不是main而是_start。
     mdb也可以反匯編_start:
        
    >; _start::dis                       ;從_start 的地址開始反匯編
    _start:              pushl   $0
    _start+2:            pushl   $0
    _start+4:            movl    %esp,%ebp
    _start+6:            pushl   %edx
    _start+7:            movl    $0x80504b0,%eax
    _start+0xc:          testl   %eax,%eax
    _start+0xe:          je      +0xf            <_start+0x1d>;
    _start+0x10:         pushl   $0x80504b0
    _start+0x15:         call    -0x75           <atexit>;
    _start+0x1a:         addl    $4,%esp
    _start+0x1d:         movl    $0x8060710,%eax
    _start+0x22:         testl   %eax,%eax
    _start+0x24:         je      +7              <_start+0x2b>;
    _start+0x26:         call    -0x86           <atexit>;
    _start+0x2b:         pushl   $0x80506cd
    _start+0x30:         call    -0x90           <atexit>;
    _start+0x35:         movl    +8(%ebp),%eax
    _start+0x38:         leal    +0x10(%ebp,%eax,4),%edx
    _start+0x3c:         movl    %edx,0x8060804
    _start+0x42:         andl    $0xf0,%esp
    _start+0x45:         subl    $4,%esp
    _start+0x48:         pushl   %edx
    _start+0x49:         leal    +0xc(%ebp),%edx
    _start+0x4c:         pushl   %edx
    _start+0x4d:         pushl   %eax
    _start+0x4e:         call    +0x152          <_init>;
    _start+0x53:         call    -0xa3           <__fpstart>;
    _start+0x58:        call    +0xfb        <main>;              ;在這里調用了main函數
    _start+0x5d:         addl    $0xc,%esp
    _start+0x60:         pushl   %eax
    _start+0x61:         call    -0xa1           <exit>;
    _start+0x66:         pushl   $0
    _start+0x68:         movl    $1,%eax
    _start+0x6d:         lcall   $7,$0
    _start+0x74:         hlt
    >;  

    問題:為什么用EAX寄存器保存函數返回值?
    實際上IA32并沒有規定用哪個寄存器來保存返回值。但如果反匯編Solaris/Linux的二進制文件,就會發現,都用EAX保存函數返回值。
    這不是偶然現象,是操作系統的ABI(Application Binary Interface)來決定的。
    Solaris/Linux操作系統的ABI就是Sytem V ABI。


    概念:SFP (Stack Frame Pointer) ?蚣苤羔  

    正確理解SFP必須了解:
        IA32 的棧的概念
        CPU 中32位寄存器ESP/EBP的作用
        PUSH/POP 指令是如何影響棧的
        CALL/RET/LEAVE 等指令是如何影響棧的

    如我們所知:
    1)IA32的棧是用來存放臨時數據,而且是LIFO,即后進先出的。棧的增長方向是從高地址向低地址增長,按字節為單位編址。
    2) EBP是棧基址的指針,永遠指向棧底(高地址),ESP是棧指針,永遠指向棧頂(低地址)。
    3) PUSH一個long型數據時,以字節為單位將數據壓入棧,從高到低按字節依次將數據存入ESP-1、ESP-2、ESP-3、ESP-4的地址單元。
    4) POP一個long型數據,過程與PUSH相反,依次將ESP-4、ESP-3、ESP-2、ESP-1從棧內彈出,放入一個32位寄存器。
    5) CALL指令用來調用一個函數或過程,此時,下一條指令地址會被壓入堆棧,以備返回時能恢復執行下條指令。
    6) RET指令用來從一個函數或過程返回,之前CALL保存的下條指令地址會從棧內彈出到EIP寄存器中,程序轉到CALL之前下條指令處執行
    7) ENTER是建立當前函數的?蚣,即相當于以下兩條指令:
        pushl   %ebp
        movl    %esp,%ebp
    8) LEAVE是釋放當前函數或者過程的?蚣,即相當于以下兩條指令:
        movl ebp esp
        popl  ebp

    如果反匯編一個函數,很多時候會在函數進入和返回處,發現有類似如下形式的匯編語句:  
         
        pushl   %ebp            ; ebp寄存器內容壓棧,即保存main函數的上級調用函數的;刂
        movl    %esp,%ebp       ; esp值賦給ebp,設置 main函數的;
        ...........             ; 以上兩條指令相當于 enter 0,0
        ...........
        leave                   ; 將ebp值賦給esp,pop先前棧內的上級函數棧的基地址給ebp,恢復原;
        ret                     ; main函數返回,回到上級調用

    這些語句就是用來創建和釋放一個函數或者過程的棧框架的。
    原來編譯器會自動在函數入口和出口處插入創建和釋放棧框架的語句。
    函數被調用時:
    1) EIP/EBP成為新函數棧的邊界
    函數被調用時,返回時的EIP首先被壓入堆棧;創建棧框架時,上級函數棧的EBP被壓入堆棧,與EIP一道行成新函數?蚣艿倪吔
    2) EBP成為?蚣苤羔楽FP,用來指示新函數棧的邊界
    棧框架建立后,EBP指向的棧的內容就是上一級函數棧的EBP,可以想象,通過EBP就可以把層層調用函數的棧都回朔遍歷一遍,調試器就是利用這個特性實現 backtrace功能的
    3) ESP總是作為棧指針指向棧頂,用來分配?臻g
    棧分配空間給函數局部變量時的語句通常就是給ESP減去一個常數值,例如,分配一個整型數據就是 ESP-4
    4) 函數的參數傳遞和局部變量訪問可以通過SFP即EBP來實現  
    由于?蚣苤羔樣肋h指向當前函數的;刂罚瑓岛途植孔兞吭L問通常為如下形式:
        +8+xx(%ebp)         ; 函數入口參數的的訪問
        -xx(%ebp)           ; 函數局部變量訪問
            
    假如函數A調用函數B,函數B調用函數C ,則函數?蚣芗罢{用關系如下圖所示:

下圖有點亂,因此刪去部分內容,要看原圖可參考我的blog
+----------------------------+---->; 高地址
| EIP (上級函數返回地址)  |     
+----------------------------+   
| EBP (上級函數的EBP)     |  
+----------------------------+
| Local Variables            |   
| ..........                          |  
+-----------------------------+   
| Arg n(函數B的第n個參數) |   
+-----------------------------+
| Arg .(函數B的第.個參數)   |  
+-----------------------------+  
| Arg 1(函數B的第1個參數) |  
+-----------------------------+   
| Arg 0(函數B的第0個參數) |  
+-----------------------------+  
EIP (A函數的返回地址)      |
+-----------------------------+  
| EBP (A函數的EBP)          |
+-----------------------------+   
| Local Variables             |   
| ..........                           |   
+-----------------------------+  
| Arg n(函數C的第n個參數) |   
+-----------------------------+   
| Arg .(函數C的第.個參數)   |   
+-----------------------------+   
| Arg 1(函數C的第1個參數) |  
+-----------------------------+   
| Arg 0(函數C的第0個參數) |   
+-----------------------------+   
| EIP (B函數的返回地址)     |  
+-----------------------------+  
| EBP (B函數的EBP)          |  
+-----------------------------+
| Local Variables             |
| ..........                           |  
+-----------------------------+--->; 低地址

   圖 1-1  
        
    再分析test1反匯編結果中剩余部分語句的含義:
         
    # mdb test1
    Loading modules: [ libc.so.1 ]
    >; main::dis                        ; 反匯編main函數
    main:          pushl   %ebp                             
    main+1:        movl    %esp,%ebp        ; 創建Stack Frame(棧框架)
    main+3:       subl    $8,%esp       ; 通過ESP-8來分配8字節堆?臻g
    main+6:       andl    $0xf0,%esp    ; 使棧地址16字節對齊
    main+9:       movl    $0,%eax       ; 無意義
    main+0xe:     subl    %eax,%esp     ; 無意義
    main+0x10:     movl    $0,%eax          ; 設置main函數返回值
    main+0x15:     leave                    ; 撤銷Stack Frame(?蚣)
    main+0x16:     ret                      ; main 函數返回
    >;

    以下兩句似乎是沒有意義的,果真是這樣嗎?
        movl    $0,%eax  
        subl     %eax,%esp
        
    用gcc的O2級優化來重新編譯test1.c:
    # gcc -O2 test1.c -o test1
    # mdb test1
    >; main::dis
    main:         pushl   %ebp
    main+1:       movl    %esp,%ebp
    main+3:       subl    $8,%esp
    main+6:       andl    $0xf0,%esp
    main+9:       xorl    %eax,%eax      ; 設置main返回值,使用xorl異或指令來使eax為0
    main+0xb:     leave
    main+0xc:     ret
    >;  
    新的反匯編結果比最初的結果要簡潔一些,果然之前被認為無用的語句被優化掉了,進一步驗證了之前的猜測。
    提示:編譯器產生的某些語句可能在程序實際語義上沒有用處,可以用優化選項去掉這些語句。

    問題:為什么用xorl來設置eax的值?
    注意到優化后的代碼中,eax返回值的設置由 movl $0,%eax 變為 xorl %eax,%eax ,這是因為IA32指令中,xorl比movl有更高的運行速度。

    概念:Stack aligned 棧對齊
    那么,以下語句到底是和作用呢?
        subl    $8,%esp
       andl    $0xf0,%esp     ; 通過andl使低4位為0,保證棧地址16字節對齊
        
    表面來看,這條語句最直接的后果是使ESP的地址后4位為0,即16字節對齊,那么為什么這么做呢?
    原來,IA32 系列CPU的一些指令分別在4、8、16字節對齊時會有更快的運行速度,因此gcc編譯器為提高生成代碼在IA32上的運行速度,默認對產生的代碼進行16字節對齊

        andl $0xf0,%esp 的意義很明顯,那么 subl $8,%esp 呢,是必須的嗎?
    這里假設在進入main函數之前,棧是16字節對齊的話,那么,進入main函數后,EIP和EBP被壓入堆棧后,棧地址最末4位二進制位必定是 1000,esp -8則恰好使后4位地址二進制位為0000?磥,這也是為保證棧16字節對齊的。

    如果查一下gcc的手冊,就會發現關于棧對齊的參數設置:
    -mpreferred-stack-boundary=n    ; 希望棧按照2的n次的字節邊界對齊, n的取值范圍是2-12

    默認情況下,n是等于4的,也就是說,默認情況下,gcc是16字節對齊,以適應IA32大多數指令的要求。

    讓我們利用-mpreferred-stack-boundary=2來去除棧對齊指令:
      
    # gcc -mpreferred-stack-boundary=2 test1.c -o test1
        
    >; main::dis
    main:       pushl   %ebp
    main+1:     movl    %esp,%ebp
    main+3:     movl    $0,%eax
    main+8:     leave
    main+9:     ret
    >;  

    可以看到,棧對齊指令沒有了,因為,IA32的棧本身就是4字節對齊的,不需要用額外指令進行對齊。
    那么,?蚣苤羔楽FP是不是必須的呢?
    # gcc -mpreferred-stack-boundary=2 -fomit-frame-pointer test1.c -o test
    >; main::dis
    main:       movl    $0,%eax
    main+5:     ret
    >;  

    由此可知,-fomit-frame-pointer 可以去除SFP。
        
    問題:去除SFP后有什么缺點呢?
        
    1)增加調式難度
        由于SFP在調試器backtrace的指令中被使用到,因此沒有SFP該調試指令就無法使用。
    2)降低匯編代碼可讀性
        函數參數和局部變量的訪問,在沒有ebp的情況下,都只能通過+xx(esp)的方式訪問,而很難區分兩種方式,降低了程序的可讀性。
        
    問題:去除SFP有什么優點呢?
        
    1)節省?臻g
    2)減少建立和撤銷?蚣艿闹噶詈,簡化了代碼
    3)使ebp空閑出來,使之作為通用寄存器使用,增加通用寄存器的數量
    4)以上3點使得程序運行速度更快

    概念:Calling Convention  調用約定和 ABI (Application Binary Interface) 應用程序二進制接口
         
        函數如何找到它的參數?
        函數如何返回結果?
        函數在哪里存放局部變量?
        那一個硬件寄存器是起始空間?
        那一個硬件寄存器必須預先保留?

    Calling Convention  調用約定對以上問題作出了規定。Calling Convention也是ABI的一部分。
    因此,遵守相同ABI規范的操作系統,使其相互間實現二進制代碼的互操作成為了可能。
    例如:由于Solaris、Linux都遵守System V的ABI,Solaris 10就提供了直接運行Linux二進制程序的功能。
    詳見文章:關注: Solaris 10的10大新變化  
              
3. 小結
    本文通過最簡的C程序,引入以下概念:
        SFP 棧框架指針
        Stack aligned 棧對齊
        Calling Convention  調用約定 和 ABI (Application Binary Interface) 應用程序二進制接口
    今后,將通過進一步的實驗,來深入了解這些概念。通過掌握這些概念,使在匯編級調試程序產生的core dump、掌握C語言高級調試技巧成為了可能。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
国产精品色悠悠| 国产精品入口日韩视频大尺度| 激情综合网激情| 亚洲精品午夜| av女优在线| 91午夜伦伦电影理论片| 中国一级特黄视频| 99久久人妻无码中文字幕系列| 日本久久久网站| 成人欧美一区二区三区黑人免费| 另类美女黄大片| 欧美日韩精品一区二区三区蜜桃 | 欧美特黄色片| 成人18在线| 免费网站看电影大片| 老司机激情视频| 国产精品jvid在线观看蜜臀| 亚洲欧美一区二区激情| 欧美日韩美女视频| 久久久精品免费观看| 日韩精品一区第一页| av一区二区在线观看| 欧美天堂一区二区| 午夜伦理在线视频| 欧美vide| 欧美性少妇18aaaa视频| 日韩av影片| 深夜福利在线视频| 黄色a**址| 亚洲天堂在线视频观看| 国产尤物在线视频| 四虎国产精品成人免费入口| 午夜剧场高清版免费观看| 在线码字幕一区| 99免费在线视频观看| 奇门遁甲1982国语版免费观看高清| 亚洲天堂久久av| 日韩一区二区在线观看视频| 欧美午夜影院在线视频| 亚洲视频每日更新| 久久综合色一综合色88| 国产美女在线观看一区| 日日摸夜夜添夜夜添国产精品| 99re66热这里只有精品8| 国产一区二区在线视频你懂的| 日韩欧美一区二区三区免费观看 | 玖玖玖国产精品| 日韩精品免费一区二区在线观看 | 日本一级在线观看| 国产天堂在线观看| sesexxxx| 狠狠干夜夜草| freee性欧美| 热99精品视频| www.亚洲一区二区三区| 丝袜熟女一区二区三区| 精品久久久久久中文字幕2017| 91成人综合网| 中国 免费 av| 亚洲色图自拍| 亚洲在线欧美| 一本一道久久a久久综合精品| 欧美一级爽aaaaa大片| 成人xxxxx色| 亚洲最大的网站| 亚洲在线第一页| 91夜夜揉人人捏人人添红杏| 91丝袜美腿美女视频网站| 国产精品流白浆视频| 国产精品久久久久77777| 国产福利视频一区二区| 国产精品入口夜色视频大尺度| 国产精品久久久久久久久| 国产91在线视频| 亚洲一区二区精品3399| 国产精品视频观看| 久久午夜色播影院免费高清| 久久精品一级爱片| 国产精品理论片| 亚洲精品福利视频网站| 中文字幕中文字幕一区二区| 亚洲免费观看高清完整版在线观看熊 | 大片免费在线看视频| 91成人高清| 性xxxxfjsxxxxx欧美| av中文在线资源库| 欧美日韩五区| 精品精品国产三级a∨在线| 国产一区二区三区电影在线观看| 国产精品久久久乱弄| 国精品一区二区| 久久久噜噜噜| 国产成人自拍网| 久久久久久久久久久久久女国产乱| 日本一区二区三区四区| 一区二区三区在线观看网站| 色综合天天综合色综合av| 91精品国产综合久久久久久| 亚洲美腿欧美激情另类| 日韩中文字幕亚洲| 久久久久成人网| 国产精品日韩久久久久| 久久精品国产理论片免费| 免费久久久久久| 国产xxxxx在线观看| 女教师高潮黄又色视频| 一级片久久久久| 99久在线精品99re8热| 国产高潮在线观看| 精品一区二区观看| 先锋成人影院| 尤物网址在线观看| 欧美大片1688| 免费观看久久av| 在线综合视频| 成人午夜私人影院| 亚洲国产一区视频| 9l国产精品久久久久麻豆| 国产精品午夜春色av| 色综合天天综合| 亚洲午夜精品久久久久久性色| 97人人爽人人喊人人模波多| 国产精品v欧美精品v日韩| 国产日产欧美一区二区| 中文字幕一二三区| 波多野结衣不卡视频| 国产偷拍一区二区| 美女网站免费看| 北条麻妃在线| 精品国产黄a∨片高清在线| 日韩精品第一区| 国产精一区二区三区| 一区二区三区在线观看视频| 亚洲国产精品久久91精品| 韩国19禁主播vip福利视频| 久久伦理网站| 亚洲成人天堂网| 久久精品这里只有精品| 国产免费视频传媒| 久久精品老司机| 中文av免费观看| 免费三级网站| 美女隐私在线观看| 色悠久久久久综合先锋影音下载| 欧美视频在线观看| 久久综合色综合88| 91精品国产一区二区| 欧美激情极品视频| 日本精品二区| 亚洲色偷偷色噜噜狠狠99网| 午夜精品久久久久久久蜜桃| 三级全黄视频| 青草在线视频| 91一区二区| 久久久久久久综合| 精品国产亚洲一区二区三区在线观看 | 久草在线免费二| av在线中出| 欧美精品啪啪| 亚洲精品一二三区| 中文字幕亚洲自拍| 久久狠狠久久综合桃花| 日本在线视频播放| 亚洲天堂中文网| 91在线精品| 97久久中文字幕| 男人的天堂久久精品| 亚洲成人在线网站| 欧美成人h版在线观看| 一区二区视频在线观看| 青娱乐国产视频| 天天躁日日躁狠狠躁伊人| 一级视频在线免费观看| 99精品国产一区二区三区2021| 国产伦理精品不卡| 日韩一区二区三区精品视频| 亚洲综合中文字幕68页| 色姑娘综合天天| 国产特黄一级片| 亚洲成人av高清| 日韩有码av| 国产精品理论片在线观看| 日韩一级裸体免费视频| 亚洲国产精品女人| 九九热视频精品| www黄色在线观看视频| 免费福利视频一区二区三区| 日韩成人av影视| 欧美精品视频www在线观看| 国产精品视频在线观看| 性生活免费在线观看| 国产精品伦理一区| 国产在线播放av| 偷拍欧美精品| 岛国av一区二区| 国产精品91在线观看| 亚洲精品性视频| 欧美熟妇交换久久久久久分类 | 成人av在线看| 日韩精品中文字| 日韩视频在线观看国产| 青青草原国产视频| 亚洲jizzjizz妇女| 久久大胆人体视频| 日本一区二区三区四区在线视频| 欧美精品情趣视频| 成人免费无码av| 亚洲h视频在线观看| 18视频免费网址在线观看| 国产精品v日韩精品v欧美精品网站 | 欧美日韩一区二区国产| 欧美日韩在线免费| 亚洲aⅴ男人的天堂在线观看| 日本xxxx裸体xxxx| 91精彩视频| 啪啪av大全导航福利综合导航| 粉嫩aⅴ一区二区三区四区五区| 精品偷拍一区二区三区在线看| 最新欧美日韩亚洲| 天天操夜夜操视频| 欧美色综合一区二区三区| 自拍偷拍欧美专区| 欧美日韩精品免费| 青青成人在线| 91精品国产高清一区二区三密臀| 欧美成人免费| 亚洲中午字幕| 国产婷婷97碰碰久久人人蜜臀| 男人的天堂avav| 国产绳艺sm调教室论坛| 欧美xxxx黑人又粗又长| 国产精品99久| 欧美黄色成人网| 性高潮久久久久久| 免费看又色又爽又黄网站| 自拍偷拍亚洲天堂| 国产大片一区二区三区| 女人18毛片一区二区三区| 亚洲卡一卡二| 国产伦精品一区二区三区免费 | av在线播放亚洲| 性一交一乱一精一晶| 色网在线观看| 成人av一区二区三区| 欧美激情中文字幕乱码免费| 国产男女无遮挡猛进猛出| 樱花草www在线观看| 久久夜色电影| 色播五月激情综合网| 欧美三级午夜理伦三级| 日韩成人在线网站| 天天成人综合网| 一区二区三区亚洲视频| a毛片在线看免费观看| 久久99最新地址| 日韩在线欧美在线| 99999精品| 狠狠色噜噜狠狠狠狠8888| 久久91麻豆精品一区| 欧美精品小视频| 成人在线免费看视频| 欧洲毛片在线| 蜜桃视频在线一区| 久久精品国产精品| 精品国产午夜福利在线观看| 青娱乐在线视频观看| 国产探花在线精品一区二区| 在线视频欧美精品| 日本特级黄色大片| 黄色三级网站在线观看| 日韩有码欧美| 亚洲一区二区av在线| 免费试看一区| 性一交一乱一精一晶| 国产精品成人**免费视频| 亚洲福利视频三区| 天堂社区 天堂综合网 天堂资源最新版| 亚洲一级视频在线观看| 日韩免费福利视频| 亚洲精品中文在线观看| 五月婷婷综合色| 手机av免费在线观看| h视频久久久| 欧美日韩国产精选| 国产亚洲天堂网| 福利视频大全| 久久精品卡一| 久久久免费在线观看| 国产在线一卡二卡| 搞黄网站在线看| 亚洲免费观看高清完整版在线观看| 日本一区二区三区免费看| 粉嫩小泬无遮挡久久久久久| 久久a爱视频| 亚洲韩国欧洲国产日产av| 美女被爆操网站| 香蕉网站在线| 久久久久亚洲综合| 久久久久成人精品免费播放动漫| 亚洲第一免费视频| 国产一区二区电影在线观看| 亚洲深夜福利视频| 一区二区三区在线观看免费视频| 三级外国片在线观看视频| 中文幕一区二区三区久久蜜桃| 欧美激情导航| 欧美日韩一区二区三区视视频 | 国产精品扒开腿做爽爽爽a片唱戏| 亚洲精品911| 成 人片 黄 色 大 片| 日韩免费不卡av| 国产又大又黄又猛| 91精选福利| 成人午夜短视频| 精品一区二区三区免费毛片| 免费一区二区三区视频狠狠| 99久久国产综合精品成人影院| 在线视频精品一| 久久高清内射无套| 国产精品扒开腿做爽爽爽视频软件| 少妇高潮一区二区三区喷水| 亚洲国产精品精华素| 午夜视频一区二区三区| 国产女主播自拍| 性直播在线观看| 成人av网站免费| 日韩欧美亚洲精品| 国产精品理人伦一区二区三区| 校园春色综合网| 国产主播在线一区| www.欧美日本| 三级视频网站在线| 综合色天天鬼久久鬼色| 国产美女主播在线播放| 情趣视频网站在线免费观看| 国产欧美日韩不卡免费| 欧美精品在欧美一区二区| 激情视频网址| 国产欧美综合在线观看第十页| 91免费版看片| 涩涩视频免费观看| 懂色av中文字幕一区二区三区| 欧美中日韩免费视频| 日皮视频在线免费观看| 国产精品资源网| 日韩高清专区| 欧美激情 一区| 欧美日韩电影免费看| 日韩一区二区精品| 小向美奈子av| 久久久加勒比| 亚洲欧美在线第一页| 日本少妇吞精囗交| 国产欧美日韩在线观看视频| 欧美猛男性生活免费| ,一级淫片a看免费| 国产精品mm| aa成人免费视频| 91九色蝌蚪在线| free欧美| 欧美另类高清zo欧美| 2017亚洲天堂| 99tv成人影院| 久久国产色av| www.av黄色| 成人午夜在线观看| 日韩av电影在线播放| 波多野结衣电车痴汉| 精品国产乱码久久久| 欧美伊久线香蕉线新在线| 黄色av网址在线| 男男视频亚洲欧美| 欧美日韩在线精品一区二区三区| 婷婷丁香激情五月| 91美女精品福利| 天天插天天操天天射| xxxx在线视频| 日韩av一区二区在线观看| 黄色在线观看国产| 欧美va天堂在线| 高清不卡日本v二区在线| h视频在线免费看| 亚洲精品国产无套在线观| 稀缺呦国内精品呦| 成人av在线播放| 成人羞羞动漫| 国产欧美va欧美va香蕉在线| 91麻豆精品国产91久久| 久久久久亚洲蜜桃| 91在线第一页| 青娱乐极品盛宴一区二区| 欧美精品在线播放| 寂寞护士中文字幕mp4| 成人在线综合网| 色国产在线视频| 日韩av电影资源网| 66m—66摸成人免费视频| 欧美性猛交xxxx免费看蜜桃| www国产成人| www.美色吧.com|