亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
制服丝袜日韩国产| 成人国产精品免费观看动漫| 欧美三级韩国三级日本一级| 亚洲综合小说图片| 9191久久久久久久久久久| 五月天一区二区| 日韩三级视频中文字幕| 精品一区二区在线视频| 精品国产网站在线观看| 国产成人无遮挡在线视频| 国产精品亲子乱子伦xxxx裸| 91麻豆国产在线观看| 亚洲成人一二三| 欧美va亚洲va香蕉在线| 国产aⅴ精品一区二区三区色成熟| 国产欧美一区二区在线| 不卡视频一二三四| 午夜av区久久| 久久久久国产一区二区三区四区| 99精品视频在线观看免费| 亚洲男人的天堂一区二区| 在线播放91灌醉迷j高跟美女| 精品在线播放免费| 中文字幕字幕中文在线中不卡视频| 欧美视频日韩视频| 国产一区欧美一区| 一区二区三区视频在线看| 欧美一区二区视频在线观看| 高清成人在线观看| 丝袜诱惑亚洲看片| 欧美国产丝袜视频| 91超碰这里只有精品国产| 国产999精品久久| 天堂久久久久va久久久久| 久久久噜噜噜久久中文字幕色伊伊| 色综合色综合色综合色综合色综合| 日本成人在线不卡视频| 亚洲国产精品成人综合色在线婷婷| 91国产丝袜在线播放| 国产一区二区三区四区五区美女 | 奇米综合一区二区三区精品视频| 久久天天做天天爱综合色| 欧美亚洲愉拍一区二区| 国产精品影视天天线| 亚洲国产精品久久久男人的天堂| 国产欧美一区二区精品秋霞影院| 91精品国产综合久久蜜臀| 99久久综合国产精品| 精品亚洲成a人在线观看| 亚洲综合视频网| 国产精品视频看| 精品国产91久久久久久久妲己| 一本大道久久a久久综合| 国产91精品欧美| 久久成人精品无人区| 亚洲成人一区二区在线观看| 亚洲日本护士毛茸茸| 国产欧美日本一区视频| 欧美变态凌虐bdsm| 宅男噜噜噜66一区二区66| 91久久线看在观草草青青| 成人av一区二区三区| 国内精品伊人久久久久av一坑| 天天色 色综合| 亚洲制服欧美中文字幕中文字幕| 国产精品久久福利| 久久久久久久久久美女| 日韩三级视频在线看| 6080国产精品一区二区| 欧美日韩国产三级| 欧美亚洲一区二区在线| 色综合视频在线观看| 一本高清dvd不卡在线观看| 97成人超碰视| 91国模大尺度私拍在线视频| 色综合久久久久久久| 91老师国产黑色丝袜在线| av动漫一区二区| 99久久er热在这里只有精品66| 粉嫩13p一区二区三区| 丁香激情综合国产| 99re免费视频精品全部| 99久久久精品| 欧美中文字幕久久| 欧美亚洲免费在线一区| 欧美日韩国产在线播放网站| 91麻豆精品国产自产在线观看一区| 欧美精品v日韩精品v韩国精品v| 这里是久久伊人| 精品99一区二区| 国产精品理伦片| 一区二区三区中文在线观看| 亚洲一区二区三区三| 三级在线观看一区二区 | 精品在线视频一区| 国产精品一区二区三区四区| 成人黄色片在线观看| 91香蕉视频污在线| 欧美亚洲动漫制服丝袜| 91精品国产日韩91久久久久久| 欧美一卡2卡3卡4卡| 久久精品亚洲精品国产欧美kt∨| 欧美激情一区二区| 亚洲乱码国产乱码精品精98午夜| 亚洲主播在线播放| 久久99久久久久| av不卡免费电影| 欧美久久久久久久久中文字幕| 日韩午夜激情电影| 中文字幕一区二区视频| 午夜精品成人在线视频| 国产一二精品视频| 在线观看日韩一区| 91麻豆精品国产91久久久久| 久久久久久久性| 亚洲一区二区中文在线| 乱一区二区av| 色噜噜狠狠色综合欧洲selulu| 91精品一区二区三区久久久久久 | 一区二区在线观看免费| 日韩福利视频网| 成人在线一区二区三区| 欧美亚洲自拍偷拍| 国产欧美一区二区三区鸳鸯浴 | 精品嫩草影院久久| 亚洲女子a中天字幕| 激情综合一区二区三区| 91色婷婷久久久久合中文| 欧美一级搡bbbb搡bbbb| 亚洲欧洲成人精品av97| 久久机这里只有精品| 99re这里只有精品视频首页| 欧美xxxxx牲另类人与| 亚洲综合图片区| www.亚洲在线| 国产亚洲综合av| 久久精品国产99久久6| 欧美午夜不卡视频| 国产精品九色蝌蚪自拍| 国产呦精品一区二区三区网站| 欧美日本国产一区| 亚洲视频狠狠干| 国产激情一区二区三区四区 | 欧美无乱码久久久免费午夜一区| 国产欧美日韩三区| 久久精品72免费观看| 欧美日韩专区在线| 亚洲欧美一区二区三区孕妇| 国产ts人妖一区二区| 精品国产乱码久久久久久老虎| 日韩激情在线观看| 欧美在线观看视频在线| 亚洲欧美在线观看| 成人美女视频在线看| 久久久久久久久久久久久久久99| 秋霞成人午夜伦在线观看| 欧美视频一区在线| 亚洲综合一二区| 日本韩国欧美在线| 一区二区三区在线视频免费观看| 风间由美一区二区三区在线观看 | 亚洲主播在线播放| 色婷婷久久99综合精品jk白丝| 国产精品久久久久久久久久免费看| 国产精品18久久久久| 精品国产91亚洲一区二区三区婷婷| 亚洲精选一二三| 亚洲成人av福利| 欧美老女人在线| 91.com在线观看| 一区二区三区四区中文字幕| 粉嫩高潮美女一区二区三区| 欧美国产精品v| 成人免费看视频| 亚洲天堂a在线| 国产精品1区2区3区在线观看| 色综合天天综合在线视频| 亚洲午夜电影在线| 91精品国产综合久久久久久 | 国产精品一区三区| 精品国产乱码久久久久久夜甘婷婷 | 精品一区二区三区日韩| 欧美一区二区三区视频在线观看| 日产精品久久久久久久性色| 欧美一区二视频| 极品销魂美女一区二区三区| 久久精品一区二区三区四区| 成人激情开心网| 一区二区三区欧美日韩| 欧美日韩卡一卡二| 精品在线观看视频| 亚洲国产岛国毛片在线| 日本韩国一区二区三区| 丝袜美腿一区二区三区| 日韩精品一区二区三区蜜臀 | 免费高清在线视频一区·| 久久久久99精品国产片| 99精品欧美一区二区三区综合在线| 亚洲最大的成人av| 欧美xxxxx裸体时装秀|