亚洲欧美第一页_禁久久精品乱码_粉嫩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 content=text/html;charset=iso-8859-1 http-equiv=content-type>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR>
<META 
content="StarMax HD:Microsoft Office 98:Templates:Web Pages:Blank Web Page" 
name=Template></HEAD>
<BODY link=#0000ff vLink=#800080>
<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一区二区三区免费野_久草精品视频
亚洲免费观看高清完整版在线| 欧美性一级生活| 精品一区二区久久| 日韩不卡免费视频| 日韩精品欧美精品| 中文字幕一区二区三区在线播放 | 国产在线播放一区| 国产在线国偷精品产拍免费yy| 精品一区二区三区视频在线观看 | 国产视频一区不卡| 亚洲视频中文字幕| 亚洲一区国产视频| 美国精品在线观看| www.综合网.com| 51久久夜色精品国产麻豆| 国产午夜精品一区二区三区嫩草 | 欧美日韩一区二区在线观看视频 | 久久99九九99精品| 成人在线视频首页| 欧美日韩电影在线| 国产色产综合产在线视频| 亚洲天堂免费看| 国产一区二区三区最好精华液| 99在线视频精品| 久久精品视频免费| 日本不卡一区二区| 欧美亚洲国产一区二区三区va| 2020国产精品自拍| 日韩中文字幕1| 91黄色免费看| 亚洲自拍偷拍麻豆| 99精品1区2区| 中文无字幕一区二区三区| 日本不卡一区二区三区| 99久久婷婷国产综合精品电影 | 日韩成人一区二区三区在线观看| 北条麻妃一区二区三区| 久久久青草青青国产亚洲免观| 激情综合网av| 亚洲精品国产第一综合99久久| 日韩精品乱码av一区二区| 色先锋aa成人| 亚洲欧美国产77777| www.色综合.com| 亚洲最大的成人av| 欧美性videosxxxxx| 首页欧美精品中文字幕| 欧美日高清视频| 韩国欧美国产一区| 国产视频911| 91福利精品视频| 奇米精品一区二区三区在线观看 | 亚洲黄色小说网站| 欧美高清激情brazzers| 久久成人综合网| 中文字幕亚洲区| 精品日韩一区二区三区免费视频| 国产成a人无v码亚洲福利| 一区二区在线观看不卡| 日韩欧美高清在线| 91偷拍与自偷拍精品| 日韩精品午夜视频| 亚洲欧美日韩系列| 欧美精品一区男女天堂| 欧美在线观看18| 国产精品456露脸| 日韩高清国产一区在线| 国产精品入口麻豆九色| 日韩精品一区二区在线| 色成年激情久久综合| 成人在线综合网| 国产一区二区精品在线观看| 亚洲一二三区在线观看| 中文字幕乱码亚洲精品一区| 欧美电影一区二区| 欧美视频一区二区三区在线观看| 成人午夜激情视频| 激情综合色播五月| 精品系列免费在线观看| 手机精品视频在线观看| 五月天激情综合| 日本中文字幕不卡| 日韩高清不卡在线| 亚洲国产毛片aaaaa无费看 | 欧美在线小视频| 一本色道久久综合亚洲aⅴ蜜桃| 成人av第一页| 9人人澡人人爽人人精品| 成人丝袜高跟foot| www.欧美日韩国产在线| 91国在线观看| 91精品国产全国免费观看| 日韩欧美色综合| 久久久亚洲精品石原莉奈| 国产精品嫩草影院av蜜臀| 国产精品传媒入口麻豆| 亚洲一区二区精品视频| 日本vs亚洲vs韩国一区三区 | 亚洲精品久久7777| 七七婷婷婷婷精品国产| 国产999精品久久| 欧美天堂亚洲电影院在线播放| 欧美一卡2卡3卡4卡| 精品国产乱码久久久久久浪潮 | 久久国产精品99久久人人澡| 美女网站一区二区| 精品在线观看视频| a4yy欧美一区二区三区| 91精品国产手机| 国产精品的网站| 国产尤物一区二区| 欧美亚洲一区三区| 久久蜜桃一区二区| 天堂在线亚洲视频| 一本色道久久综合亚洲91| 精品少妇一区二区三区在线视频| 亚洲人成伊人成综合网小说| 久久精品国产澳门| 欧美性生活一区| 精品国产成人系列| 麻豆精品视频在线观看| 制服丝袜中文字幕亚洲| 亚洲精品视频自拍| 91国在线观看| 午夜精品视频一区| 在线亚洲+欧美+日本专区| ●精品国产综合乱码久久久久| 国产乱码精品一区二区三区忘忧草| 欧美日韩电影在线| 免费观看30秒视频久久| 欧美一级片免费看| 蜜桃久久精品一区二区| 日韩一区二区三区视频在线观看| 亚洲精品日韩一| 在线观看网站黄不卡| 一区二区三区精品视频| 在线播放中文字幕一区| 韩国一区二区视频| 亚洲欧洲色图综合| 色哦色哦哦色天天综合| 婷婷六月综合亚洲| 国产日韩欧美综合一区| 一本大道av伊人久久综合| 一区二区三区免费在线观看| 成人免费看视频| 香蕉成人伊视频在线观看| 日韩视频一区二区三区| 成年人午夜久久久| 日韩av在线免费观看不卡| 久久久激情视频| 欧美精选一区二区| k8久久久一区二区三区| 三级欧美在线一区| 中文字幕一区二区三区在线不卡| 一道本成人在线| 国产福利一区二区三区在线视频| 亚洲视频 欧洲视频| 日韩免费成人网| 在线观看日韩一区| av爱爱亚洲一区| 国产成人免费9x9x人网站视频| 手机精品视频在线观看| 亚洲男人电影天堂| 综合自拍亚洲综合图不卡区| 精品福利av导航| 在线播放91灌醉迷j高跟美女 | 国产亚洲一二三区| 欧美电影免费观看完整版| 国产mv日韩mv欧美| 日本麻豆一区二区三区视频| 一区二区三区在线观看国产| 自拍偷拍国产精品| 中文在线免费一区三区高中清不卡| 精品成人a区在线观看| 26uuu亚洲综合色欧美| 精品少妇一区二区三区日产乱码| 欧美伦理电影网| 日韩欧美激情一区| 久久综合久久鬼色中文字| 久久精品一二三| 国产日韩欧美a| 亚洲天堂成人在线观看| 亚洲成人av一区二区| 蜜桃在线一区二区三区| 久久99久久精品欧美| 国产传媒日韩欧美成人| 色婷婷精品大在线视频| 91麻豆精品国产91久久久| 久久亚洲综合色一区二区三区| 国产亚洲一本大道中文在线| 中文字幕av一区二区三区免费看| 亚洲欧洲成人精品av97| 国产色产综合色产在线视频| 国产成人综合在线观看| 韩国av一区二区三区| 成人av集中营| 欧美xxxxxxxx| 一区二区在线观看视频| 捆绑调教一区二区三区| 91在线高清观看|