亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲国产精品久久人人爱| 国产激情视频一区二区三区欧美 | 亚洲精品在线电影| 最新欧美精品一区二区三区| 首页国产欧美久久| www.色综合.com| 2024国产精品视频| 丝袜诱惑亚洲看片| 在线亚洲一区观看| 国产精品电影院| 久久爱另类一区二区小说| 欧美日韩精品综合在线| 国产精品人人做人人爽人人添| 免费成人美女在线观看.| 日本精品免费观看高清观看| 国产精品色哟哟网站| 精品一区二区三区影院在线午夜 | 日本少妇一区二区| 欧洲精品一区二区三区在线观看| 国产精品久久久久影院老司| 国产乱理伦片在线观看夜一区| 日韩欧美激情一区| 日本成人在线电影网| 91精品欧美久久久久久动漫| 亚洲一区二区三区精品在线| 在线视频国内一区二区| 亚洲欧美日韩一区二区三区在线观看| 懂色av一区二区三区蜜臀 | 成人综合在线观看| 国产日韩三级在线| 成人黄页毛片网站| 中文字幕成人在线观看| av色综合久久天堂av综合| 国产精品丝袜91| 不卡视频在线看| 亚洲色图另类专区| 欧美最猛性xxxxx直播| 亚洲午夜成aⅴ人片| 欧美精品粉嫩高潮一区二区| 日韩激情一区二区| 精品蜜桃在线看| 国产成人激情av| 国产精品成人在线观看| 91福利视频网站| 性欧美疯狂xxxxbbbb| 制服丝袜亚洲色图| 激情六月婷婷久久| 国产精品素人视频| 91国模大尺度私拍在线视频| 五月激情六月综合| 日韩免费福利电影在线观看| 国产精品一区二区在线观看网站| 国产精品亲子伦对白| 色婷婷精品久久二区二区蜜臂av| 亚洲成人中文在线| 精品国产123| 99re成人在线| 免费视频最近日韩| 国产亚洲一区二区三区在线观看| 成人av网站在线| 亚洲电影在线播放| www国产精品av| av在线一区二区三区| 亚洲成a人片在线不卡一二三区 | 欧美精品久久天天躁| 国产一区二区三区免费| 亚洲伦理在线免费看| 日韩一区二区三区电影在线观看| 成人深夜在线观看| 日韩国产在线观看一区| 亚洲国产精品精华液ab| 欧美精品自拍偷拍| 波多野结衣亚洲| 丝袜美腿亚洲综合| 日韩伦理av电影| 欧美大胆人体bbbb| 在线观看av不卡| 国产99久久久久久免费看农村| 一区二区三区国产豹纹内裤在线| 精品国精品国产| 欧美色图12p| 99r国产精品| 国产精品一区2区| 日本v片在线高清不卡在线观看| 国产精品传媒视频| 国产视频一区二区三区在线观看 | 久久久久一区二区三区四区| 91成人在线观看喷潮| 国产91丝袜在线18| 国产最新精品精品你懂的| 亚洲小说欧美激情另类| 中文字幕在线不卡一区二区三区| 日韩小视频在线观看专区| 欧美日韩一卡二卡| 在线观看不卡一区| 91天堂素人约啪| 成人av先锋影音| 国产成a人亚洲精| 精品系列免费在线观看| 日本亚洲天堂网| 五月激情六月综合| 午夜成人免费视频| 亚洲国产精品欧美一二99| 亚洲欧美偷拍卡通变态| 国产精品美女久久福利网站| 久久久亚洲国产美女国产盗摄 | 91麻豆精品国产91久久久久久久久| 色婷婷av一区二区三区之一色屋| 成人免费视频国产在线观看| 国产乱色国产精品免费视频| 麻豆成人在线观看| 久久不见久久见免费视频7| 美女国产一区二区三区| 青青草精品视频| 久久99精品久久久久久久久久久久| 午夜精品爽啪视频| 午夜精品视频在线观看| 日本在线观看不卡视频| 强制捆绑调教一区二区| 韩国一区二区视频| 精品写真视频在线观看| 九九精品一区二区| 国产一区二区三区视频在线播放| 国产资源在线一区| 国产盗摄一区二区| 99re视频这里只有精品| 色天天综合久久久久综合片| 欧美在线观看视频在线| 欧美久久久久免费| 欧美va在线播放| 日本一区二区电影| 亚洲人成网站精品片在线观看| 日韩伦理电影网| 水野朝阳av一区二区三区| 免费观看日韩av| 成人免费看的视频| 欧美在线综合视频| 日韩午夜激情视频| 国产欧美日韩不卡| 亚洲成人一区在线| 国产综合色产在线精品| 99久久精品费精品国产一区二区| 在线免费不卡视频| 欧美本精品男人aⅴ天堂| 久久精品人人做人人爽97| 亚洲美女偷拍久久| 久久精品国产99久久6| caoporen国产精品视频| 欧美日韩精品一区二区三区蜜桃| 亚洲精品一区二区三区蜜桃下载| 国产精品女人毛片| 丝袜美腿亚洲综合| 波多野结衣精品在线| 91精品黄色片免费大全| 国产精品视频你懂的| 午夜精品福利一区二区三区av| 九九视频精品免费| 91黄色在线观看| 久久久精品影视| 亚洲成人动漫一区| 不卡的av网站| 精品国产免费人成在线观看| 亚洲精品高清在线| 国产一区二区导航在线播放| 91激情五月电影| 久久精品综合网| 日韩中文字幕区一区有砖一区| 不卡的av中国片| 2017欧美狠狠色| 亚洲成人777| 91精品91久久久中77777| 国产喷白浆一区二区三区| 免费看欧美美女黄的网站| 色综合咪咪久久| 国产网红主播福利一区二区| 天堂va蜜桃一区二区三区漫画版| 91麻豆.com| 国产精品卡一卡二卡三| 国产精品一区二区视频| 91精品欧美一区二区三区综合在| 亚洲精品欧美激情| 菠萝蜜视频在线观看一区| 欧美精品一区二区久久久| 婷婷久久综合九色综合伊人色| 色综合久久久久久久久| 国产精品免费视频一区| 国产老女人精品毛片久久| 日韩一区二区不卡| 麻豆国产欧美日韩综合精品二区| 欧美精品亚洲一区二区在线播放| 综合欧美亚洲日本| 一本一本久久a久久精品综合麻豆| 欧美国产一区在线| 成人avav影音| ...av二区三区久久精品| 成人黄页毛片网站| 国产精品久久毛片a| fc2成人免费人成在线观看播放| 国产精品久久久久久久浪潮网站| 成人听书哪个软件好|