亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chapter 12 assembly language programming -- valvano.htm

?? 關于如何利用C++在嵌入式系統中應用
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0058)http://www.ece.utexas.edu/~valvano/embed/chap12/chap12.htm -->
<HTML><HEAD><TITLE>Chapter 12: Assembly Language Programming -- Valvano</TITLE>
<META http-equiv=content-type content=text/html;charset=iso-8859-1>
<META content="MSHTML 5.50.3825.1300" name=GENERATOR>
<META 
content="StarMax HD:Microsoft Office 98:Templates:Web Pages:Blank Web Page" 
name=Template></HEAD>
<BODY vLink=#800080 link=#0000ff>
<P><!--Developing Embedded Software in C using ICC11/ICC12/Hiware by Jonathan W. Valvano--><B><FONT 
face="Times New Roman,Times" size=4>Chapter 12: Assembly Language 
Programming</FONT></B></P>
<P><B><I><FONT face=Helvetica,Arial>What's in Chapter 12?</FONT></I></B></P>
<DIR>
<P><A 
href="http://www.ece.utexas.edu/~valvano/embed/chap12/chap12.htm#INSERT">How to 
insert single assembly instructions</A><FONT face=Monaco><BR></FONT><A 
href="http://www.ece.utexas.edu/~valvano/embed/chap12/chap12.htm#MIXTURE">How to 
compile with a mixture of assembly and C files</A><FONT 
face=Monaco><BR></FONT><A 
href="http://www.ece.utexas.edu/~valvano/embed/chap12/chap12.htm#DIRECTIVES">Assembler 
Directives</A><A 
href="http://www.ece.utexas.edu/~valvano/embed/chap12/chap12.htm#OPTIMIZE"><BR>How 
to use assembly to optimize a C function</A></P></DIR>
<P><FONT face="Times New Roman,Times">One of the main reasons for using the C 
language is to achieve portability. But there are occasional situations in which 
it is necessary to sacrifice portability in order to gain full access to the 
operating system or to the hardware in order to perform some interface 
requirement. If these instances are kept to a minimum and are not replicated in 
many different programs, the negative effect on portability may be acceptable. 
There are two approaches to writing assembly language with ICC11 and ICC12. The 
first method inserts a single assembly instruction directly into a C function 
using the <B>asm("string");</B> feature. Everything within the <B>"string"</B> 
statement is assumed to be assembly language code and is sent straight to the 
output of the compiler exactly as it appears in the input. The second approach 
is to write an entire file in assembly language, which may include global 
variables and functions. Entire assembly files can be inserted into our C 
programs using the <B>asm(".include 'filename' ");</B> feature. Entire assembly 
files can also be assembled separately then linked at a later time to the rest 
of the programs. The simple insertion method is discussed in this 
chapter.</FONT></P>
<P><B><I><FONT face=Helvetica,Arial><A name=INSERT></A>How to insert single 
assembly instructions.</FONT></I></B></P>
<P><FONT face="Times New Roman,Times">To support this capability, C provides for 
assembly language instructions to be written into C programs anywhere a 
statement is valid. Since the compiler generates assembly language as output, 
when it encounters assembly language instructions in the input, it simply copies 
them directly to the output. </FONT></P>
<P><FONT face="Times New Roman,Times">A special directive delimits assembly 
language code. The following example inserts the assembly language instruction 
<B>cli</B> (enable interrupts) into the program at that point.</FONT></P>
<DIR>
<P><CODE>asm(" cli"); </CODE></P></DIR>
<P><FONT face="Times New Roman,Times">Some of the older versions of ICC11 
require a space before the op code as shown in the examples in this chapter. 
ICC12 version 5.1 does not need the space before the op code. The extra space is 
ignored by these newer compiler versions, so experiment with your particular 
compiler to see whether or not the space is required. Macro substitution is not 
performed, but you can define macros that insert assembly. The following macros 
are defined in the HC11.H and HC12.H header files.</FONT></P>
<DIR>
<P><CODE>#define INTR_ON() asm(" cli")<BR>#define INTR_OFF() asm(" 
sei")</CODE></P></DIR>
<P><FONT face="Times New Roman,Times">The following function runs with 
interrupts disabled.</FONT></P>
<DIR>
<P><CODE>void&nbsp;InitFifo(void){<BR>&nbsp;&nbsp;INTR_OFF();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 
make atomic, entering critical section 
*/<BR>&nbsp;&nbsp;PutI=GetI=Size=0;&nbsp;/* Empty when Size==0 
*/<BR>&nbsp;&nbsp;INTR_ON();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 
end critical section&nbsp;*/<BR>}</CODE></P></DIR>
<ADDRESS>Listing 12-1: Example of an assembly language macro</ADDRESS>
<P>&nbsp;</P>
<P><FONT face="Times New Roman,Times">Of course, to make use of this feature, we 
must know how the compiler uses the CPU registers, how functions are called, and 
how the operating system and hardware works. It will certainly cause a 
programming error if your embedded assembly modifies the stack pointer, SP, or 
the stack frame pointer, X. On the other hand, in most situations you should be 
able to modify the CCR, A, B, or Y without causing a program error. It is good 
practice to observe the resulting assembly output of the entire function to 
guarantee that the embedded assembly has not affected the surrounding C code. 
Unfortunately, this verification must be repeated when you upgrade the 
compiler.</FONT></P>
<P><FONT face="Times New Roman,Times">You can assess global variables directly 
using its equivalent assembly name (starts with an underscore). The following 
function adds one to the 16-bit global time.</FONT></P>
<DIR>
<P><CODE>short time;<BR>void&nbsp;Add1time(void){<BR>&nbsp;&nbsp;asm(" ldy 
_time");<BR>&nbsp;&nbsp;asm(" iny");<BR>&nbsp;&nbsp;asm(" sty 
_time");<BR>}</CODE></P></DIR>
<ADDRESS>Listing 12-2: Example of an assembly language access to a global 
variable</ADDRESS>
<P>&nbsp;</P>
<P><FONT face="Times New Roman,Times">You can assess local variables directly 
using a <B>%</B>before its name. </FONT></P>
<DIR>
<P><CODE>void&nbsp;InitFifo(void){ unsigned char SaveSP;<BR>&nbsp;&nbsp;asm(" 
tpa");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Reg A 
contains previous CCR */<BR>&nbsp;&nbsp;asm(" staa %SaveSP");&nbsp;&nbsp;/* Save 
previous CCR value */<BR>&nbsp;&nbsp;asm(" 
sei");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* make 
atomic, entering critical 
section&nbsp;*/<BR>&nbsp;&nbsp;PutI=GetI=Size=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Empty 
when Size==0 */<BR>&nbsp;&nbsp;asm(" ldaa %SaveSP");&nbsp;&nbsp;/* Reg A 
contains previous CCR */<BR>&nbsp;&nbsp;asm(" 
tap");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* end 
critical section&nbsp;*/<BR>}</CODE></P></DIR>
<ADDRESS>Listing 12-3: Example of an assembly language access to a local 
variable</ADDRESS>
<P>&nbsp;</P>
<P><FONT face="Times New Roman,Times">The above method of disabling interrupts 
is a good way to execute critical code. This is an appropriate way to execute 
critical code because once the critical code is started it will finish (i.e., 
atomic). The code becomes atomic because interrupts are disabled. At the end of 
the critical code, the interrupt status is restored to its previous value. This 
save/restore interrupt status procedure allows you to nest one critical code 
inside another critical code. If you disable interrupts before the critical code 
and enable interrupts after the critical code, you are presuming that interrupts 
were enabled when the critical code was started. The disable/enable method of 
executing critical code does not allow for one critical code to call another 
critical code. In the following example, <B>InitFifo</B> properly returns with 
interrupts still disabled.</FONT></P>
<DIR>
<P><CODE>void&nbsp;InitSystem(void){ unsigned char SaveSP;<BR>&nbsp;&nbsp;asm(" 
tpa");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Reg A 
contains previous CCR */<BR>&nbsp;&nbsp;asm(" staa %SaveSP");&nbsp;&nbsp;/* Save 
previous CCR value */<BR>&nbsp;&nbsp;asm(" 
sei");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* make 
atomic, entering critical section 
*/<BR>&nbsp;&nbsp;InitFifo();<BR>&nbsp;&nbsp;InitPort();<BR>&nbsp;&nbsp;InitTimer();<BR>&nbsp;&nbsp;asm(" 
ldaa %SaveSP");&nbsp;&nbsp;/* Reg A contains previous CCR 
*/<BR>&nbsp;&nbsp;asm(" 
tap");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;end&nbsp;critical&nbsp;section&nbsp;*/<BR>}</CODE></P></DIR>
<ADDRESS>Listing 12-4: Example of a multiple line assembly language 
insertion</ADDRESS>
<DIR>
<DIR>
<P>&nbsp;</P></DIR></DIR>
<P><FONT face="Times New Roman,Times">If you don't like the above style of 
writing each line separately, there is a shorthand for multiple-line assembly as 
shown in the following implementation.</FONT></P>
<DIR>
<P><CODE>void&nbsp;InitFifo(void){ unsigned char SaveSP;<BR>&nbsp;&nbsp;asm(" 
tpa\n"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Reg A 
contains previous CCR */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" staa 
%SaveSP\n"&nbsp;&nbsp;/* Save previous CCR value 
*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" 
sei");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;make&nbsp;atomic, 
entering critical section 
*/<BR>&nbsp;&nbsp;PutI=GetI=Size=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Empty&nbsp;when&nbsp;Size==0&nbsp;*/<BR>&nbsp;&nbsp;asm(" 
ldaa %SaveSP\n"&nbsp;&nbsp;/* Reg A contains previous CCR 
*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" 
tap");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;end&nbsp;critical&nbsp;section&nbsp;*/<BR>}</CODE></P></DIR>
<ADDRESS>Listing 12-5: A second example of a multiple line assembly language 
insertion</ADDRESS>
<P>&nbsp;</P>
<P><FONT face="Times New Roman,Times">There is yet another style of writing 
multiple-line assembly, but I don't recommend it because it is harder to 
read.</FONT></P>
<DIR>
<P><CODE>void&nbsp;InitFifo(void){ unsigned char SaveSP;<BR>&nbsp;&nbsp;asm(" 
tpa\n staa %SaveSP\n sei");&nbsp;&nbsp;/*&nbsp;make&nbsp;atomic, entering 
critical section 
*/<BR>&nbsp;&nbsp;PutI=GetI=Size=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Empty&nbsp;when&nbsp;Size==0&nbsp;*/<BR>&nbsp;&nbsp;asm(" 
ldaa %SaveSP\n 
tap");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;end&nbsp;critical&nbsp;section&nbsp;*/<BR>}</CODE></P></DIR>
<ADDRESS>Listing 12-6: A third example of a multiple line assembly language 
insertion</ADDRESS>
<P>&nbsp;</P>
<P><FONT face="Times New Roman,Times">This last example suggests the macro 
definitions:</FONT></P>
<DIR>
<P><CODE>#define START_CRITICAL() asm(" tpa\n staa %SaveSP\n sei")<BR>#define 
END_CRITICAL() asm( ldaa %SaveSP\n tap")</CODE></P></DIR>
<P><FONT face="Times New Roman,Times">The use of these two macros requires the 
definition of an 8-bit local variable called <B>SaveSP</B>.</FONT></P>
<P>&nbsp;</P>
<P><B><I><FONT face=Helvetica,Arial><A name=MIXTURE></A>How to compile with a 
mixture of assembly and C files</FONT></I></B></P>
<P><FONT face="Times New Roman,Times">The following C program embeds an assembly 
language file (programs and data). In this example the C program accesses a 
global variable (<B>lowGlobal</B>) and calls a function (<B>lowSub</B>) defined 
in the assembly file, and the assembly function assesses a global variable 
(<B>highGlobal</B>) and calls a function (<B>highSub</B>) defined in the C file. 
To access an assembly function, the C program simply calls it, with the standard 
ICC11/ICC12 parameter passing rules. To access an assembly level global 
variable, the C program types it with the <B>extern</B>. Notice however that the 
assembly function (<B>lowSub</B>) does not need a prototype in the high level C 
program. </FONT></P>
<DIR>
<P><CODE>/* C level program&nbsp;&nbsp;&nbsp;&nbsp;file="high.C" */<BR>int 
highGlobal;<BR>extern int lowGlobal;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 
typed here but defined in low.s<BR>asm(".include 'low.s' ");&nbsp;&nbsp;&nbsp;// 
insert assembly here<BR>void main(void){ <BR>&nbsp;&nbsp;lowSub(5); 
&nbsp;&nbsp;&nbsp;&nbsp;// call to assemble 
routine<BR>&nbsp;&nbsp;lowGlobal=6;&nbsp;&nbsp;&nbsp;// access of assembly 
global<BR>};<BR>int highSub(int input){return(input++);}</CODE></P></DIR>
<ADDRESS>Listing 12-7: A high-level C program that calls a low-level assembly 
function</ADDRESS>
<DIR>
<DIR>
<P>&nbsp;</P></DIR></DIR>
<P><FONT face="Times New Roman,Times">The following assembly program is embedded 
into the above high level C program. The double colon, <B>::</B>, specifies the 
label as external and will be available in the *.map file. The <B>.area text</B> 
is the standard place for programs (in ROM), and the <B>.area bss</B> is the 
standard area for globals (in RAM). Assembly level functions (e.g., 
<B>_lowSub</B>) and variables (e.g., <B>_lowGlobal</B>) are defined beginning 
with an underscore, "_". Notice that in the assembly file the names have the 
underscore, but the same name in the C file do not. To access a C function, the 
assembly program simply calls it (the name begins with an underscore.) The 
assembly program has full access to high level global variables (the name begins 
with an underscore.)</FONT></P>
<P>&nbsp;</P>
<DIR>
<P><CODE>; assembly language program file="low.s" 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;.area 
text<BR>_lowSub::&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 
definition of low level subroutine<BR>&nbsp;&nbsp;&nbsp;&nbsp;jsr 
_highSub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; call to high level 
function<BR>&nbsp;&nbsp;&nbsp;&nbsp;std _highGlobal&nbsp;&nbsp;&nbsp;&nbsp;; 
access to high level 
global<BR>&nbsp;&nbsp;&nbsp;&nbsp;rts<BR>&nbsp;&nbsp;&nbsp;&nbsp;.area 
bss<BR>_lowGlobal::&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; definition 
of low level global<BR>&nbsp;&nbsp;&nbsp;&nbsp;.blkb 2</CODE></P></DIR>
<ADDRESS>Listing 12-8: A low-level assembly program that calls a high-level C 
function</ADDRESS>
<P>&nbsp;</P>
<P><FONT face="Times New Roman,Times">Again, parameter passing with both 
functions (the assembly calls to the C and the C calls to the assembly) must 
adhere to the standard ICC11/ICC12 parameter passing rules: </FONT></P>
<DIR>
<P><FONT face="Times New Roman,Times">The output parameter, if it exists, is 
passed in Register D,</FONT><CODE><BR></CODE><FONT 
face="Times New Roman,Times">The first input parameter is passed in Register 
D,</FONT><CODE><BR></CODE><FONT face="Times New Roman,Times">The remaining input 
parameters are passed on the stack,</FONT><CODE><BR></CODE><FONT 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www.欧美日韩国产在线| 精品国产乱码久久久久久免费| 三级亚洲高清视频| 亚洲人成在线观看一区二区| 久久久久国产精品麻豆| 蜜桃久久久久久久| 日韩国产欧美在线播放| 亚洲午夜电影网| 性感美女久久精品| 欧美一卡二卡在线| 欧美大片国产精品| 久久综合九色综合欧美98 | 亚洲欧美日韩一区| 中文字幕亚洲欧美在线不卡| 国产精品的网站| 亚洲综合一区二区| 日韩国产一二三区| 中文字幕不卡在线观看| 国产福利91精品一区二区三区| 国产盗摄精品一区二区三区在线 | 国产精品一区专区| 成人性生交大片免费| 91麻豆swag| 在线电影国产精品| 337p粉嫩大胆色噜噜噜噜亚洲| 中文字幕在线一区二区三区| 天使萌一区二区三区免费观看| 亚洲成人一二三| 久久成人av少妇免费| 懂色av一区二区在线播放| 在线观看视频一区| 日韩久久免费av| 国产精品国产精品国产专区不蜜| 一区二区三区在线观看动漫| 日韩国产在线一| 韩国一区二区三区| 亚洲精品中文字幕乱码三区| 三级欧美在线一区| 色呦呦国产精品| 精品国精品国产| 亚洲婷婷国产精品电影人久久| 精品伦理精品一区| 色一情一伦一子一伦一区| 偷窥少妇高潮呻吟av久久免费| 欧美综合天天夜夜久久| 麻豆国产精品视频| 亚洲精选在线视频| 久久综合九色欧美综合狠狠| 91美女蜜桃在线| 丁香天五香天堂综合| 欧美亚洲国产一区二区三区| 成人免费视频一区| 欧美日韩在线电影| 亚洲国产精品二十页| 视频在线观看91| 91久久精品网| 国产精品久久久久久户外露出 | 精品一区二区在线视频| gogo大胆日本视频一区| 26uuu久久综合| 日本不卡一区二区三区| 在线看国产一区二区| 国产精品丝袜一区| 国产精品主播直播| 精品不卡在线视频| 看片的网站亚洲| 欧美一级xxx| 日本欧美一区二区| 制服丝袜一区二区三区| 亚洲激情欧美激情| 色综合中文字幕国产 | 日韩欧美国产麻豆| 亚洲成在人线在线播放| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 日韩欧美亚洲国产精品字幕久久久| 亚洲女女做受ⅹxx高潮| 亚洲国产精品综合小说图片区| 日韩国产欧美一区二区三区| 色婷婷精品久久二区二区蜜臂av| 亚洲欧洲性图库| 97精品久久久久中文字幕| 国产精品久久久久影院色老大 | 国产剧情一区在线| 亚洲激情网站免费观看| 日本一区二区动态图| 在线播放一区二区三区| 色婷婷久久综合| 色婷婷av一区二区| 欧美三级在线视频| 欧美日韩一区二区在线观看视频 | 欧美福利一区二区| 日本高清无吗v一区| 99re66热这里只有精品3直播| 精品一区二区三区欧美| 91无套直看片红桃| 欧美日韩一区中文字幕| 亚洲欧美在线视频观看| 一区二区不卡在线视频 午夜欧美不卡在| 婷婷夜色潮精品综合在线| 日本电影亚洲天堂一区| hitomi一区二区三区精品| 成人黄色在线看| 亚洲成a人在线观看| 一区二区在线观看免费| 国产一区日韩二区欧美三区| 色94色欧美sute亚洲线路一ni | 亚洲成人av在线电影| 欧美天天综合网| 美洲天堂一区二卡三卡四卡视频| 精品福利二区三区| 成人免费视频视频在线观看免费 | 国产精品亚洲午夜一区二区三区| 国产亚洲成aⅴ人片在线观看| 91香蕉视频mp4| 精东粉嫩av免费一区二区三区| 中文字幕日韩欧美一区二区三区| 欧美老肥妇做.爰bbww视频| 国产一区二区伦理| 亚洲网友自拍偷拍| 国产亚洲人成网站| 在线播放/欧美激情| 成人一区在线观看| 美洲天堂一区二卡三卡四卡视频| 亚洲欧美色一区| 国产人久久人人人人爽| 欧美在线观看一区| 国产成人在线视频免费播放| 亚洲成人av中文| 亚洲精品乱码久久久久久日本蜜臀| 日韩免费高清av| 欧美日韩国产综合一区二区三区| 国产精品中文字幕日韩精品 | 丁香婷婷综合色啪| 久久97超碰国产精品超碰| 亚洲午夜久久久久久久久电影院| 亚洲精品一区二区三区影院 | www.99精品| 久久国产精品无码网站| 午夜精品久久久久久久99水蜜桃| 国产精品超碰97尤物18| 欧美精品一区二区三区一线天视频| 色婷婷综合久久久久中文一区二区 | 欧美第一区第二区| 制服视频三区第一页精品| 色妞www精品视频| 99久久久久久99| voyeur盗摄精品| 丁香六月综合激情| 国产真实乱子伦精品视频| 日本va欧美va瓶| 日本视频免费一区| 日韩成人伦理电影在线观看| 午夜影院久久久| 日韩国产在线观看一区| 一片黄亚洲嫩模| 777奇米成人网| 欧美日韩视频第一区| 欧美伊人精品成人久久综合97| 99精品在线观看视频| 日本乱人伦一区| 色综合 综合色| 欧美日韩高清影院| 日韩一区二区三区四区 | 国产曰批免费观看久久久| 精品一区二区三区免费播放 | 久久久久免费观看| 国产精品天干天干在线综合| 国产精品国产三级国产三级人妇| 95精品视频在线| 欧美在线免费观看视频| 日韩三级电影网址| 日本一区二区三区久久久久久久久不| 国产精品免费观看视频| 亚洲欧美日韩一区二区三区在线观看| 亚洲一区二区三区国产| 日本在线不卡一区| 国产高清在线精品| 色94色欧美sute亚洲13| 日韩精品一区二区三区在线播放| 精品成人在线观看| 国产精品激情偷乱一区二区∴| 亚洲免费在线观看视频| 亚洲午夜在线观看视频在线| 蜜桃视频在线观看一区二区| 国产精品热久久久久夜色精品三区| 亚洲欧洲在线观看av| 日日骚欧美日韩| 成人av网站在线观看| 51精品国自产在线| 欧美激情综合五月色丁香小说| 一区二区三区欧美激情| 国产一区不卡在线| 精品视频一区三区九区| 欧美精品一区二区三区四区| 亚洲人午夜精品天堂一二香蕉| 日本视频免费一区| 欧美性欧美巨大黑白大战| 久久久久久久久蜜桃| 午夜精品一区二区三区三上悠亚| 国产精品123|