免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

8086匯編計數(shù)循環(huán):LOOP指令與CX寄存器調(diào)試指南

8086匯編計數(shù)循環(huán):LOOP指令與CX寄存器調(diào)試指南 匯編這門語言有個挺有意思的地方越是基礎(chǔ)的指令越容易在實(shí)際調(diào)試時把人卡住。循環(huán)和CX 寄存器就是典型例子??唇坛涛宸昼娋湍鼙诚翷OOP指令的語義但真正上手寫程序第一次跑出來的結(jié)果十有八九是錯的——要么死循環(huán)要么循環(huán)次數(shù)差一要么程序跑得好好的突然跳飛了。這篇內(nèi)容圍繞 8086 實(shí)模式下的計數(shù)循環(huán)展開把LOOP系列指令、CX 計數(shù)器的隱含用途、位移量的計算方式、嵌套循環(huán)的保護(hù)方案、DEBUG 單步驗(yàn)證的方法以及塊復(fù)制和循環(huán)展開的效率取舍一路講透。剛接觸匯編、正在做課程設(shè)計或者想搞明白為什么我的循環(huán)多跑了一次的讀者可以直接照著復(fù)現(xiàn)已經(jīng)能寫完整程序、但對指令編碼和標(biāo)志位影響沒細(xì)究過的同行也能從中找到一些平時容易忽略的細(xì)節(jié)。文中所有代碼都在 8086 指令集范圍內(nèi)用 MASM/TASM 風(fēng)格書寫配 DOSBox 或?qū)嶓w機(jī)都能跑。1. 先弄清楚 CX 在循環(huán)里到底扮演什么角色1.1 從一條 LOOP 指令說起LOOP這條指令短得離譜機(jī)器碼只有兩個字節(jié)格式是E2 cb其中cb是一個 8 位有符號位移量??伤鼉?nèi)部干的事并不簡單CPU 執(zhí)行到LOOP時會一口氣做完三步先把 CX 的內(nèi)容減一結(jié)果寫回 CX然后判斷 CX 是不是等于零如果不等于零就把 IP 加上那個 8 位位移量跳到目標(biāo)地址繼續(xù)執(zhí)行如果等于零就什么都不做順序執(zhí)行下一條指令。請注意順序是先減、后判這個順序決定了 CX 初值和實(shí)際循環(huán)次數(shù)之間的對應(yīng)關(guān)系。CX 裝 5循環(huán)體就執(zhí)行 5 次最后一次執(zhí)行完之后 CX 減到 0LOOP不再跳轉(zhuǎn)循環(huán)結(jié)束。這個關(guān)系看起來很直觀但正因?yàn)樘庇^很多人寫代碼的時候默認(rèn)我傳進(jìn)來 0 就是一次都不循環(huán)結(jié)果程序在主頻只有幾兆赫茲的老機(jī)器上空轉(zhuǎn)六萬多次才停下來——這個問題后面會專門用一節(jié)講。把LOOP拆開它其實(shí)等價于這么兩條指令的組合DEC CX JNZ 標(biāo)號區(qū)別在于LOOP只占 2 字節(jié)而DEC CX加JNZ rel8要占 3 字節(jié)更重要的是LOOP不修改任何標(biāo)志位而DEC會實(shí)打?qū)嵉馗膭?ZF、SF、PF、AF、OF。這個差異在循環(huán)體依賴標(biāo)志位的場合是致命的后面 2.3 節(jié)會展開。1.2 CX 的四個兼職身份CX 在 8086 里被定名成計數(shù)寄存器這個名字不是隨便起的。除了LOOP系列指令默認(rèn)拿它當(dāng)循環(huán)計數(shù)器它至少還有三份兼職寫循環(huán)的時候很容易撞車。第一份兼職是移位次數(shù)。8086 的移位和循環(huán)移位指令SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR移位次數(shù)只允許兩種形式寫死常數(shù) 1或者用 CL 指定。注意是 CL也就是 CX 的低八位。這是硬件層面的限制8086 沒有提供立即數(shù)移位的編碼方式。所以只要你的循環(huán)體里出現(xiàn)了變量移位CX 的低字節(jié)就被動了如果不小心把計數(shù)器也放在 CX 上循環(huán)次數(shù)立刻失控。第二份兼職是串操作重復(fù)次數(shù)。REP、REPE、REPNE這些前綴指令本質(zhì)上就是以 CX 為次數(shù)、每執(zhí)行一次串操作自動減一的硬件循環(huán)。REP MOVSB干的事情和手寫一個LOOP加MOVSB一模一樣只是更快。第三份兼職是除法除數(shù)。DIV CX、IDIV CX會把 CX 當(dāng)除數(shù)用這在循環(huán)體里做整數(shù)運(yùn)算時也得留個心眼。一份兼職撞上另一份循環(huán)就亂了。我見過最典型的翻車現(xiàn)場是循環(huán)體里調(diào)了個子程序子程序內(nèi)部為了字符串拷貝把 CX 設(shè)成了字符串長度返回之后外層的循環(huán)計數(shù)器已經(jīng)被改成別的數(shù)了外層循環(huán)要么提前結(jié)束要么多跑幾十次。提示寫循環(huán)之前先掃一遍循環(huán)體看看里面有沒有MOV CX、REP前綴、SHL AX, CL這類會碰到 CX 的指令。有的話要么換寄存器要么進(jìn)循環(huán)體之前壓棧保護(hù)。1.3 為什么不用 DX 或者 BX 來計數(shù)既然 CX 這么容易被別的指令搶走為什么不用 DX 或者 BX 當(dāng)計數(shù)器原因有三個都很實(shí)際。第一個是指令長度。LOOP是專門為 CX 設(shè)計的別的寄存器沒有對應(yīng)的單指令循環(huán)。你要是用 DX只能寫成DEC DX加JNZ 標(biāo)號三條字節(jié)起步循環(huán)體稍微長一點(diǎn)的程序字節(jié)數(shù)累積起來就是可觀的差異。在當(dāng)年內(nèi)存按 KB 計算的年代這個差異值得計較。第二個是可讀性約定。匯編代碼是給人看的不是只給機(jī)器看的。整個 8086 生態(tài)里CX 當(dāng)計數(shù)器、SI 當(dāng)源指針、DI 當(dāng)目標(biāo)指針、AX 當(dāng)累加器、BX 當(dāng)基址這是一套約定俗成的分工。你按這個分工寫別人接手一眼就知道每行在干嘛你偏要用 BX 計數(shù)看代碼的人每次都得回頭確認(rèn)一遍寄存器含義。第三個是和 REP 前綴的配合。如果你的循環(huán)體內(nèi)核其實(shí)是串操作直接用REP前綴比手寫LOOP快得多而REP只認(rèn) CX。用別的寄存器計數(shù)就沒法享受這個加速。當(dāng)然這不是死規(guī)矩。循環(huán)嵌套的時候 CX 只有一個內(nèi)層循環(huán)我通常就用 DI 或 BX 配合DEC、JNZ來寫省掉壓棧開銷。這個取舍后面 3.4 節(jié)會講。2. LOOP 家族的指令細(xì)節(jié)與位移計算2.1 LOOP / LOOPE / LOOPNE / JCXZ 的差別LOOP不是孤零零一條指令它有一個家族四條指令各有各的適用場景。把它們的判斷條件列清楚比背定義管用。指令機(jī)器碼執(zhí)行動作轉(zhuǎn)移條件典型用途LOOPE2 cbCX 減一CX ≠ 0固定次數(shù)的計數(shù)循環(huán)LOOPE同LOOPZE1 cbCX 減一CX ≠ 0 且 ZF 1查找循環(huán)找到即停LOOPNE同LOOPNZE0 cbCX 減一CX ≠ 0 且 ZF 0查找循環(huán)沒找到繼續(xù)JCXZE3 cb不改變 CXCX 0循環(huán)入口前的空次數(shù)判斷LOOPE和LOOPNE這兩個帶條件判斷的版本很適合寫在數(shù)組里找某個值這類邏輯。比如在一串字節(jié)里找第一個等于 0 的元素每輪比較完用CMP設(shè)置 ZF然后LOOPNE繼續(xù)找找到的時候 ZF 1循環(huán)因?yàn)闂l件不滿足而退出此時 CX 的值還能反推出元素的位置。這里有個容易被忽略的點(diǎn)LOOPE因?yàn)橐瑫r看 ZF它的退出條件是或的關(guān)系——要么 CX 走到 0要么 ZF 不滿足任意一個成立就退出。這意味著循環(huán)結(jié)束后你必須再判斷一次到底是哪種情況退出的否則分不清找到了還是找完了沒找到。老手通常會在循環(huán)之后跟一條條件跳轉(zhuǎn)把兩種結(jié)局分開處理。JCXZ則是另一個角色。它不修改 CX也不影響標(biāo)志位只是單純地看 CX 是不是零。因?yàn)樗贿f減 CX所以不能當(dāng)循環(huán)用只能放在循環(huán)前面防止次數(shù)為 0 卻還進(jìn)循環(huán)體的意外。2.2 位移量是怎么算出來的LOOP的位移字段只有一個字節(jié)是有符號數(shù)取值范圍 -128 到 127。這個數(shù)字不是標(biāo)號的絕對地址而是相對下一條指令的偏移。CPU 執(zhí)行LOOP時IP 已經(jīng)指向了LOOP的下一條指令所以用下一條指令的地址 位移量才是跳轉(zhuǎn)目標(biāo)。拿一段實(shí)際的代碼來算。假設(shè)代碼段起始偏移是 0000H0000 B9 06 00 MOV CX, 6 0003 BE 00 00 MOV SI, 0 0006 B8 00 00 MOV AX, 0 0009 03 04 ADD AX, [SI] 000B 46 INC SI 000C 46 INC SI 000D E2 FA LOOP 0009LOOP指令本身位于 000DH占兩個字節(jié)所以下一條指令的地址是 000FH。目標(biāo)是 0009H。位移量 0009H - 000FH -6用 8 位補(bǔ)碼表示就是 FAH。所以機(jī)器碼是E2 FA跟上面寫的對上了。反過來如果你在 DEBUG 里看到一條E2 F9怎么推目標(biāo)地址F9H 作為有符號數(shù)是 -7假設(shè)這條指令在 000EH下一條就是 0010H0010H - 7 0009H。目標(biāo)標(biāo)號在 0009H。這套計算沒什么技巧但必須會因?yàn)檎{(diào)試的時候沒有源代碼只有機(jī)器碼你得能從字節(jié)反推出跳轉(zhuǎn)目標(biāo)才能判斷跳飛了是跳到哪兒去了。至于 ±128 字節(jié)的限制這是 8 位位移字段的硬邊界跟標(biāo)號寫在哪沒關(guān)系。循環(huán)體寫長了LOOP就夠不著。這個坑后面 4.3 節(jié)有專門的改寫方案。注意不同匯編器對LOOP短跳轉(zhuǎn)越界的報錯措辭不一樣MASM 一般提示Jump out of rangeNASM 會說short jump out of range。看到這類報錯先量一下循環(huán)體長度基本就定位了。2.3 LOOP 不碰標(biāo)志位這件事有多重要前面提過LOOP和DEC CX加JNZ的等價性但有一處不等價標(biāo)志位。LOOP做的事情只有兩件CX 減一、判斷是否為零全程不動標(biāo)志寄存器。DEC CX則會更新 ZF、SF、PF、AF、OF。為什么不改標(biāo)志這么重要舉一個具體場景。循環(huán)體內(nèi)部做比較比較結(jié)果保存在 ZF 里然后循環(huán)結(jié)束——如果你用DEC CX / JNZ收尾DEC會先把 ZF 覆蓋掉你原來比較出來的結(jié)果就沒了。而用LOOP收尾ZF 原封不動出了循環(huán)還能接著JE、JNE這就是差別。再比如循環(huán)體里有CMP [SI], AL配合LOOPE做查找如果LOOPE換成DEC CX加JNZ那DEC在LOOPE的位置上會先動標(biāo)志LOOPE賴以判斷的 ZF 就不可靠了。這類 bug 特別隱蔽程序不一定崩但結(jié)果不對且很可能在不同機(jī)器上表現(xiàn)不一樣。所以我的經(jīng)驗(yàn)是只要循環(huán)靠 CX 計數(shù)且循環(huán)體內(nèi)有依賴標(biāo)志位的比較運(yùn)算一律優(yōu)先用LOOP收尾。只有在循環(huán)體超長導(dǎo)致LOOP夠不著或者需要換寄存器計數(shù)的時候才退而求其次用DEC加JNZ并且在循環(huán)出口處重新做一次判斷不要指望標(biāo)志位能活下來。3. 完整實(shí)操從求和程序到 DEBUG 單步驗(yàn)證3.1 環(huán)境與源程序骨架這一節(jié)用一個數(shù)組求和的完整程序把前面講的點(diǎn)串起來。程序在 DOS 實(shí)模式下跑需要一個 8086 匯編器和 DOSBox 之類的兼容環(huán)境。我平時用的是 MASM 5.0 配合 DOSBox源文件后綴.asm編譯鏈接之后生成.exe用 DEBUG 加載調(diào)試。程序需求很樸素內(nèi)存里放六個 16 位整數(shù)用循環(huán)把它們加起來結(jié)果存到內(nèi)存變量里。選這個例子是因?yàn)樗Y(jié)構(gòu)干凈循環(huán)體只有兩條指令位移量小適合先把手感建立起來再上復(fù)雜的。DATA SEGMENT ARRAY DW 12, 34, 56, 78, 90, 11 COUNT EQU 6 TOTAL DW 0 DATA ENDS STACK1 SEGMENT STACK DW 64 DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK1 START: MOV AX, DATA MOV DS, AX MOV CX, COUNT ; 計數(shù)器初值 元素個數(shù) LEA SI, ARRAY ; SI 指向數(shù)組首地址 XOR AX, AX ; 累加器清零同時清掉 CF NEXT: ADD AX, [SI] ; 累加當(dāng)前元素 ADD SI, 2 ; 指向下一個字 LOOP NEXT ; CX 減一非零繼續(xù) MOV TOTAL, AX ; 結(jié)果落地 MOV AH, 4CH INT 21H ; 返回 DOS CODE ENDS END START程序骨架里有幾個細(xì)節(jié)值得掰開說。MOV AX, DATA / MOV DS, AX這兩行不能省也不能寫成MOV DS, DATA——8086 不允許直接把段地址立即數(shù)送進(jìn)段寄存器必須借道通用寄存器。這是實(shí)模式匯編的入門級坑第一節(jié)課基本都會踩一次。XOR AX, AX比MOV AX, 0短一個字節(jié)而且是公認(rèn)的清零慣用法。這里還順帶把 CF 清了為后面可能的進(jìn)位運(yùn)算留下干凈狀態(tài)。ADD SI, 2這一行在純 8086 上會被匯編成81 C6 02 00四個字節(jié)。因?yàn)?8086 的加法立即數(shù)指令只有 16 位立即數(shù)的編碼形式80286 之后才引入了 8 位立即數(shù)的緊湊格式。如果你想讓代碼更短可以寫成兩條INC SI各占一字節(jié)省兩個字節(jié)但執(zhí)行時間反而更長——兩條指令的取指和譯碼開銷抵不過一次四字節(jié)指令。這個取舍在現(xiàn)代 CPU 上意義不大但在老機(jī)器上曾經(jīng)是值得爭論的話題。3.2 逐條拆解求和循環(huán)從NEXT標(biāo)號開始的循環(huán)體只有三條指令把執(zhí)行過程走一遍。初始狀態(tài)CX 6SI 指向 ARRAY 首地址AX 0。第一輪ADD AX, [SI]把 12 加進(jìn) AXAX 變成 12ADD SI, 2讓 SI 前進(jìn)兩個字LOOP把 CX 減到 5非零跳回NEXT。第二輪加 34AX 變成 46CX 減到 4繼續(xù)。依此類推第六輪加 11AX 得到最終的和 281然后 CX 減到 0LOOP不跳轉(zhuǎn)落到MOV TOTAL, AX。六個數(shù)字手算一遍12 34 46 56 102 78 180 90 270 11 281。程序跑出來的TOTAL應(yīng)該是 0121H因?yàn)?281 的十進(jìn)制轉(zhuǎn)十六進(jìn)制是 0119H——等一下281 256 25 100H 19H 119H。對0119H。這個數(shù)字在 DEBUG 里可以用D DS:0直接看數(shù)據(jù)段驗(yàn)證。數(shù)組占 12 個字節(jié)TOTAL緊跟在后面偏移是 000CH值是19 01小端序低字節(jié)在前??吹竭@個序列程序就對了。有個地方容易出問題ADD SI, 2的步長必須和數(shù)據(jù)類型匹配。數(shù)組是DW定義的每個元素兩個字節(jié)所以步長是 2。如果定義成DB步長就得改成 1如果寫錯了讀到的是相鄰兩個字節(jié)拼起來的數(shù)結(jié)果會莫名其妙。這類錯誤在調(diào)試時表現(xiàn)為結(jié)果看著像個正常數(shù)但就是不對而且往往前幾個數(shù)還是對的后面才開始飄。提示累加類程序的經(jīng)典自檢方法是拿第一個元素單獨(dú)跑一次——把 COUNT 改成 1看結(jié)果是不是等于第一個元素。如果是說明尋址和累加邏輯沒問題再把 COUNT 改回去。這個手法能把邏輯錯和步長錯快速區(qū)分開。3.3 用 DEBUG 盯住 CX 的每一次變化代碼寫完編譯通過不等于程序是對的。匯編這門東西靜態(tài)看代碼只能發(fā)現(xiàn)語法錯誤邏輯錯誤全靠調(diào)試器抓。DEBUG 的三個命令足夠應(yīng)付絕大多數(shù)循環(huán)問題R看寄存器T單步G帶斷點(diǎn)運(yùn)行。先用T命令走幾步看看 CX 的變化節(jié)奏-r AX0000 BX0000 CX0006 DX0000 SP0100 BP0000 SI0000 DI0000 DS0B2A ES0B2A SS0B37 CS0B2A IP0010 NV UP EI PL ZR NA PE NC 0B2A:0010 B90600 MOV CX,0006 -t AX0000 BX0000 CX0006 DX0000 SP0100 BP0000 SI0000 DI0000 0B2A:0013 BE0C00 MOV SI,000C -t -t AX0000 BX0000 CX0006 DX0000 SP0100 BP0000 SI000C DI0000 0B2A:0019 0304 ADD AX,[SI] -t AX000C BX0000 CX0006 DX0000 SP0100 BP0000 SI000C DI0000上面是示意輸出具體段值隨環(huán)境變化但觀察點(diǎn)很明確MOV CX, 6執(zhí)行后 CX 是 0006ADD AX,[SI]執(zhí)行后 AX 變成 000CH也就是十進(jìn)制的 12正好是第一個元素此時 CX 還是 0006因?yàn)檫€沒執(zhí)行到LOOP。繼續(xù)T到LOOP那條指令再走一步CX 就會變成 0005IP 跳回NEXT。真正高效的調(diào)試方式是G加斷點(diǎn)。在LOOP指令的地址上下斷點(diǎn)反復(fù)G每停一次看一次 CX能在一分鐘內(nèi)確認(rèn)循環(huán)次數(shù)對不對-g 001f AX002E BX0000 CX0006 DX0000 ... -g 001f AX005C BX0000 CX0005 DX0000 ...注意LOOP停在斷點(diǎn)上時CX 還沒被遞減所以第一次停在斷點(diǎn)看到的是 6第二次是 5。這個停在斷點(diǎn)上看到的是遞減前的值的細(xì)節(jié)第一次用斷點(diǎn)調(diào)試循環(huán)的人幾乎都會困惑一下。我在教別人調(diào)試循環(huán)的時候一般會讓他們做一件事把 CX 的每次變化抄在紙上六次一輪和手算的累加過程對一遍。聽起來笨但比對兩三遍之后對先減后判的理解就從概念變成肌肉記憶了。3.4 嵌套循環(huán)里 CX 的保護(hù)單層循環(huán)用 CX 天經(jīng)地義一進(jìn)嵌套就麻煩——CX 只有一個內(nèi)外兩層都要計數(shù)怎么辦三種方案各有適用場合。方案一壓棧保護(hù)。外層進(jìn)內(nèi)層之前PUSH CX內(nèi)層跑完P(guān)OP CX再執(zhí)行外層的LOOP。這是最直白、最不容易出錯的做法。MOV CX, 5 ; 外層次數(shù) OUTER: PUSH CX ; 保護(hù)外層計數(shù) MOV CX, 4 ; 內(nèi)層次數(shù) INNER: ; 內(nèi)層循環(huán)體 LOOP INNER POP CX ; 恢復(fù)外層計數(shù) LOOP OUTER壓棧的代價是兩次內(nèi)存訪問配上棧操作本身的指令開銷在緊湊的內(nèi)層循環(huán)里不算便宜。但它的好處是絕對可靠不用擔(dān)心內(nèi)層代碼有沒有動過 CX。方案二換寄存器。外層用 CX 走LOOP內(nèi)層用 DI 或 BX 配合DEC / JNZ兩個計數(shù)器互不干擾。MOV CX, 5 ; 外層 OUTER: MOV DI, 4 ; 內(nèi)層 INNER: ; 內(nèi)層循環(huán)體 DEC DI JNZ INNER LOOP OUTER省掉了壓棧彈棧但多了DEC的指令開銷而且DEC DI會修改標(biāo)志位。內(nèi)層循環(huán)依賴標(biāo)志位的場合要小心。方案三計數(shù)器放內(nèi)存。用一個DW變量當(dāng)內(nèi)層計數(shù)器DEC加JNZ直接操作內(nèi)存。速度最慢但寄存器壓力最小適合內(nèi)層循環(huán)體已經(jīng)把寄存器用得七七八八的情況。三種方案怎么選我的判斷標(biāo)準(zhǔn)是看內(nèi)層循環(huán)體的長度和調(diào)用頻率。內(nèi)層循環(huán)體短、跑得次數(shù)多選方案二內(nèi)層循環(huán)體長、邏輯復(fù)雜選方案一求穩(wěn)寄存器實(shí)在不夠用了才考慮方案三。嵌套層次超過兩層的時候建議直接把計數(shù)器都放內(nèi)存代碼可讀性比那點(diǎn)性能重要得多。三層嵌套的壓棧彈棧順序一旦寫錯出錯現(xiàn)場會非常難查——程序不崩只是結(jié)果不對而且只在特定輸入下才不對。4. 常見問題與排查技巧實(shí)錄4.1 初值給 0跑出 65536 次這是LOOP最經(jīng)典的坑沒有之一。CX 初值為 0 的時候LOOP并不是一次都不循環(huán)而是循環(huán) 65536 次。原因在先減后判這四個字。CX 等于 0執(zhí)行LOOP先減一0 - 1 在 16 位無符號數(shù)里等于 FFFFH也就是 65535不等于零于是跳轉(zhuǎn)。接下來每次減一要走 65535 次才能回到 0。加上第一次總共 65536 次。這個坑在兩種場景下最容易觸發(fā)。第一種循環(huán)次數(shù)來自外部輸入。比如從鍵盤讀一個數(shù)字當(dāng)循環(huán)次數(shù)用戶輸入 0程序就陷進(jìn)去了。這種情況下必須用JCXZ在循環(huán)入口前攔一道MOV CX, [COUNT] JCXZ DONE ; 次數(shù)為 0直接跳過 NEXT: ; 循環(huán)體 LOOP NEXT DONE:第二種循環(huán)次數(shù)是算出來的差值。比如從地址 A 到地址 B 復(fù)制數(shù)據(jù)長度等于 B 減 A。如果 B 和 A 相等長度是 0LOOP就開始空轉(zhuǎn)。這類運(yùn)算的結(jié)果最好在進(jìn)循環(huán)之前用CMP CX, 0加JE判一下。注意JCXZ只是在入口判一次如果 CX 是在循環(huán)體內(nèi)部被改到 0它救不了你。所以這道防線只對初值為零有效。還有一種情況更隱蔽CX 的高位被別的東西污染了。比如你本來只想用 CL 存?zhèn)€值結(jié)果上面某條指令動了 CHCX 整體變成 0x0500 之類LOOP就會跑 1280 次。排查這類問題的方法是單步到LOOP之前用R命令看 CX 的完整 16 位值而不是只看低字節(jié)。4.2 循環(huán)體里偷吃 CX 的指令CX 被循環(huán)體內(nèi)部的指令改掉是第二大高頻問題。表現(xiàn)形式有兩種一是循環(huán)次數(shù)變多程序耗時明顯拉長二是循環(huán)次數(shù)變少結(jié)果只算了一部分。前面提過的三份兼職就是三大嫌疑人。REP前綴最狠。REP MOVSB、REP STOSB執(zhí)行完之后CX 一定變成 0。如果你的外層循環(huán)計數(shù)器也在 CX 上內(nèi)層一個REP就把外層歸零了外層循環(huán)立刻結(jié)束程序看起來跑完了但結(jié)果只處理了第一趟。變量移位次之。MOV CL, 3加SHL AX, CL這種寫法會把 CX 的低字節(jié)改掉。如果計數(shù)器只用 CL 的一部分且移位次數(shù)很小可能表現(xiàn)成循環(huán)多跑了幾次不容易第一時間發(fā)現(xiàn)。除法最隱蔽。DIV CX執(zhí)行之后CX 本身不變但整個運(yùn)算把 AX 和 DX 都覆蓋了。如果你的累加器在 AX 上除完就沒了。雖然不直接改 CX但和 CX 相關(guān)的運(yùn)算鏈一起被破壞癥狀同樣表現(xiàn)為數(shù)算錯了。排查這類問題我一般用二分法先把循環(huán)體里的指令注釋掉一半看 CX 是否穩(wěn)定穩(wěn)定就說明問題在被注釋的那一半然后繼續(xù)二分。比逐條讀代碼快得多。4.3 跳超出范圍LOOP 匯編不過循環(huán)體寫長了LOOP的 8 位位移字段裝不下匯編器直接報錯。這個錯誤很好認(rèn)換一種寫法就能過去NEXT: ; 很長的循環(huán)體 DEC CX JNZ NEXTJNZ用的是 8 位位移跟LOOP一樣有 ±128 的限制換成它不一定解決問題。要徹底擺脫距離限制得用JMP類的近跳轉(zhuǎn)配合條件判斷NEXT: ; 很長的循環(huán)體 DEC CX JZ EXIT JMP NEXT EXIT:JMP是近跳轉(zhuǎn)16 位位移能覆蓋整個段。缺點(diǎn)是每次循環(huán)多一條指令代碼可讀性也差一點(diǎn)。改寫的時候要留意標(biāo)志位。原來是LOOP不碰標(biāo)志換成DEC CX之后標(biāo)志被改了。如果循環(huán)體里最后一次比較的結(jié)果需要在循環(huán)外繼續(xù)用得在DEC之前先把結(jié)果保存進(jìn)變量或寄存器否則出了循環(huán)再判斷就是錯的。還有一種情況是循環(huán)體里嵌套了另一個LOOP內(nèi)外層加起來超了 128 字節(jié)但每一層單獨(dú)看都沒超。這時候匯編器可能只報外層有問題實(shí)際是內(nèi)外層共同的位移和超限。解決思路一樣把內(nèi)層改成DEC / JNZ先給外層騰出空間。4.4 問題速查表把上面這些踩過的坑整理成一張表出問題的時候按癥狀對號入座比從頭讀代碼快。現(xiàn)象可能原因排查動作處理辦法程序卡住不動CX 初值為 0跑 65536 次在循環(huán)入口前看 CX入口加JCXZ或先判零循環(huán)次數(shù)比預(yù)期多CX 低字節(jié)被CL移位改掉單步到LOOP前看完整 CX換寄存器存移位次數(shù)循環(huán)提前結(jié)束循環(huán)體內(nèi)REP前綴消耗了 CX檢查循環(huán)體里的串操作PUSH CX/POP CX保護(hù)累加結(jié)果只算了一部分循環(huán)體內(nèi)子程序改了 CX檢查CALL前后 CX 值調(diào)用前壓棧返回后彈棧匯編報Jump out of range循環(huán)體超過 128 字節(jié)數(shù)一下標(biāo)號到LOOP的距離改DEC CXJNZ或JMP循環(huán)后條件判斷失效用了DEC收尾ZF 被覆蓋看循環(huán)末尾的指令改回LOOP或保存標(biāo)志嵌套循環(huán)內(nèi)層次數(shù)亂內(nèi)外層共用 CX 未保護(hù)看內(nèi)層入口有沒有PUSH CX壓棧或換寄存器數(shù)組求和結(jié)果偏差指針步長與元素寬度不匹配檢查ADD SI, n的 nDW用 2DB用 1這張表不是窮舉但覆蓋了我這些年實(shí)際遇到的八成場景。真正遇到表上沒寫的問題通用的排查順序是先看 CX 初值再看循環(huán)體里有沒有指令碰 CX最后看標(biāo)志位有沒有被意外覆蓋。這三步走完問題基本就浮出來了。5. 進(jìn)階塊復(fù)制、循環(huán)展開與 REP 前綴5.1 手寫塊復(fù)制循環(huán)數(shù)組求和是熱身塊復(fù)制才是循環(huán)真正的日常用途。需求簡單把源地址的一片數(shù)據(jù)搬到目標(biāo)地址。MOV CX, LENGTH ; 要搬的字節(jié)數(shù) LEA SI, SRC LEA DI, DST COPY: MOV AL, [SI] MOV [DI], AL INC SI INC DI LOOP COPY四條指令的循環(huán)體跑一次搬一個字節(jié)。這段代碼約十一個字節(jié)LOOP的位移量是 -9 左右在范圍內(nèi)能正常匯編。這里 SI 和 DI 的分工是約定俗成的SI 是源索引DI 是目標(biāo)索引很多串操作指令默認(rèn)就用這兩個寄存器?,F(xiàn)在手寫循環(huán)用它們后面換成REP MOVSB的時候也就是把整個循環(huán)體換成一條指令不用改寄存器約定。塊復(fù)制有個經(jīng)典陷阱源和目的區(qū)域重疊。如果目標(biāo)區(qū)域在源區(qū)域的低地址方向從前往后復(fù)制會把還沒讀的源數(shù)據(jù)覆蓋掉。這時候必須改成從高地址往低地址復(fù)制也就是指針先指向末尾每次減一。這個方向問題在內(nèi)存管理類的程序里出現(xiàn)頻率不低而且癥狀很怪——復(fù)制出來的數(shù)據(jù)有一部分是對的另一部分是錯的看著像隨機(jī)損壞。5.2 REP 前綴把 CX 交給硬件REP MOVSB這條指令把上面整個循環(huán)體壓縮成了一行而且速度更快原理就在 CX 身上。REP的本質(zhì)是一個硬件級的循環(huán)控制器。它做的事檢查 CX 是否為零為零就退出不為零就執(zhí)行一次后面的串操作指令CX 減一然后重新檢查。整個過程不需要 CPU 反復(fù)取指譯碼效率比軟件循環(huán)高出一截。CLD ; 方向標(biāo)志清零地址遞增 MOV CX, LENGTH LEA SI, SRC LEA DI, DST REP MOVSB四條有效指令替代了七條機(jī)器碼也短了。不過用REP有幾個前提條件必須滿足。第一方向標(biāo)志要明確。CLD是地址遞增STD是地址遞減。如果之前某個操作把 DF 設(shè)成了 1而你又沒清掉REP MOVSB就會從高地址往低地址搬結(jié)果和預(yù)期相反。我一般習(xí)慣在每條REP之前都寫一句CLD雖然多數(shù)時候是多余的但省得排查。第二SI 和 DI 的初值要落在正確的段里。MOVSB默認(rèn)用 DS:SI 做源、ES:DI 做目的ES 段寄存器必須提前設(shè)好否則會寫到一段莫名其妙的內(nèi)存里去。這一點(diǎn)跟手寫循環(huán)不一樣——手寫循環(huán)用MOV [DI], AL的時候DI 默認(rèn)也是走 DS除非顯式加段前綴。這個默認(rèn)段的前后差異是初學(xué)REP時最常撞的墻。第三CX 一定是次數(shù)。REP執(zhí)行完 CX 歸零做完之后想用原來的長度得提前備份。注意REP MOVSW一次搬一個字比MOVSB快一倍前提是長度是偶數(shù)、源和目標(biāo)地址都是字對齊的。長度是奇數(shù)的時候得單獨(dú)處理最后一個字節(jié)別圖省事。5.3 循環(huán)展開與效率取舍循環(huán)展開是老派優(yōu)化手段思路是把多次迭代的循環(huán)體并排寫出來減少循環(huán)控制指令的開銷。原來要執(zhí)行 N 次LOOP展開四次之后只執(zhí)行 N/4 次剩下的開銷就是四份循環(huán)體。MOV CX, LENGTH SHR CX, 1 ; 每次搬兩個字次數(shù)減半 LEA SI, SRC LEA DI, DST COPY: MOV AX, [SI] MOV [DI], AX ADD SI, 2 ADD DI, 2 LOOP COPY這個例子里循環(huán)體翻了一倍但控制指令的執(zhí)行次數(shù)減半。在老機(jī)器上循環(huán)控制指令的取指譯碼開銷占比不小這種改寫能有實(shí)實(shí)在在的速度提升。但現(xiàn)在要不要這么做得看具體場景?,F(xiàn)代處理器有分支預(yù)測和指令緩存LOOP這類短小的循環(huán)控制指令很可能被預(yù)測器提前處理掉展開帶來的收益未必明顯反過來代碼體積變大會擠占指令緩存在某些場景下反而更慢。所以我的原則是除非實(shí)測發(fā)現(xiàn)這個循環(huán)是熱點(diǎn)否則不主動展開??勺x性的損失是實(shí)打?qū)嵉氖找鎱s要打了問號。真要追求塊復(fù)制的極致性能現(xiàn)代的做法是用單指令多數(shù)據(jù)擴(kuò)展一次搬十六個甚至六十四個字節(jié)那已經(jīng)是另一套指令體系了跟 8086 的LOOP不在一個層面上。就 8086 這個平臺本身而言這幾個方案的性能排序大致是REP MOVSW快于手寫MOVSW循環(huán)手寫MOVSW循環(huán)快于MOVSB循環(huán)LOOP收尾略快于DEC / JNZ收尾。差距在具體數(shù)字上不大但在緊密的內(nèi)層循環(huán)里累積起來能看出來。我自己在寫這類程序的時候習(xí)慣是先用最直白的LOOP版本把邏輯跑通確認(rèn)結(jié)果正確再考慮要不要換REP或者展開。順序不能反——先優(yōu)化后正確等于給自己挖坑出了錯都不知道是邏輯問題還是優(yōu)化引入的問題。實(shí)際動手寫下來我對LOOP和 CX 這套機(jī)制的體會是它們的設(shè)計非常經(jīng)濟(jì)一條兩字節(jié)的指令承擔(dān)了循環(huán)控制、計數(shù)遞減、條件判斷三件事代價是把計數(shù)器和一大堆指令綁在了一起。這個設(shè)計在資源緊張的年代是聰明的取舍放到今天就變成了要小心繞開的耦合。所以我現(xiàn)在寫匯編只要循環(huán)體超過五行就先把 CX 的使用情況在紙上畫一遍標(biāo)出哪些指令會碰它、哪些子程序可能動它畫完再動手。這個習(xí)慣幫我省掉的調(diào)試時間比任何優(yōu)化技巧都多。真要說有什么值得反復(fù)強(qiáng)調(diào)的那就是初值為零這一條——JCXZ多寫一行能省掉一下午。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
二人电影免费版在线观看| 九九人人自拍| 成人在线综合| www.色五月天.com| mmm1717.6dbm人人爱人人操| 日韩在线视频中文字幕| 色97啪啪| 葵花AV在线| 99精彩视频| 99er6热在线观看精品6| 人妻久久久久久久久| 五月激情射| 国精产品一区一区三区免费视频 | 欧亚中文A V| 丁香成人五月天| 亚洲精色| 99精品综合视频| 梁铮版《蜘蛛女侠》在线| 艹天天射| Www99热| WWW.久久.COM| 内射爽无广熟女亚洲| 综合婷婷五月天| 色五月激情五月丁香五月婷婷啪啪综合| 色玖玖玖| 操操人人| 色婷婷五月天亚洲| 色激情综合狠狠婷婷| 大香蕉狼人久久| 色婷婷呢狠禁久禁| 97人人妻人人艹| 色丁香五月婷婷| 97人人射| 婷婷五月天激情网| 超碰成人公开| 天堂网亚洲色图| 久久五月婷6 9| 丁香六月婷婷色XXXXX| 五月婷婷激情综合av| 99爱免费在线视频| 久久亚洲激情五码| 五月天国产| 五月婷婷丁香网| 五月婷婷狠狠干| 欧美丁香六月激情视频| 毛片新网地| 九九99久久| 天天爽,夜夜爽| 久久99热精品a片在线观看| 深爱激情AV| 五月丁香婷婷综合在线| 天天情色五月天| 五月丁香婷婷AV天堂| 婷婷六月丁香久| 五月天另类综合网| 中文字幕婷婷五月天| 五月天婷综合网站| 伊人国产婷婷五月天| 综合亚洲五月天| 五月天伊人av| 五月天激情亚洲| 丁香六月色婷婷综合| 色综合综合综合| 色欲色香综合网| 五月天激情亚洲| 色欲久久久久| 五月婷婷中文字幕| 懂色av粉嫩av蜜臀av| 亚洲182在线观看| 90色免费视频| 九九热av| 婷婷中文字暮| 婷婷金品综合视频| 五月婷婷伊| 国产91在线视频| 日韩欧美一道四区中文字幕| 五月色导航| 激情综合六月| 久久这里都是精品| 丁香九色不卡aaa| 日本3级片一区2区| 婷婷五月丁香基| 色噜噜婷婷| 久久人妻久久| 免费观看18视频网站| 成人在线二区| 亚洲黄色影视| 色播五月| 婷婷五月丁香激情| 狠狠五月激情在线| 五月婷婷深深爱| 婷婷五月激情五月激情| 99伊人婷婷在线| 久久久激情视频| 免费精品66| 婷婷五月天色| 亚洲国产精品VA在线看黑人| 日韩ac不卡无码| 婷久看人爽| 丁香五月五月婷婷| 欧州婷婷五月天综合| 丁香五月另类色婷婷麻豆| 深爱开心激情网| 国产成人亚洲综合A∨婷婷| 国产 亚洲 在线| 婷婷丁香激情五月天色色色| 欧美成人A片AAA片在线播放 | 欧美婷婷| 91男同| 内射激情在线| 婷婷伊人綜合中文字幕| 狠狠色丁香久久| 26uuu亚洲色| 色私五月婷婷| 色www.con| 亚洲视频在线观看99| 99热网站| 九九热99精品| 丁香五月天天高清在线| 97luluse| 天天做天天爱综合| 久久久全国免费视频| 99久热| 五月天婷婷乱论小说| 婷婷在线操| 综激情网| 婷婷久久亚洲| 色综合久| 丁香六月色婷婷欧美| 这里有精品| 内射干少妇亚洲69XXX| 超碰免费99| 综合激情网激情五月。| 色五月激情图片| 色五月成人婷婷| 亚洲网视屏| www.五月婷| 五月婷婷中文网| 狠狠干五月天| 五月丁香色播| 婷婷五月天亚洲综合网| 狠狠综合网| 青青久久五月天丁香婷婷| 99热九九这里只有精品10| 黄网免费观看| 99热热九九| 久久丁香五月天| 亚洲网视屏| 五月丁香六月婷婷激情网| 任我肏视频精品| 天天舔天天摸天天透| 天天射影院| 色五月婷婷天天干| 99视频在线9| 疯狂做受XXXX高潮A片| 丁香色五月婷婷17C| 色婷婷久久综合| 97色片| aaa久久| www.五月丁香| 丁香五月狠狠在线观看| 久综合4| 五月丁香六月婷婷综合网缴情| 五月天天丁香婷婷| 久色| 婷婷爱综合| 99热这里是精品| 亭亭丁香久久五月| 91主播在线| 思思热视频在线| www.99热在线| 五月天综合视频| 五月丁香啪| 66久久视频在线| 久久久com| 成人日韩欧美| 五月伊人91| 99综合色| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 性小说五月天| 91亚洲天堂| 婷婷五月天激情小说| 色婷婷裸体色性在线| 伊人激情网| 激情六月综合| 精品五月丁香| 亚洲av成人电影在线观看| 久久天堂| 天天肏天天爽夜夜爽| 九色porny在线观看激情四射| 人妻久久久久久| 婷婷五月天综合激情| 中文幕无线码中文字蜜桃| 五月激情综合深爱| 激情综合啪啪啪| 丁香六月在线综合| 久久免片| 97热在线精品| 一级A片天天操夜夜操| 国产精品丝| 99热这里只有精品9| 五月婷婷综合精品| 丁香八月综合激情| 日韩ac不卡无码| 九九视频在线观看视频6| 成人在线不卡| A A色色| 日日爽夜夜爽| 婷婷久久六月费| 亚洲av网址| 97久久超碰| 亚洲色模骚货| 婷婷色五月久久| 精品久久9| 婷婷久月| 日本欧美成人片AAAA| 婷婷五月天成人网站| 婷婷久久免费| 日韩天堂久久| 97精品综合久久内射| 九九RE视频在线精品| 五月丁香香蕉| www激情五月天| 天天久久66xxx| 九月丁香欧美综合| 六月婷婷操逼| 九九99视频精品| 成年人最刺激的综合网| 久热婷婷在线视频| 国产婷婷久久| 五月丁香基地| 色八月婷婷| 天天综合久久| 97se视频在线| 激情综合网色五月| 伊人9在线| 天堂婷婷丁香六月网| 97色色婷婷| 操日视频| 亚洲在线操| www.五月天色色色| 激情六月丁香| 狠狠操综合| 99在线热视频| 久婷| 狠狠爱综合网| 狠狠操天天操| 色性日本| 婷婷激情小说| 婷婷五月综合久久中文字幕| 丁香啪啪| 青草视频在线观看视频| 91干婷婷| se99热久久一本| 月丁香久久久| 91久久综合亚洲噜噜成人在线| 亚洲五月天色色| 色婷婷综合在线| 超碰A V在线| 天天综合区| 亚洲欧洲美女在线观| 色综色网| 4399在线观看免费高清黄色视频| 丁香六月开心| 婷婷丁香激情| 国产精品国产| 色五月丁香五月| 婷婷丁香五另类网站| 男人的天堂999| 综合狠狠伊人| 亚洲色色色色| 五月天婷婷AV| 色五月婷婷基地| 五月婷在线| 大陆极品少妇内射AAAAAA| 国产美女无遮挡裸体毛片A片| 无码激情AAAAA片-区区| WWW.久久久久久久久久久久久| 国产午夜精品一区二区| 婷婷丁香五月天综合网| 亚洲精品永久久久久久| 91精品丝袜久久久久久| 丁香五月婷婷香| 日本九九九九九九| 99er免费在线观看| 停婷丁五月在线| 九九综合| 丁香五月桃花在线激情综合| 色婷婷电影| 五月激情网五月综合网| 色婷久九| 五月丁香综合色婷婷| 在线亚洲综合| 日韩免费乱轮网站| 天天干,天天日| 婷婷五月天丁香花| 99情色五月天| 欧美色骚婷婷五月天| 日日爽日日| 久久伊人大香蕉| 亚洲乱码日产精品BD| 丁香六月欧美| 五月丁香六月婷婷综合伊人| 丁香五月婷婷狠狠色| 人人干AV| 大香蕉综合网| 欧美日本国产欧美日本韩国99| 再次出发二| 五月婷婷真爱激情网| 天天日夜夜| 九九热99精品| 久久深爱激情网| 日韩欧美一级大黄网站| 久久99精品久久久久久青青AR| 噜噜狠狠| 色色丁香婷婷| 日韩国产在线免费观看| 人妻精品久久久久久| 色色丁香婷婷综合| 激情婷婷丁香色五月| 丁香婷婷六月婷婷六月婷婷六月婷婷| 91狠狠色色丁香婷婷综合久久| 久草热久草在线视频| 99操久久| 97色热| 国内精品免费一区二区2009| 色国产五月| 久久久www| 人妖色AV色综合| 狠狠狠狠狠狠草| 国产激情AV| 停停六月 综合| 情欲综合网| 综合久| 熟美女麻豆| 五月丁香人人婷婷在线观看| 成人综合网站| 久久小视频免费| 人人爱国产| 色九月欧美| 俺也去在线视频 | 生活片五区| 婷婷中文综合网| 婷婷五月天日逼| 国产成人网址| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 五月婷婷基地| 色久99| 久久婷婷五月天综合| 疯狂做受XXXX高潮A片动画| 色色激情五月天| 成年视频免费观看| 99九九玖玖| 六月激情网| 天天天天天天噜| 色婷婷伊人激情在线观看| 五月丁香 六月婷婷a| 在线观看中文字幕| 5月婷婷综合| 99热在这里只有精品| 国产熟女一区二区三区五月婷| 97色色网| 五月天激情黄色小说在线观看| 色五月丁香五月| 婷婷午夜精品久久久| 超碰超碰在线| 99在线观看免费精品视频| 色婷婷久久| 热久久思思热思思| 123日本不卡在线| 五月婷婷九月婷婷九月婷婷| 婷婷中文字幕在线| 天干夜夜操| 婷婷丁香社区网| 婷婷综合五月天| 久久er九九| 婷婷综合丁香| 99这里只有精品| 特黄三级片| 夜夜躁爽日日| 丁香六月无码| 久久网日本| 色婷婷综合网站| 开心五月婷婷激情网| 国产高潮白浆一区二区| 4399成人黄A片| 日日爽夜夜爽| 99热这里只有精品66| 超碰人人超碰| 人与禽A片啪啪| 久久人妻视步| 婷婷五月激情的图片| 色欲一区二区三区精品A片| 热99热9| 丁乡久久| 熟妇高潮一区av| 人人摸人人| 99热99在线| 狠狠精品干练久久久无码中文字幕| 五月婷婷六月丁香色| 色欲天天综合| 超级碰碰碰久久网站| 啪啪黄页网| 人妻内射麻豆视频| 伊人久久婷| 中字幕视频在线永久在线观看免费| 五月婷婷激情久久| 九九热只有这里是精品| 亚洲久久日| 亚洲亚洲人成综合网络| 91色五月| 色99网站| 天插天啪天啪天啪| 99爱爱| 日韩99无码| 婷婷五月天开心网| 99人妻碰碰碰久久久久视| 蜘蛛女免费观看完整版高清电影 | 老美AA片| 久久久这里有精品| 91色色色18| 99国产精品久久久久久久久久久| 激情综合无码| 99热免费| 久久婷婷六月综合| 五月丁香六月情婷婷久久| 色综合久久88色综合天天看| 97人人干。| 粉嫩AV久久一区二区三区| 超碰在线免费9| 中文字幕色色色| 久久在这里有精品| 婷婷色婷婷亚洲成人| 久久久久久18| 九九色黄色| 国产乱子轮XXX农村| 99操视频| 玖玖婷婷五月天| 蜜桃五月天| 午夜电影网VA内射| 丁香婷婷五月天亚洲| 97碰碰碰| 1024亚洲| 爱狠射| 蜜乳av一级av| 午夜不卡久久精品无码免费| 天天插天天干| 激情五月激情综合网| 综激情网| 97人人操人人爽| 成人综合AV| 婷婷六月综合激情| 色婷久| 丁香五月婷婷亚洲激情四射| 中文字幕操比影片| 黄色AAAA韩国guochansanji| 日韩婷久| 精品人妻在线| 婷婷情色五月天| 加勒比日本一区二区三区| 伊人影院久久网| 久久丁香婷婷色情综合| 色99视| 青青艹b| 97sese婷婷| 黄色成人AV在线| 精品9l九九九九九77777| 91要啪| 久去色色| 激情五月图| eeuss人妻| 视频综合网| 九九这里只有精品在线视频| 开心五月激情| 丁香五月天啪啪激情综和网| 五月婷婷啪啪| 少妇激情五月天| 天天干狠狠| 婷婷在线视频| 久久婷婷青青| 色播五月天婷婷老师| 久久九九国产| 国产日批视频免费播放| 狠狠干伊人| 久久久久久五月天| 午夜爱爱网站| 99热这里是精品| 欧美成人AAA片一区国产精品| 大香伊人久色| 婷婷五月天综合久久| 996热| 99热精品在线观看| 另类五月激情| 大香蕉久热| 五月婷婷激情刺激| 婷婷五月天电影在线| www.狠狠| 激情五月婷婷| 久99热在线观看| 久久色五月天| 噜噜色噜噜网| 色五月综合| 91a片爽| 丁香五月综合婷婷| 久久色五月天综合网| 99riAV国产精品视频| 超碰AV在线| 精品色| 99A片| 亚洲操操| 婷婷丁香五月天影院 | 日日肏夜夜干| 91久久久久久| 久久久日韩特色特黄AAAA| 99综合一区| 五月婷婷m| 26uuu丁香婷婷五月| 五月天啪啪| 99热九九在线| SS丁香五月婷婷| 黄网在线播放| 久久五月情| 五月丁香六月婷婷综合免| 婷婷丁香五月天激情| 99热国产免费| 天天肏高清在线| 亚洲婷婷月丁香五月| 色五月亚洲| 少妇人妻偷人精品无码视频新浪| 久久香蕉福利| A久久| 国产性爱在线| 天天五月香欧美| 5月婷婷6月六月丁香| 偷偷与邻居做爰完整视频| 99热九九在线| 久久激情网| 欧美人与性动交CCOO| 亚洲色激情| 综合五月激情网| 伊人色综合网| 99ri国产| 99久久99九九九99九他书对| 丁香婷婷超碰| 五月婷婷亚洲色视频| 91黄色五月天视频| 亚洲精品五月| 亚洲精品又粗又大又爽A片 | 美妞av| 精品久久99| 国产婷婷久久| 久热这里只有| 亚洲一区二区无遮挡A片| 开心五月深爱激情| 久久99人人| 五月婷婷色丁香| 五月综合色| 丁香五月天欧美成人| 五月婷婷久久综合| 色婷婷狠狠爱| 120分钟婬片免费看| 精品久久99码| 久久婷婷五月| 色婷婷五月丁香在线观看| 亚洲五月花| 狠狠干婷婷| 色99网| www.色99| 婷婷精品| 1995年关宝慧版蜘蛛女| 九月丁香网婷婷| 99热精品9| 男人的天堂婷婷色五月| 婷婷丁香五月亚洲综合网在线视频观看| 乱乱av| 五月天夜夜爱夜夜操| 2050人人操免费工开爱| 五月婷婷丁香网| 激情五月婷婷啪啪| 99激情在线| 五月天激情四射| 天天爽人人综合免费7799| 狠狠色婷婷7| 四LLL少妇BBBB槡BBBB| 最新五月天婷婷影| www色婷婷com| 色色激情| 色五月丁香婷婷综合| 婷婷在线五月综合| 色婷婷在线视频| 97香蕉久久超级碰碰高清版| 色色色综合网| 五月激情婷婷女| 久热久操久热久草国产91| 色婷婷综合久久久久| 99re思思热在线视频| 久久精品国产一区二区三区四区| 国语精品探花| 婷婷的99视频网站| 国产乱人偷精品人妻A片| 天天干com| 超碰色色综合| 婷婷久久六月费| 激情性爱婷婷| 一起草av| 天天舔天天操| 激情五月图| 97人人操com| 激情视频网址| 永久AⅤ1| 思思久久99热| 婷婷五月丁香综合桃花色网| 五月天婷婷色综合| 涩五月色婷婷| 99色最新在线视频| 婷婷九月在线| 先锋影音av色五月天资源站| 色99网| 日本噜噜色网| 丁香六月婷婷久久综合| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 婷婷综合天堂| 五月天婷婷影院| 天天激情| 成人狠狠成人狠狠成人狠狠成人狠狠 | 五月婷婷亞洲中文| 开心久久xxx色| 亚洲色五月婷婷| 99这里都是精品| 人人爽天天爽| 色丁香婷婷美女视频网站| 亭亭色网| 综合激情sV| 桃色成人网| 大香蕉久操| 91成人性爱视频| 狠狠色综合五月人人| 五月丁香婷婷婷激情爱爱| 五月天久久婷婷婷| 婷婷八月激情| 色久女| wuyuedingxiang| 久久精品一区二区三区四区| 99免费热视频在线| 五月天丁香久久| 999热在线视频| 手机激情网| 婷婷五月天成人在线视频| 激情四射婷婷色色色| 色婷婷五月天| 99九九在线观看免费| 亚洲中文字幕AV| 欧美啪啪五月天| 天天爱天天天射AV| 中文字幕免费高清电视剧| 久久丁香五月天| 超碰不卡在线| 日本色视| 5五月综合网亚洲| 激情综合色五月丁香六月亚洲| 激情五月第四色| www久久99| 91热99| 国产脫衣舞一区二区三区| 亚洲热久| 91色在线| 夜夜 操无码| 久久丝袜婷婷| 婷婷四色五月| 亚洲永久免费| 色五月人妻| 色五月大香蕉| 六月婷婷综合| 五月激情天| 欧洲第一无人区观看| 中文字幕在线观看视频www| 丁香六月激情综合| 丁香六月婷婷久久综合| 人妻体体内射精一区二区| 熟妇人妻中文字幕无码老熟妇| 婷婷激情四射| 国产成人综合亚洲| 亚洲电影中文字幕| 久久九精品| 天堂色婷婷| 亚洲啪视频| 狠狠狠婷婷五月综合| 天天草天天舔| 五月天色婷婷基地| 丁香五月天论坛| 久热69| 色五月综合在线| 欧美在线视频99| 99热国产在线| 丁香五月大香蕉AV| 综合色图区| 日本色狠狠| 狠狠干综合网| 久久九九玖玖| 激情五月深爱五月| 另类国产综合| 五月天婷婷基地| 五月丁香啪啪啪综合网| 六月婷婷综合| 色综合女人99| 成人 在线 日韩| 91精品熟女| 人妻精品久久久久久| 色综合99| 日韩成人网址| 伊人激情网| 99啪啪视频| 97色五月天| xx人人xx| 丁香五月婷婷基地| 98热精品| 侠女刀之记忆电影在线看免费| 五月婷婷婷婷婷婷艺术| 狠狠爱五月婷婷| 婷婷五月天激情网| A1片久久| 日 日干 日日做| 天天干,夜夜爽| www.zbzhongsen.com| 五月婷婷婷自由综合| 婷婷欧美| 色五月情| 亚洲综合婷婷| 人人草人| 欧美性生交XXXXX无码小说| 97色视频网| 狠狠88综合久久久久噜噜噜| 亚洲六月婷婷| 一级片操逼视频| 欧美熟女99| 五月丁香六月婷婷综合网缴情| 久久综合丁香激情五月| 99精品网址| 亚洲综合色网站| 9久久久久久久久久久| 五月激香蕉网| 五月伊人综合| 成人网址在线观看| 91日精品| 婷婷中文字暮| 免费观看欧美成人AA片爱我多深| 成人一级片| 五月天激情AV| 天天日天天久久青青| 99久久婷婷| 精品久热69| 亚洲视频图片婷婷五月| 久久国产一区二区三区| 伊人干综合| 五月丁香五月婷婷| 97婷婷五月丁香| 激情小说五月天中文字幕| 五月色婷| 97干欧美| 五月丁香成人| 六月丁香停| 激情五月色在线播放| 日韩AV免费电影在线播放| 五月丁香网av| 99九九精品| 久久xx| 玖玖爱综合网| 日本色天堂| 26uuu亚洲| 九九色情网五月天| 精品人妻久久久久| 99精品视频播放| 天天色,天天操,天天射| 极品人妻VIDEOSSS人妻| 欧美毛片www| 国产美女无遮挡裸体毛片A片| 九九国产视频| 九九这里只有精品| 青青夜夜狠狠夜夜狠狠| 成人片在线播放| 色九九综合| 日日夜夜狠狠| 激情综合五月激情XXXX| 九九色影院| 99热精品在线| 欧洲亚洲免费视频9| 亚洲中文字幕在线观看| 狠狠色情婷婷| 综合天堂AV久久久久久久| 五月丁香久久激情网| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 综合一啪| 丁香久月| 91一起操| 亚洲情综合五月天| 热99只有里视频| 9999综合99综合人| 欧美久久网| 大香蕉婷婷丁香视频在线| 色五月婷婷亚洲| 激情综合女人网五月播播| 丰满老熟妇BBBBB搡BBB | 久碰综合| 日韩中文欧美| 婷婷五月天va| 五月婷护士| 荷兰av一级| 91超碰在线观看| 99国产精品久久久久久久久久久 | 亚洲黄色影视| 99色在线观看视频| 97欧美在线| 色色色色色色网站| 99热只有精品在线观看| 婷婷丁香五月天大香蕉| 五月丁香色色网| va婷婷在线免费观看| 丁香九月综合在线| 五月婷综合| 婷婷丁香五月六月激情| 五月婷婷六月丁香首页| 久久九九免费视频| 激情五月色在线播放| 影音先锋色婷婷| 蜜桃人妻无码AV天堂三区 | 久久婷婷五月天大香蕉| 操九色| 色播五月丁香婷婷| 99久久五月丁香野外| 另类小说色婷婷| 亚洲色色香蕉| 激情网站五月| 亚洲成片在线观看| 五月丁香综合网| 噜噜噜噜综合在线| 99成人网站| 狠狠色丁香久久| 亚洲精品久久久久久久久久飞鱼| 99热99精品| 天天爽夜夜爽夜爽精品| 五月婷婷黄色| 五月天,激情四射,婷婷频道| 噜噜噜狠狠色综合| 欧美碰碰碰| 欧美在线| 另类图片天天影视在线观看| 亚洲激情综合免费| 婷婷六月综合在线| 久久免费操| 亚洲综合视频八| 99亚洲天堂| 99九九玖玖| 99免费热视频| 97丁香五月天| 丁香五月性| 久久九⑨| 99久久婷婷国产综合精品电影| 久久538| 国产精品爽爽久久久久久| 超碰狠狠色| 亚洲网站在线鸭子av| 婷婷丁香亚洲色综合91| 婷婷五月开心六月AV| 免费看欧美成人A片无码 | 亚洲成人AV电影在线| 天天骑天天操| 丁香五月婷婷激情尤物| 天天日,天天插| 日本噜噜色网| 婷婷五月综合欧美在线播放| 婷婷五月天激情四射| 啪色综合| 五月天婷综合| WWW.久久99| 亚洲欧洲美女在线观| 亚洲视频一区| 亚洲乱码精品久久久久..| 亚洲综合色色色| 色色五月天婷婷丁香| 激情五月天com| 午夜丁香五月天综合| 五月婷婷之激情五月| renre人人操国产超碰在线 | 99ri在线视频| 99色婷婷| 色偷偷综合| 久久五月丁香| 五月婷婷中文字幕| 综合激情五月丁香| 97人人干| 色五月综合| 婷婷色五月激情| 亚洲亚洲人成综合网络| 91精品综合久久久久久五月丁香| 五月激情影院| 九九色色| 婷婷无五月无码视频| chaopengdaxiangjiao| 久久久久久久久久久久久9| 女人被躁到高潮嗷嗷叫小| 成人国产欧美大片一区| 黑人巨粗进入警花疼哭A片| 日韩艹比| 操婷婷久久| 色婷婷色综合激情91| 成人五月天丁香婷| 亚洲色婷婷| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 久久五月婷综合网| 欧美激情久| 国产.亚洲.欧洲视频在线| av在线观看网站| 女性自慰系列第五页| 欧美在线骚货| 丁香五月天啪啪激情综和网| 免费不卡狠操美女视频网 | 丁香婷婷婷五月综合色情| 超碰在线9| 五月欧美色播| 激情婷婷狠狠干| 99久久6| 97碰碰视频在线观看免费| 六月激情综合| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 狠狠干天天日| 日本人妻A片成人免费看片| 97人人干| av五月天婷婷丁香| 91九色 婷婷| 婷婷97狠狠干| 婷婷六月激情在线视频| www.99日本| 五月天婷婷色色| 色婷婷激情视频| 五月婷婷影| 99er6| 五月天婷婷在线AN| 亚洲免费看片| 五月天婷婷狂暴白浆| 97色啪| 五月婷成人网| 日婷婷久久开心| 婷婷久久五月天| 国产毛片操B| 久操无码| 可以直接看的AV网站| 丁香五月综合婷婷| 日本4399天堂中出| 五月丁香花激情综合网| 99这里只有精品在线| 激情 婷婷| 日本一級黃色一級片| 婷婷精品综合| 99爱免费视频在线观看| 一区二区免费看| 91人久| 4399在线日本A片| 久色五月| 天天干天天做| 国产精品国产| 怡红院精品视频久久久久久久久| 婷婷九月丁香| 99久久色| 26UUU亚洲欧美| 婷婷五月天久久| 色播色丁香五月| 五月香蕉婷婷| 99综合在线| 亚洲视频另类| 天天艹夜夜爽| 五月天婷婷视频| A1片久久| 天天天天色天天天天天干| 开心五月婷婷| 综合久久五月天| 欧美日韩AAA| 五月丁香久久| 久久视网36| 婷婷五月色情| ww超碰在线| 麻豆123区| 色婷婷激情| 久久作爱| A1片久久久| 无码一区二区三区四区五区91c| 婷婷五月天激情偷拍| 亚洲激情综合| 色狠狠综合网| 五月天天久久香| 久久综合香蕉国产国产蜜臀AV| 情情五月天色| 色婷婷成人做爰A片免费看网站| 狼人久草| 久久久久久久久久8888| 夜夜躁婷婷AV| 欧美激情综合色综合啪啪五月| 五月丁香狠狠爱婷婷综合| 天天成人综合视频| 嫩草AV久久伊人妇女超级A| 天天综合亚洲综合网天天αⅴ| 欧美日韩999| 久久婷丁香五月| 欧美激情VA永久在线播放| 六月婷婷AV| 五月亭亭性| www.91AV.COM| 天天日夜夜曹| 美欧成人视频| 99re热在线视频观看| 国产精品国产| 色婷婷88| 色婷婷婷婷| 亚洲激情网| 亚洲激情综合| 人人操av| 五月的丁香六月的婷婷| 亚洲AV影片在线观看| 伊人婷婷五月| 成人AV播放| 五月婷婷六月丁香色| 97爱综合| 99爽视频| 天天干,天天舔| 成人日韩欧美| 另类激情五月| 中文字幕成人版| 丁香桃色网| 99精品在线观看视频| 99视频精品| 日日夜夜狠狠婷婷色| 精品人妻伦九区久久AAA片| 天天爽人人爽| 97操碰日本女人| eeuss人妻| 五月丁香婷婷网在线在线| 婷婷五月天丁香社区| 五月丁香婷婷色色| 丁香五月天激情婷婷丁香六月| 年轻的妺妺伦理HD中文| 青青福利网| 久久大香蕉伊人| 99九色视频在线观看| 九九热九九| 99色免费观看全部| 99亚洲视频| 成人五月天婷婷| www五月婷婷88导航| 激情五月天激情五月天| 欧美在线干| 免费观看全黄做爰的视频| 婷婷噜噜| 日韩成人综合网| 精品一二三区久久AAA片| 99思思| 伊人干综合| 国产精品色情AAAAA片软件| 天天色亚洲| 日日爱678| 青吴乐视频| 97九色| 性色99| 免费看欧美成人A片无码| 九九无码视屏| 日本久久高清| 久久人妻少妇嫩草AV| 五月婷婷在线视频| 色五月婷婷天天干| 韩国97天堂| 丁香六月激情综合| 五月婷婷天| 可以免费观看的av网址| 91re色综合视频| 亚洲色综合| 久久思思精品| 久热这里只有精品3| 五月婷婷久久爱| 久操婷婷| 色婷婷丁香五月| 久久综合伊人综合在线| 丁香五月欧美色综合| 色婷婷性爱网| 色五月在线播放| 国产玖玖资源| 亚洲五月婷婷在线| 国产婷婷综合在线免费视频| 四川女人毛多水多A片| 久操大香蕉| 99热在线只有精品| 先锋男人99资源| 婷香五月| 色月丁| 婷婷五月综合国产精品| 99re思思热久久| 天天综合精品| 亚洲丁香五月| 五月色婷婷亚洲| 九九99九九99九九99视频网| www91色网站| 欧美美女视频| 五月婷婷影| 久久婷婷内射| 天天爱天天做天天操| 九九久久综合网站| 久热这里只有精品在线观看| 日本色图综合| 久久大香免费| 色9999综合久久| 色色欧美色色色| 另类在线| 亚洲AV成人在线| 一起草Av| 五月婷婷激情日本| 丁香五月成人社区| 五月丁香狠狠| 另类小说五月天激情| 丁香 婷婷 激情 综合 五月| 热久久91| 涩综合网| 色热久| 久久五月网| 久99热在线观看| 久久宗合影| 99人妻碰碰碰久久久久| 婷婷五月超碰| 亚洲AV日韩AV永久无码网站| 五月综合激情啪啪啪啪啪| 无码少妇高潮喷水A片免费| 色婷婷99| 久久精品国产一区二区三区四区| 五月天国产| 五月丁香亭亭| 99免费在线视频| 五月丁香激情综合| 99色综合| 黑人巨粗进入警花疼哭A片| 国产精品a无线| 色五月激情五月| 国产肥白大熟妇BBBB视频| 国产黄大片在线观看画质优化| 激情又色又爽又黄的A片| 极品人妻VIDEOSSS人妻| 中文字幕丰满孑伦无码专区| AA片在线观看视频在线播放| AV片一区在线观看| AV亚洲在线| 婷婷伊人綜合| 婷婷网影院| 天天射美女| 亚洲va欧美| 六月婷婷狠狠色在线观看| 9久热这里只有精品视频| 视色综合| 天天做天天爽| 综合久久影院| 久久久久人妻| 色五月亚洲| www久久久久久| 色欲九区| 欧美色骚婷婷五月天| 99成人免费视频| 丁香五月天资源网| 色婷五月天| 99这里有精品视频| 大香焦啪啪啪| 激情婷婷九月| 久99热| 夜夜操狠狠操天天操| 亚洲操B| 五月丁香婷婷综合网| 色色欧美色色| 99九九热视频免费| 看婷婷五月天网| 婷婷丁香激情五月天色色| 九九无码| 97婷婷色| 丁香五月天堂亚洲社区| 色婷婷六月天| 五月丁香av在线| 深爱综合网| 成人精品在线| www.久久久久久久久久.com| 五月天色色色| 91九色中文| 97干在线视频| 日本三级99人妇网站| 一区色色色色网| 天天肏天天肏天天肏| 色六月婷婷| 少妇久久诱惑视频| 色婷婷亚洲婷婷在线观看| 亚洲操B| 欧美情色电影一区二区| 丁香五月手机在线| 操日本人妻视频| 五月精品| 99热 精品在线| 99九九玖玖| 色丁香久综合在线久综合在线观看| 亚洲精品色| 风流少妇A片一区二区蜜桃| 91综合在线视频| 久久五月丁香综合17C| 色综合中文| a性生活久久无| 午夜大香蕉| 成人色五婷婷| 亚洲乱码日产精品BD| 夜夜爱伊人| 亚洲激情综合免费| 激情丁香婷婷| 亚洲超级碰| 久热这里只有精品66| 五月婷婷av| 久久一操| 天天日,夜夜爽| 色噜噜婷婷| 97人操| 丁香五月六月婷婷综合激情| 激情五月天婷婷丁香| 啪色综合| 五月开心深爱激情网| 国产亚洲成AV人片在线观黄桃| 九九九热精品| 九九这里有精品| 五月婷婷黄色网址| 五月丁香久久综合| AV操逼网| www.精品久9| 婷婷五月丁香伊人| 国产SUV精品一区二区883| 9久热| 激情久久久久久久久久久| 伊人超碰在线| 五月丁香六月花| 少妇人妻偷人精品无码视频新浪| 另类专区在线观看| 婷婷刺激综合| 狠狠久久婷| a久久免费视频| 偷拍丁香九月激情| 99人这里只有精品| 五月天色区| 大香蕉啪啪啪| 久久久性爱视频| 九九精品热播| 亚洲丁香五月天视频| 精品九九久久| 丁香五月婷婷手机| 激情五月天天| 狠狠色噜噜狠狠狠888了| 国产偷人爽久久久久久老妇APP| 中文网AV| 丁香成人五月天| xxxx五月激情| 六月丁丁香| 激情小说五月丁香在线视频观看视频| 亭亭五月色男人| 99色在线视频| 九九精品热| 狠狠色噜噜狠狠色噜噜噜999| 99热精品在这里| 这里只有精品视频视频在线观看| 天天干夜夜谢| 琪琪秋霞| 色噜噜狠狠色综无码久久合欧美| 日日操日日射|