亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
美女视频黄频大全不卡视频在线播放| 一区二区三区色| 一区二区三区精品在线| 美国欧美日韩国产在线播放| 91在线精品一区二区| 日韩欧美电影一二三| 亚洲福利视频一区二区| www.视频一区| 精品人伦一区二区色婷婷| 亚洲一区二区三区视频在线播放| 高清在线观看日韩| 日韩欧美国产精品一区| 偷拍日韩校园综合在线| 在线免费av一区| 亚洲人成在线播放网站岛国| 成人性生交大片免费看在线播放 | 美女mm1313爽爽久久久蜜臀| 91成人网在线| 综合激情网...| 国产成人自拍在线| 久久久www免费人成精品| 六月丁香婷婷色狠狠久久| 欧美日韩免费一区二区三区| 亚洲欧美一区二区久久| 99国产精品国产精品久久| 欧美经典一区二区三区| 久草精品在线观看| 欧美一区二区三区人| 日韩精品亚洲专区| 欧美二区三区的天堂| 亚洲一区在线视频观看| 欧美色精品在线视频| 亚洲一区二区中文在线| 91久久奴性调教| 夜夜精品浪潮av一区二区三区| 99国产精品久久久久| 国产精品不卡一区| caoporen国产精品视频| 国产精品久久久久久久久免费桃花 | 欧美变态凌虐bdsm| 麻豆精品新av中文字幕| 日韩欧美成人一区二区| 精品一区二区三区在线播放| 亚洲天堂中文字幕| 色综合亚洲欧洲| 一区二区三区在线观看视频| 一本一道波多野结衣一区二区| 亚洲免费观看在线视频| 在线观看三级视频欧美| 亚洲国产一二三| 8v天堂国产在线一区二区| 蜜桃av噜噜一区二区三区小说| 欧美成人一区二区三区片免费| 精品午夜久久福利影院| 国产欧美视频一区二区| proumb性欧美在线观看| 一区二区三区色| 9191国产精品| 国产美女娇喘av呻吟久久 | 欧美高清视频在线高清观看mv色露露十八 | 91麻豆精品国产91久久久久久久久| 青青草成人在线观看| 久久综合一区二区| 成人黄色a**站在线观看| 亚洲女人的天堂| 91麻豆精品久久久久蜜臀| 国产一区二区三区蝌蚪| 日韩理论片中文av| 欧美绝品在线观看成人午夜影视| 麻豆国产精品官网| 欧美国产日韩在线观看| 91九色最新地址| 日本中文一区二区三区| 久久久久九九视频| 91久久精品网| 久久精品久久99精品久久| 欧美国产一区在线| 欧美日韩一区在线| 国产乱子伦一区二区三区国色天香| 中文字幕在线不卡一区二区三区| 欧美性猛交xxxxxxxx| 精品一区二区三区不卡| 国产精品福利在线播放| 3atv一区二区三区| 成人做爰69片免费看网站| 亚洲一区电影777| 久久综合九色综合97_久久久| 9i在线看片成人免费| 日韩激情在线观看| 中文欧美字幕免费| 欧美久久久久免费| 国产suv精品一区二区883| 亚洲电影视频在线| 欧美国产日韩精品免费观看| 欧美精品一卡二卡| 成人中文字幕电影| 日日夜夜免费精品| 中文字幕一区在线观看| 日韩一区二区在线观看| 91网上在线视频| 国产综合色精品一区二区三区| 亚洲午夜久久久久久久久电影网| 久久精品亚洲国产奇米99| 欧美日韩在线直播| 成人丝袜18视频在线观看| 爽爽淫人综合网网站| 日韩美女啊v在线免费观看| 精品少妇一区二区三区视频免付费 | 日本亚洲一区二区| 亚洲男同性视频| 久久久亚洲精品石原莉奈 | 2欧美一区二区三区在线观看视频| 不卡的av网站| 美腿丝袜亚洲综合| 亚洲不卡在线观看| 亚洲天堂av老司机| 久久精品人人做人人综合| 欧美丰满一区二区免费视频 | 久久国产麻豆精品| 亚洲成a人v欧美综合天堂| 亚洲欧美日韩在线| 亚洲国产成人一区二区三区| 日韩欧美的一区| 91精品国产综合久久香蕉的特点| 91啪亚洲精品| 成人美女在线视频| 国产精品亚洲综合一区在线观看| 日本成人中文字幕| 亚洲国产精品一区二区久久| 亚洲婷婷在线视频| 国产精品乱码一区二区三区软件| 精品处破学生在线二十三| 337p亚洲精品色噜噜| 欧美色图片你懂的| 欧美视频一区二区在线观看| 色吊一区二区三区| 99久久精品国产网站| 成人97人人超碰人人99| 国产成人综合视频| 国产成人在线电影| 国产凹凸在线观看一区二区| 国产一区二区三区四区在线观看| 精品综合久久久久久8888| 久久99九九99精品| 狠狠久久亚洲欧美| 国内一区二区在线| 国产精品亚洲第一区在线暖暖韩国| 免费观看久久久4p| 免费成人在线视频观看| 欧美a一区二区| 美女脱光内衣内裤视频久久网站| 亚洲成人动漫一区| 日韩一区精品字幕| 青青草精品视频| 久久99精品久久久久久久久久久久| 日本不卡视频在线观看| 奇米影视在线99精品| 蜜桃久久av一区| 国产一区二区美女| 国产精品1024| av在线不卡电影| 色网站国产精品| 欧美日韩免费电影| 欧美一卡二卡三卡| 精品国偷自产国产一区| 久久久久久久精| 中文字幕一区在线观看| 一区二区三区美女| 污片在线观看一区二区 | 中文字幕一区二区三区av| 国产精品美女久久久久久久久 | 日韩视频中午一区| 久久综合九色欧美综合狠狠| 久久久www成人免费毛片麻豆| 日本一区二区久久| 综合av第一页| 亚欧色一区w666天堂| 美女免费视频一区二区| 国产毛片精品视频| 色综合久久综合网97色综合| 欧美天天综合网| 精品国产一区二区三区久久影院 | 91精品国产综合久久久久久| 日韩一二三四区| 国产日韩在线不卡| 亚洲综合一区二区三区| 免费的国产精品| 成人aaaa免费全部观看| 欧美日韩亚洲丝袜制服| 精品国内片67194| 最近日韩中文字幕| 视频在线观看国产精品| 国产精选一区二区三区| 91麻豆.com| 日韩一区二区中文字幕| 国产精品美女一区二区| 首页国产丝袜综合| 国产激情视频一区二区三区欧美 | 久久综合久久99| 亚洲免费观看在线观看|