国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

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

8086匯編計(jì)數(shù)循環(huán):LOOP指令與CX寄存器調(diào)試指南 匯編這門語言有個(gè)挺有意思的地方越是基礎(chǔ)的指令越容易在實(shí)際調(diào)試時(shí)把人卡住。循環(huán)和CX 寄存器就是典型例子??唇坛涛宸昼娋湍鼙诚翷OOP指令的語義但真正上手寫程序第一次跑出來的結(jié)果十有八九是錯(cuò)的——要么死循環(huán)要么循環(huán)次數(shù)差一要么程序跑得好好的突然跳飛了。這篇內(nèi)容圍繞 8086 實(shí)模式下的計(jì)數(shù)循環(huán)展開把LOOP系列指令、CX 計(jì)數(shù)器的隱含用途、位移量的計(jì)算方式、嵌套循環(huán)的保護(hù)方案、DEBUG 單步驗(yàn)證的方法以及塊復(fù)制和循環(huán)展開的效率取舍一路講透。剛接觸匯編、正在做課程設(shè)計(jì)或者想搞明白為什么我的循環(huán)多跑了一次的讀者可以直接照著復(fù)現(xiàn)已經(jīng)能寫完整程序、但對指令編碼和標(biāo)志位影響沒細(xì)究過的同行也能從中找到一些平時(shí)容易忽略的細(xì)節(jié)。文中所有代碼都在 8086 指令集范圍內(nèi)用 MASM/TASM 風(fēng)格書寫配 DOSBox 或?qū)嶓w機(jī)都能跑。1. 先弄清楚 CX 在循環(huán)里到底扮演什么角色1.1 從一條 LOOP 指令說起LOOP這條指令短得離譜機(jī)器碼只有兩個(gè)字節(jié)格式是E2 cb其中cb是一個(gè) 8 位有符號位移量。可它內(nèi)部干的事并不簡單CPU 執(zhí)行到LOOP時(shí)會一口氣做完三步先把 CX 的內(nèi)容減一結(jié)果寫回 CX然后判斷 CX 是不是等于零如果不等于零就把 IP 加上那個(gè) 8 位位移量跳到目標(biāo)地址繼續(xù)執(zhí)行如果等于零就什么都不做順序執(zhí)行下一條指令。請注意順序是先減、后判這個(gè)順序決定了 CX 初值和實(shí)際循環(huán)次數(shù)之間的對應(yīng)關(guān)系。CX 裝 5循環(huán)體就執(zhí)行 5 次最后一次執(zhí)行完之后 CX 減到 0LOOP不再跳轉(zhuǎn)循環(huán)結(jié)束。這個(gè)關(guān)系看起來很直觀但正因?yàn)樘庇^很多人寫代碼的時(shí)候默認(rèn)我傳進(jìn)來 0 就是一次都不循環(huán)結(jié)果程序在主頻只有幾兆赫茲的老機(jī)器上空轉(zhuǎn)六萬多次才停下來——這個(gè)問題后面會專門用一節(jié)講。把LOOP拆開它其實(shí)等價(jià)于這么兩條指令的組合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。這個(gè)差異在循環(huán)體依賴標(biāo)志位的場合是致命的后面 2.3 節(jié)會展開。1.2 CX 的四個(gè)兼職身份CX 在 8086 里被定名成計(jì)數(shù)寄存器這個(gè)名字不是隨便起的。除了LOOP系列指令默認(rèn)拿它當(dāng)循環(huán)計(jì)數(shù)器它至少還有三份兼職寫循環(huán)的時(shí)候很容易撞車。第一份兼職是移位次數(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é)就被動了如果不小心把計(jì)數(shù)器也放在 CX 上循環(huán)次數(shù)立刻失控。第二份兼職是串操作重復(fù)次數(shù)。REP、REPE、REPNE這些前綴指令本質(zhì)上就是以 CX 為次數(shù)、每執(zhí)行一次串操作自動減一的硬件循環(huán)。REP MOVSB干的事情和手寫一個(gè)LOOP加MOVSB一模一樣只是更快。第三份兼職是除法除數(shù)。DIV CX、IDIV CX會把 CX 當(dāng)除數(shù)用這在循環(huán)體里做整數(shù)運(yùn)算時(shí)也得留個(gè)心眼。一份兼職撞上另一份循環(huán)就亂了。我見過最典型的翻車現(xiàn)場是循環(huán)體里調(diào)了個(gè)子程序子程序內(nèi)部為了字符串拷貝把 CX 設(shè)成了字符串長度返回之后外層的循環(huán)計(jì)數(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 來計(jì)數(shù)既然 CX 這么容易被別的指令搶走為什么不用 DX 或者 BX 當(dāng)計(jì)數(shù)器原因有三個(gè)都很實(shí)際。第一個(gè)是指令長度。LOOP是專門為 CX 設(shè)計(jì)的別的寄存器沒有對應(yīng)的單指令循環(huán)。你要是用 DX只能寫成DEC DX加JNZ 標(biāo)號三條字節(jié)起步循環(huán)體稍微長一點(diǎn)的程序字節(jié)數(shù)累積起來就是可觀的差異。在當(dāng)年內(nèi)存按 KB 計(jì)算的年代這個(gè)差異值得計(jì)較。第二個(gè)是可讀性約定。匯編代碼是給人看的不是只給機(jī)器看的。整個(gè) 8086 生態(tài)里CX 當(dāng)計(jì)數(shù)器、SI 當(dāng)源指針、DI 當(dāng)目標(biāo)指針、AX 當(dāng)累加器、BX 當(dāng)基址這是一套約定俗成的分工。你按這個(gè)分工寫別人接手一眼就知道每行在干嘛你偏要用 BX 計(jì)數(shù)看代碼的人每次都得回頭確認(rèn)一遍寄存器含義。第三個(gè)是和 REP 前綴的配合。如果你的循環(huán)體內(nèi)核其實(shí)是串操作直接用REP前綴比手寫LOOP快得多而REP只認(rèn) CX。用別的寄存器計(jì)數(shù)就沒法享受這個(gè)加速。當(dāng)然這不是死規(guī)矩。循環(huán)嵌套的時(shí)候 CX 只有一個(gè)內(nèi)層循環(huán)我通常就用 DI 或 BX 配合DEC、JNZ來寫省掉壓棧開銷。這個(gè)取舍后面 3.4 節(jié)會講。2. LOOP 家族的指令細(xì)節(jié)與位移計(jì)算2.1 LOOP / LOOPE / LOOPNE / JCXZ 的差別LOOP不是孤零零一條指令它有一個(gè)家族四條指令各有各的適用場景。把它們的判斷條件列清楚比背定義管用。指令機(jī)器碼執(zhí)行動作轉(zhuǎn)移條件典型用途LOOPE2 cbCX 減一CX ≠ 0固定次數(shù)的計(jì)數(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這兩個(gè)帶條件判斷的版本很適合寫在數(shù)組里找某個(gè)值這類邏輯。比如在一串字節(jié)里找第一個(gè)等于 0 的元素每輪比較完用CMP設(shè)置 ZF然后LOOPNE繼續(xù)找找到的時(shí)候 ZF 1循環(huán)因?yàn)闂l件不滿足而退出此時(shí) CX 的值還能反推出元素的位置。這里有個(gè)容易被忽略的點(diǎn)LOOPE因?yàn)橐瑫r(shí)看 ZF它的退出條件是或的關(guān)系——要么 CX 走到 0要么 ZF 不滿足任意一個(gè)成立就退出。這意味著循環(huán)結(jié)束后你必須再判斷一次到底是哪種情況退出的否則分不清找到了還是找完了沒找到。老手通常會在循環(huán)之后跟一條條件跳轉(zhuǎn)把兩種結(jié)局分開處理。JCXZ則是另一個(gè)角色。它不修改 CX也不影響標(biāo)志位只是單純地看 CX 是不是零。因?yàn)樗贿f減 CX所以不能當(dāng)循環(huán)用只能放在循環(huán)前面防止次數(shù)為 0 卻還進(jìn)循環(huán)體的意外。2.2 位移量是怎么算出來的LOOP的位移字段只有一個(gè)字節(jié)是有符號數(shù)取值范圍 -128 到 127。這個(gè)數(shù)字不是標(biāo)號的絕對地址而是相對下一條指令的偏移。CPU 執(zhí)行LOOP時(shí)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占兩個(gè)字節(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。這套計(jì)算沒什么技巧但必須會因?yàn)檎{(diào)試的時(shí)候沒有源代碼只有機(jī)器碼你得能從字節(jié)反推出跳轉(zhuǎn)目標(biāo)才能判斷跳飛了是跳到哪兒去了。至于 ±128 字節(jié)的限制這是 8 位位移字段的硬邊界跟標(biāo)號寫在哪沒關(guān)系。循環(huán)體寫長了LOOP就夠不著。這個(gè)坑后面 4.3 節(jié)有專門的改寫方案。注意不同匯編器對LOOP短跳轉(zhuǎn)越界的報(bào)錯(cuò)措辭不一樣MASM 一般提示Jump out of rangeNASM 會說short jump out of range??吹竭@類報(bào)錯(cuò)先量一下循環(huán)體長度基本就定位了。2.3 LOOP 不碰標(biāo)志位這件事有多重要前面提過LOOP和DEC CX加JNZ的等價(jià)性但有一處不等價(jià)標(biāo)志位。LOOP做的事情只有兩件CX 減一、判斷是否為零全程不動標(biāo)志寄存器。DEC CX則會更新 ZF、SF、PF、AF、OF。為什么不改標(biāo)志這么重要舉一個(gè)具體場景。循環(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 計(jì)數(shù)且循環(huán)體內(nèi)有依賴標(biāo)志位的比較運(yùn)算一律優(yōu)先用LOOP收尾。只有在循環(huán)體超長導(dǎo)致LOOP夠不著或者需要換寄存器計(jì)數(shù)的時(shí)候才退而求其次用DEC加JNZ并且在循環(huán)出口處重新做一次判斷不要指望標(biāo)志位能活下來。3. 完整實(shí)操從求和程序到 DEBUG 單步驗(yàn)證3.1 環(huán)境與源程序骨架這一節(jié)用一個(gè)數(shù)組求和的完整程序把前面講的點(diǎn)串起來。程序在 DOS 實(shí)模式下跑需要一個(gè) 8086 匯編器和 DOSBox 之類的兼容環(huán)境。我平時(shí)用的是 MASM 5.0 配合 DOSBox源文件后綴.asm編譯鏈接之后生成.exe用 DEBUG 加載調(diào)試。程序需求很樸素內(nèi)存里放六個(gè) 16 位整數(shù)用循環(huán)把它們加起來結(jié)果存到內(nèi)存變量里。選這個(gè)例子是因?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 ; 計(jì)數(shù)器初值 元素個(gè)數(shù) LEA SI, ARRAY ; SI 指向數(shù)組首地址 XOR AX, AX ; 累加器清零同時(shí)清掉 CF NEXT: ADD AX, [SI] ; 累加當(dāng)前元素 ADD SI, 2 ; 指向下一個(gè)字 LOOP NEXT ; CX 減一非零繼續(xù) MOV TOTAL, AX ; 結(jié)果落地 MOV AH, 4CH INT 21H ; 返回 DOS CODE ENDS END START程序骨架里有幾個(gè)細(xì)節(jié)值得掰開說。MOV AX, DATA / MOV DS, AX這兩行不能省也不能寫成MOV DS, DATA——8086 不允許直接把段地址立即數(shù)送進(jìn)段寄存器必須借道通用寄存器。這是實(shí)模式匯編的入門級坑第一節(jié)課基本都會踩一次。XOR AX, AX比MOV AX, 0短一個(gè)字節(jié)而且是公認(rèn)的清零慣用法。這里還順帶把 CF 清了為后面可能的進(jìn)位運(yùn)算留下干凈狀態(tài)。ADD SI, 2這一行在純 8086 上會被匯編成81 C6 02 00四個(gè)字節(jié)。因?yàn)?8086 的加法立即數(shù)指令只有 16 位立即數(shù)的編碼形式80286 之后才引入了 8 位立即數(shù)的緊湊格式。如果你想讓代碼更短可以寫成兩條INC SI各占一字節(jié)省兩個(gè)字節(jié)但執(zhí)行時(shí)間反而更長——兩條指令的取指和譯碼開銷抵不過一次四字節(jié)指令。這個(gè)取舍在現(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)兩個(gè)字LOOP把 CX 減到 5非零跳回NEXT。第二輪加 34AX 變成 46CX 減到 4繼續(xù)。依此類推第六輪加 11AX 得到最終的和 281然后 CX 減到 0LOOP不跳轉(zhuǎn)落到MOV TOTAL, AX。六個(gè)數(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。這個(gè)數(shù)字在 DEBUG 里可以用D DS:0直接看數(shù)據(jù)段驗(yàn)證。數(shù)組占 12 個(gè)字節(jié)TOTAL緊跟在后面偏移是 000CH值是19 01小端序低字節(jié)在前??吹竭@個(gè)序列程序就對了。有個(gè)地方容易出問題ADD SI, 2的步長必須和數(shù)據(jù)類型匹配。數(shù)組是DW定義的每個(gè)元素兩個(gè)字節(jié)所以步長是 2。如果定義成DB步長就得改成 1如果寫錯(cuò)了讀到的是相鄰兩個(gè)字節(jié)拼起來的數(shù)結(jié)果會莫名其妙。這類錯(cuò)誤在調(diào)試時(shí)表現(xiàn)為結(jié)果看著像個(gè)正常數(shù)但就是不對而且往往前幾個(gè)數(shù)還是對的后面才開始飄。提示累加類程序的經(jīng)典自檢方法是拿第一個(gè)元素單獨(dú)跑一次——把 COUNT 改成 1看結(jié)果是不是等于第一個(gè)元素。如果是說明尋址和累加邏輯沒問題再把 COUNT 改回去。這個(gè)手法能把邏輯錯(cuò)和步長錯(cuò)快速區(qū)分開。3.3 用 DEBUG 盯住 CX 的每一次變化代碼寫完編譯通過不等于程序是對的。匯編這門東西靜態(tài)看代碼只能發(fā)現(xiàn)語法錯(cuò)誤邏輯錯(cuò)誤全靠調(diào)試器抓。DEBUG 的三個(gè)命令足夠應(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正好是第一個(gè)元素此時(shí) 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)上時(shí)CX 還沒被遞減所以第一次停在斷點(diǎn)看到的是 6第二次是 5。這個(gè)停在斷點(diǎn)上看到的是遞減前的值的細(xì)節(jié)第一次用斷點(diǎn)調(diào)試循環(huán)的人幾乎都會困惑一下。我在教別人調(diào)試循環(huán)的時(shí)候一般會讓他們做一件事把 CX 的每次變化抄在紙上六次一輪和手算的累加過程對一遍。聽起來笨但比對兩三遍之后對先減后判的理解就從概念變成肌肉記憶了。3.4 嵌套循環(huán)里 CX 的保護(hù)單層循環(huán)用 CX 天經(jīng)地義一進(jìn)嵌套就麻煩——CX 只有一個(gè)內(nèi)外兩層都要計(jì)數(shù)怎么辦三種方案各有適用場合。方案一壓棧保護(hù)。外層進(jìn)內(nèi)層之前PUSH CX內(nèi)層跑完P(guān)OP CX再執(zhí)行外層的LOOP。這是最直白、最不容易出錯(cuò)的做法。MOV CX, 5 ; 外層次數(shù) OUTER: PUSH CX ; 保護(hù)外層計(jì)數(shù) MOV CX, 4 ; 內(nèi)層次數(shù) INNER: ; 內(nèi)層循環(huán)體 LOOP INNER POP CX ; 恢復(fù)外層計(jì)數(shù) LOOP OUTER壓棧的代價(jià)是兩次內(nèi)存訪問配上棧操作本身的指令開銷在緊湊的內(nèi)層循環(huán)里不算便宜。但它的好處是絕對可靠不用擔(dān)心內(nèi)層代碼有沒有動過 CX。方案二換寄存器。外層用 CX 走LOOP內(nèi)層用 DI 或 BX 配合DEC / JNZ兩個(gè)計(jì)數(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)志位的場合要小心。方案三計(jì)數(shù)器放內(nèi)存。用一個(gè)DW變量當(dāng)內(nèi)層計(jì)數(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í)候建議直接把計(jì)數(shù)器都放內(nèi)存代碼可讀性比那點(diǎn)性能重要得多。三層嵌套的壓棧彈棧順序一旦寫錯(cuò)出錯(cuò)現(xiàn)場會非常難查——程序不崩只是結(jié)果不對而且只在特定輸入下才不對。4. 常見問題與排查技巧實(shí)錄4.1 初值給 0跑出 65536 次這是LOOP最經(jīng)典的坑沒有之一。CX 初值為 0 的時(shí)候LOOP并不是一次都不循環(huán)而是循環(huán) 65536 次。原因在先減后判這四個(gè)字。CX 等于 0執(zhí)行LOOP先減一0 - 1 在 16 位無符號數(shù)里等于 FFFFH也就是 65535不等于零于是跳轉(zhuǎn)。接下來每次減一要走 65535 次才能回到 0。加上第一次總共 65536 次。這個(gè)坑在兩種場景下最容易觸發(fā)。第一種循環(huán)次數(shù)來自外部輸入。比如從鍵盤讀一個(gè)數(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ù)變多程序耗時(shí)明顯拉長二是循環(huán)次數(shù)變少結(jié)果只算了一部分。前面提過的三份兼職就是三大嫌疑人。REP前綴最狠。REP MOVSB、REP STOSB執(zhí)行完之后CX 一定變成 0。如果你的外層循環(huán)計(jì)數(shù)器也在 CX 上內(nèi)層一個(gè)REP就把外層歸零了外層循環(huán)立刻結(jié)束程序看起來跑完了但結(jié)果只處理了第一趟。變量移位次之。MOV CL, 3加SHL AX, CL這種寫法會把 CX 的低字節(jié)改掉。如果計(jì)數(shù)器只用 CL 的一部分且移位次數(shù)很小可能表現(xiàn)成循環(huán)多跑了幾次不容易第一時(shí)間發(fā)現(xiàn)。除法最隱蔽。DIV CX執(zhí)行之后CX 本身不變但整個(gè)運(yùn)算把 AX 和 DX 都覆蓋了。如果你的累加器在 AX 上除完就沒了。雖然不直接改 CX但和 CX 相關(guān)的運(yùn)算鏈一起被破壞癥狀同樣表現(xiàn)為數(shù)算錯(cuò)了。排查這類問題我一般用二分法先把循環(huán)體里的指令注釋掉一半看 CX 是否穩(wěn)定穩(wěn)定就說明問題在被注釋的那一半然后繼續(xù)二分。比逐條讀代碼快得多。4.3 跳超出范圍LOOP 匯編不過循環(huán)體寫長了LOOP的 8 位位移字段裝不下匯編器直接報(bào)錯(cuò)。這個(gè)錯(cuò)誤很好認(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 位位移能覆蓋整個(gè)段。缺點(diǎn)是每次循環(huán)多一條指令代碼可讀性也差一點(diǎn)。改寫的時(shí)候要留意標(biāo)志位。原來是LOOP不碰標(biāo)志換成DEC CX之后標(biāo)志被改了。如果循環(huán)體里最后一次比較的結(jié)果需要在循環(huán)外繼續(xù)用得在DEC之前先把結(jié)果保存進(jìn)變量或寄存器否則出了循環(huán)再判斷就是錯(cuò)的。還有一種情況是循環(huán)體里嵌套了另一個(gè)LOOP內(nèi)外層加起來超了 128 字節(jié)但每一層單獨(dú)看都沒超。這時(shí)候匯編器可能只報(bào)外層有問題實(shí)際是內(nèi)外層共同的位移和超限。解決思路一樣把內(nèi)層改成DEC / JNZ先給外層騰出空間。4.4 問題速查表把上面這些踩過的坑整理成一張表出問題的時(shí)候按癥狀對號入座比從頭讀代碼快?,F(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)用前壓棧返回后彈棧匯編報(bà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)體跑一次搬一個(gè)字節(jié)。這段代碼約十一個(gè)字節(jié)LOOP的位移量是 -9 左右在范圍內(nèi)能正常匯編。這里 SI 和 DI 的分工是約定俗成的SI 是源索引DI 是目標(biāo)索引很多串操作指令默認(rèn)就用這兩個(gè)寄存器?,F(xiàn)在手寫循環(huán)用它們后面換成REP MOVSB的時(shí)候也就是把整個(gè)循環(huán)體換成一條指令不用改寄存器約定。塊復(fù)制有個(gè)經(jīng)典陷阱源和目的區(qū)域重疊。如果目標(biāo)區(qū)域在源區(qū)域的低地址方向從前往后復(fù)制會把還沒讀的源數(shù)據(jù)覆蓋掉。這時(shí)候必須改成從高地址往低地址復(fù)制也就是指針先指向末尾每次減一。這個(gè)方向問題在內(nèi)存管理類的程序里出現(xiàn)頻率不低而且癥狀很怪——復(fù)制出來的數(shù)據(jù)有一部分是對的另一部分是錯(cuò)的看著像隨機(jī)損壞。5.2 REP 前綴把 CX 交給硬件REP MOVSB這條指令把上面整個(gè)循環(huán)體壓縮成了一行而且速度更快原理就在 CX 身上。REP的本質(zhì)是一個(gè)硬件級的循環(huán)控制器。它做的事檢查 CX 是否為零為零就退出不為零就執(zhí)行一次后面的串操作指令CX 減一然后重新檢查。整個(gè)過程不需要 CPU 反復(fù)取指譯碼效率比軟件循環(huán)高出一截。CLD ; 方向標(biāo)志清零地址遞增 MOV CX, LENGTH LEA SI, SRC LEA DI, DST REP MOVSB四條有效指令替代了七條機(jī)器碼也短了。不過用REP有幾個(gè)前提條件必須滿足。第一方向標(biāo)志要明確。CLD是地址遞增STD是地址遞減。如果之前某個(gè)操作把 DF 設(shè)成了 1而你又沒清掉REP MOVSB就會從高地址往低地址搬結(jié)果和預(yù)期相反。我一般習(xí)慣在每條REP之前都寫一句CLD雖然多數(shù)時(shí)候是多余的但省得排查。第二SI 和 DI 的初值要落在正確的段里。MOVSB默認(rèn)用 DS:SI 做源、ES:DI 做目的ES 段寄存器必須提前設(shè)好否則會寫到一段莫名其妙的內(nèi)存里去。這一點(diǎn)跟手寫循環(huán)不一樣——手寫循環(huán)用MOV [DI], AL的時(shí)候DI 默認(rèn)也是走 DS除非顯式加段前綴。這個(gè)默認(rèn)段的前后差異是初學(xué)REP時(shí)最常撞的墻。第三CX 一定是次數(shù)。REP執(zhí)行完 CX 歸零做完之后想用原來的長度得提前備份。注意REP MOVSW一次搬一個(gè)字比MOVSB快一倍前提是長度是偶數(shù)、源和目標(biāo)地址都是字對齊的。長度是奇數(shù)的時(shí)候得單獨(dú)處理最后一個(gè)字節(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 ; 每次搬兩個(gè)字次數(shù)減半 LEA SI, SRC LEA DI, DST COPY: MOV AX, [SI] MOV [DI], AX ADD SI, 2 ADD DI, 2 LOOP COPY這個(gè)例子里循環(huán)體翻了一倍但控制指令的執(zhí)行次數(shù)減半。在老機(jī)器上循環(huán)控制指令的取指譯碼開銷占比不小這種改寫能有實(shí)實(shí)在在的速度提升。但現(xiàn)在要不要這么做得看具體場景。現(xiàn)代處理器有分支預(yù)測和指令緩存LOOP這類短小的循環(huán)控制指令很可能被預(yù)測器提前處理掉展開帶來的收益未必明顯反過來代碼體積變大會擠占指令緩存在某些場景下反而更慢。所以我的原則是除非實(shí)測發(fā)現(xiàn)這個(gè)循環(huán)是熱點(diǎn)否則不主動展開。可讀性的損失是實(shí)打?qū)嵉氖找鎱s要打了問號。真要追求塊復(fù)制的極致性能現(xiàn)代的做法是用單指令多數(shù)據(jù)擴(kuò)展一次搬十六個(gè)甚至六十四個(gè)字節(jié)那已經(jīng)是另一套指令體系了跟 8086 的LOOP不在一個(gè)層面上。就 8086 這個(gè)平臺本身而言這幾個(gè)方案的性能排序大致是REP MOVSW快于手寫MOVSW循環(huán)手寫MOVSW循環(huán)快于MOVSB循環(huán)LOOP收尾略快于DEC / JNZ收尾。差距在具體數(shù)字上不大但在緊密的內(nèi)層循環(huán)里累積起來能看出來。我自己在寫這類程序的時(shí)候習(xí)慣是先用最直白的LOOP版本把邏輯跑通確認(rèn)結(jié)果正確再考慮要不要換REP或者展開。順序不能反——先優(yōu)化后正確等于給自己挖坑出了錯(cuò)都不知道是邏輯問題還是優(yōu)化引入的問題。實(shí)際動手寫下來我對LOOP和 CX 這套機(jī)制的體會是它們的設(shè)計(jì)非常經(jīng)濟(jì)一條兩字節(jié)的指令承擔(dān)了循環(huán)控制、計(jì)數(shù)遞減、條件判斷三件事代價(jià)是把計(jì)數(shù)器和一大堆指令綁在了一起。這個(gè)設(shè)計(jì)在資源緊張的年代是聰明的取舍放到今天就變成了要小心繞開的耦合。所以我現(xiàn)在寫匯編只要循環(huán)體超過五行就先把 CX 的使用情況在紙上畫一遍標(biāo)出哪些指令會碰它、哪些子程序可能動它畫完再動手。這個(gè)習(xí)慣幫我省掉的調(diào)試時(shí)間比任何優(yōu)化技巧都多。真要說有什么值得反復(fù)強(qiáng)調(diào)的那就是初值為零這一條——JCXZ多寫一行能省掉一下午。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91丨九色丨国产丨人妻在线| 操死我了嗯嗯嗯| 97精品国产97久久久久久户外免费| 日韩乱码Av| 九九九久千久久激情蜜桃在线看| 91AV天堂| 欧成人精品一区二区三区| 97干97色| av天堂精品久久| 欧美极度丰满熟妇hd| 看一级黄色视频| 日本天天操| 亚洲一区日韩| 精久久久91| 色噜噜人妻av中文字幕| 日本不卡一区二区| 亚洲欧洲综合av在线| 女人被添高潮免费视频| 91 国产丝袜在线放观看| 99国产精品久久久在线播放| 噜噜噜噜天天狠狠| 午夜超爽| 天天爽天天| 日韩欧亚中文在线| 尤物AV免费网站| 亚洲天堂精品日韩电影| 黄色免费网页无码| 亚洲国产一级中文综合久久天堂在线免费观看 | 乱伦a片视频| 黄片直播三级黄片两女一男| 日本三级小说中文字幕| 漂亮人妻被强中文字幕hd| 日本精品五区| 极品色www影院| 中文乱码99| 九九久精品| 国产成久久综合片| 久久久精品国产亚洲AV无码| 麻豆性爱视频在线播放| 男女啊啊啊啊啊| 日韩在线一区高清在线| 天天爽爽爽爽| 国产乱码久久久| 成人26uuu| 国产做?爰片久久毛片?片美国| 中文字幕一区二区三区蜜臀| 欧美色图欧美| 啪啪资源网| 久久熟女人| 亚洲美女高潮喷水视频| 国产传媒操逼视频| 青青操97| 亚洲97在线观看| 久久精品国产亚洲AV嘿嘿| 国产SV一线| 97在线公开视频| 国产在线强奸视频| 亚洲 欧美 小说| 男人的天堂va| 宅男91视频在线播放| 91色欧美| 九九热免费视频| 美女丝袜激情小说| 日韩一区二区高清在线观看的| 五月丁香久久| 91痴汉| 久久国内| 97超碰免费生活| 人妻二区| 欧美激情超碰777| 狼人狠干| 91蜜臀熟女| 日韩三级av片| 99热只有| 日韩综合色图| 欧美躁死她一区二区| 欧洲自拍第一页| 色呦呦呦在线观看视频| 久草色悠悠在线视频| 欧差乱伦二三| 图色综合网| 亚洲啪啪综合?v一区综合精品区| 精品久久在线区一区| 综合网91| 综合国产97| 亚洲图片欧美色| 你操综合| 国产精品不卡av免费在线观看| 3571色综合一区二区二区| 性欧美999| 欧美精品自慰系列寂寞少妇| 伊人宅男大香蕉| 亚洲综合九九| 三级色影综合网| 情色AV电影| 国产探花精品在线| JIZZJIZZ亚洲女人被躁| 国产av白丝| 97久久超碰日韩精品| 探花激情视频| 少妇淫妇久久久久久久| 蜜臀精品1区2区| 天天看天天日| 日韩欧美中文字| 欧美性巨大╳╳╳╳╳高跟鞋| 亚洲天堂电影网| 日韩乱插| 国产精品不卡av免费在线观看| 欧洲综合视频| www.yeyecao| 美女91色黄18| 99爱精品| 亚洲高清欧美总合| 欧美老妇女内射网址| 蜜臀AV秘一区翔田千里| 国产亚洲日本| 国产精选三级在线观看| 超碰午夜| 亚洲成人妻日韩在线| 99久久e免费热视| 欧亚日本情色| 亚洲日韩AV视色| jazzjazz国产精品麻豆| 久久久久ab| 亚洲AV秘 精品久久老牛影视| 玖玖爱伊人玖玖爱| 91网站18在线观看| 国模艳艳啪啪一区| 国产91 丝袜在线播放| 欧美性暴力猛交XXXX| 亚洲国产婷婷在线播放| 黄色工厂这里只有精品| av麻豆啪啪| 亚洲中文字母在线播放| 婷婷人妻激情| 欧美久久婷婷| 97综合在线| 欧美精品宗合| 色五月AV在线| 亚洲精品819| 日本欧美韩国国产在线| 精品国产乱码久久久| 天堂国产AV| 九九综合久久| 久久久久人妻二区精品叶可怜| 日本在线视频导航| 亚洲久草AV色图| 日韩三级一区| 人妻日日干| 成·人免费午夜在线观看| 啊好大好舒服| 韩国一级做A片免费的| 女色综合| 午夜传煤十二区精品| 欧美美女自慰一区二区三区| 91社操逼| 国产探花日韩援交| 熟妇熟女一区二区三区| 97超色| 欧美三级一级| 国产无马av| 日B操| 国际精品久久久| 久久久久9999妇女| 在线观看AV不卡| 午夜电影在线观看无码专区| 国产精品美女久久久久久网站| 97超碰色中文字幕| 999 久久久| 欧美极品女人的天堂| 亚洲最新中文字幕免费| 久久狠狠色噜噜狠狠狠狠97| 久久爱97| 久啪视频| 欧美淫穴| 玖玖爱综合| 九九性爱网| 国产精品久久久久久久久久久久| 久草线上视频免费看| 天天天堂影视日韩亚洲91| 国产成人精品网站| 欧美精品99久久久| 探花一区在线| 欧美亚洲另类在线蜜桃| 国产一区二区三三视频| 大肥女高潮bbwbbwhd视频| 狠狠夜色午夜久久综合在线| 中文字幕在线观看AV| 网页导航五月天免费一二三区| 尹人免费观看视频在线| 日本精品五区| 麻豆91熟妇人妻中文字幕茄子| 91在线欧色| 26uuu国产日韩综合在线观看| 91 丝袜在线播放| 亚洲资源一区| 色97干| 嗯嗯嗯啊啊在线观看| 天美欧美国产| 九九国产热| 中文字幕 一区二区 亚洲无码| AV电影在线播放| 国产高清在线观看欧美| 亚洲精品无码成人久久久99| 国产亚洲精品激情| 人妻少妇被猛烈进入中| 免费观看国产不卡av| 日本中文熟女视频| 久久这里只精品免费福利| 国产福利精品98视频| 91亚洲网| 91天天| 日韩91网| 一本色道久久综合精品婷婷| 久草新在线| 清纯唯美第一页| 亚洲九九视频| 日本 情色 1区| 青青草原伊人网| 夜夜欧美| 91丨人妻丨国产丨丝袜| 综合久久97| 干超碰碰熟女| 亚欧高清| 最新日产中文在线麻豆| 日本一区二区做爱的视频| 一级久久久久久久久久久| 欧美三级中文字幕hd| 黄aaaaaaaaaaaaaaaaaa色网站| 国人欧美精品一区二区| 九月丁香| 理论久久婷婷网 8| 成人久久无码www| 安徽熟妇视频| 九九九九一级| 中文字幕一区二区无码成人| 2017亚洲天堂| 欧美日韩黄片精品在线| 亚洲一级特黄大片在线播放91| 亚洲欧综合另类无码一区| 日韩探花精品在线视频| 97干在线视频| 冬京热男人的天堂| 97天天在线| 色悠久久久av| 91精品人妻一品二品三品| 九九九九精品九九九九| 日本人妻中文字幕精品| 久久久久国产精品喷潮免费观看臀 | 人人搡人人肉久久精品| 久久婷婷苹果| 久久高潮妇女视频| 欧美性生活男人的天堂| 最近2019中文字幕国语免费版| 色婷婷丁香| 国产农村妇女一区二区| 很很很很操| 亚洲风情综合网| 亚洲狠狠入| 凹凸精品熟女在线观看| 天天色综亚洲91污| 精品女人999| 使劲用力艹少妇视频一区二区| 后入式福利| 探花精品 一区二区| 国产在线激情视频| 婷婷久热| 少妇与黑人高潮在线| 2019天天操天天爽天天拍| 精品女同一区| 国产精品人妻免费精品| 亚洲一区二区三区欧美日韩| 国产乱婷婷精品二区三区| 天美传媒av在线| 色妇综合网| 午夜无遮挡男女啪啪视频| 97人人干| 最新9久久久9免费视频| 中文字幕av亚洲精品| 国产欧美岛国精品一区| 日本亚洲vr欧美不卡高清专区| 91色综合色| 97超碰色| 无遮挡h肉动漫在线观看| 亚洲不卡不卡中文字幕不卡 | 97chaopengongkai| 国产麻豆福利av在线播放| 激情综合五月天| 好屌色综合| 天天久久| 一区在线国产播放| 大香蕉综合久久| 91丝袜视频在线观看| av无码精品久久久久| 久久手机好看网站| 99久草| 亚洲日韩美国人妻| 伊人久久大香蕉线AV五月天| 啊啊啊免费| 黄片不用下载在线观看| 91爱做| 啪啪视频免费在线观看| 六九九九| 亚洲AV色图| 日韩精品1区2区中文字幕| 黄色大片一区二区密桃丝袜| 色色九区| 国产AV高清AV无码| 九九九精品一区二区无码| 精品九九| 亚欧精品久久久久久久久久久| 久久色AV线| 国产精品一区av在线| 国产怡红院| 超碰碰97资源站| 操逼网站网站| 91 丝袜在线| 51国产午夜精品视频| 亚洲色天堂日韩中| 亚洲a色| www.av在线视频| 日韩国产十八禁| 国产高清自拍视频| 91丝袜在线观看视频在线观看| 欧美性性性| 午夜免费福利视频一区| 99热线麻豆 | 探花激情视频| 二级久久网| 色哟哟AⅤ| 97操97色| A级在线视频| 91处女在线观看| 成人性爱电影一区二区| 香蕉大久久久| 亚洲 国产 精品一区| 999九九精品| 国产一进一出视频网站| 超碰中文字幕人妻草一区| 97这里有精品| 亚州伊人色综台| 欧美综合91| 国产精品青青草| 性天堂| 久久9 9 9精品| 久久久九九九| 久草热制服丝袜在线观看| 亚洲色欲天天天堂色欲网女| 久久综合av| 国产福利小视频高清在线观看| 丝袜亚洲91| 在线看片国产精品每日更新| 国产自偷| 男人的天堂2010| 一区二区三| 色呦呦、国产精品| 国产中文大片资源中文字幕| 国外91| 在线国产一区二区av| 色欲久久99精品久久| 欧美色婷婷| 亚洲成人ab| 偷窥自拍亚洲色图| 91精品人妻偷情| 欧美色天堂网在线视频| 把腿张开老子CAO烂你| 91N综合网| 亚州色交| 日本色色视频网站| 在线色资源| 婷婷五月天社区| 偷拍精品一区二区三区| 新97国产超碰| 九九在线精品| 激情抓乳插进去啪啪啪日韩| 亚洲天在线| 韩国一区二区精品亚洲| 亚洲日本激情| av橘色网站| 玖色AV| 宅男影院久久久,99| 激情文学小说一区二区| 天美国产精品| 乱伦图av| 97综合久久| 欧美精品日韩一区二区| 翔田千里AV无码秘 三区| 欧美激情久| 91一起操| 天天躁日日躁AAAAXXXX国产| 97人人夜| 国产十八禁视频| 五月天激情四射| 九九碰九九爱97超碰| 九九国产热| 无码色| 亚洲一区二区三区播放在线| 国产精品在线免费| 牛牛久久国产精品视频一二三| 五月丁香综合啪啪| www.91人妻.com| 国产丝袜啪啪| 亚洲有码第一页| 91蜜臀在线久久久久| 操逼国产免费| 91操熟女| 亚洲丨在线| 91在线免费观看处女| 色色色天美视频| 日本一级特级毛片视频| 玖色av| 欧美白嫩女HD| 碰碰在线视频| 妺妺跟我一起洗澡没忍住| 成人精品在线免费视频| 欧美性爱超碰97| 先锋音影AV| 观看免费区二区三区二| 美日韩成人| 多毛小伙内射老太婆| 91精片| 中文字幕熟女人妻丝袜丝| 亚洲色图加勒比| 婷婷五月天网| 国产超碰人人爽人人做| 国产成人精品必看| 欧美激情性久久久久久| 免费岛国一级片| 亚洲丝袜在线观看| 懂色av中文字幕| 超碰综合色| 在线 亚洲 网爆 自拍| 超碰成人免费| 精品少妇一区二区三区在线视频| 日韩精品一区二区高清| 97超碰色| 欧美AB在线| 性欧美第一页| 超碰99热中文字幕| 超碰97玖玖爱| 国产精品青青草| 日韩AV一区二区三区四四| 大伊香蕉在线视频免费| 成人aⅴ一区二区三区| 98人妻精品一区二区色欲| 日本色日夜干| 91亚洲色图| 亚洲不卡一| 欧美色图97| 曰韩香蕉97| 2017天天拍大香蕉| 手机不卡视频不卡在线一二三区| www.色五月| 国模无码一区二区三区在线| 国产精品999zyz| 国模私拍一区二区三区神乳| 亚洲成aⅴ人片不卡无码| 黄色免费网| 波多野结衣之双飞调教在线播放| 精品无吗m| 色香av| 玖玖久久久| 亚洲欧美洲综合| 蜜臀99久久国产| 上床啊啊啊| 啊啊啊啊啊啊在线| 97免费视频在线观看| 97干在线| 翔田千里Av在线| .精品人妻一区二区三| 亚洲AV无码乱码| 久久久精品电影| 黄色视频60分钟| 色婷婷激一区二区三区 | 囯产乱伦一区二区三女| 视频在线观看免费一区二区三区| 亚洲啪啪视频一区二区| 五月天黄色激情视频| 亚洲国产日韩欧美熟妇在线| h在线看免费版在线看| 亚洲色天堂日韩中| 欧美无圣光在线| 91九九九小逼| 日韩人妻精品| 人人操人人摸超碰| 69视频入口| 国产一进一出视频网站| 精品伊人久久久大香线蕉小说| 色五月综合| 色性综合| 殴洲老熟女| 五月天欧美色图| 欧美 色 亚洲| 欧美AAAA黄片| 国语精品内射在线观看| 日本一级二级三级网站| 亚洲AV小说| 亚洲AV高潮| 亚洲图片在线| 久久东京热久久| 性久久久| 97福利视频| 免费看污网站| 狠狠干妹子| 91第一页| 欧美日韩国产三级黄色| 婷婷久热| 色色99| 日韩欧美中文字亚洲慕| 国产成人亚洲精品无| gogogo免费高清看中国国语 | 日本 情色 1区2区3区| 97久久国产| 强奸乱伦AV网站| 久/久精品99看9| 免费人人搞97| 激情小说激情视频| 精品国产91内射久久| 久草大| 无码视频一区二区| 久操免费电影| 少妇蹲下露出大唇5| 美女被啪到深处抽搐视频| 欧美视频一区二区在线| 亚洲情色婷婷五月天| 91成人国产综合久久精品蜜月| 九九玖玖精品| 天天干人妻视频| 免费视频97| 亚洲天堂在线怕怕视频| 激情久久久| 九九热五区| 大香蕉视频啪啪啪啪| 欧美探花网| 人妻久久久久久久久久久久久久久| 大香蕉宅男伊人| 超碰人妻97| 天堂中文日本在线观看| 北京专精特新企业招聘信息| 一卡二卡三卡| 欧美亚洲一级在线观看| 国内91熟女人妻丝袜天天精品视频在线| 麻豆一区在线| 97亚洲综合| 91超级碰碰碰| 日韩 女同 综合| 13小男生GAY自慰脱裤子| 超碰av在线| 欧洲大香蕉| 操操逼视频| 国产精品女同| 欧美草草高清日韩视频| 日韩欧美午夜视频在线| 青青国产精品在线| 青娱乐黄色录像| 凸凹视频在线观看| 亚洲熟久久| 一区二区免费电影久久| 久操高青| 午夜男人的天堂| 欧美成人性爱视频大全| 亚洲色图 综合| 亚洲精品一区二区精品| 四虎影视在线| 亚洲色图91| 五月丁香影院| 亚洲中文丝袜美腿诱惑字幕| 九九黄色视频在线观看| 亚拍在线| 久久久久久国产无码精品| 亚洲自拍欧美国产首页网曝| 亚洲av噜噜噜噜噜噜| www.狠狠干.coom| 久久精品超碰| 99在线精品视频| 黑人精品欧美一区二区蜜桃| 中文字幕成人理论在线| 人人爽夜夜玩视频| 岛园激情| 97国产中文| 婷婷AV一区二区三区| 欧美黑人168页欧美黑人167| 欧美一区二区观看在线| 亚爽爽爽爽爽爽爽爽| 日韩欧洲操屄视频| 啊啊啊好舒服好爽啊啊啊视频| 波多野结衣之双飞调教在线播放| 蜜桃中文字日产乱幕4区| 天天干人人看综合| 用力操死我| 欧美中文字幕日韩在线| 香港日本韩国人妇99www.wccm20| 一起草欧美| 97这里都是精品| 一级毛片电影免费看| 亚洲制服欧美另类内射| 日本免费二区三区| 成功精品影院| 色网色网色网色网色网色| 看看小穴| 翔田千里无码中出中文字幕| 精品无码人妻一区二区免费蜜桃| 粉嫩粉嫩一区性色AV片| 后入日本1234| 国产刺激视频| 色吧5亚洲| 搞中出视频在线观看| av无码精品久久久久| 加勒比av网| 99爱视频| 欧美爆乳精品一区二区| 久久综合久色欧美综合狠狠| 欧美疯狂做爰xxxx| 91精品网站| 熟妇一区二区三区| 国产成年精品高清在线观看91| 男人天堂免费| 五月天开心网| 999久久久免费精品国产牛牛| baiduhicn.com。| 中日韩欧美精品无码AⅤ一区二区| 97就爱干| 色婷婷成人| 日韩av在线精品观看| 亚洲一区亚洲天堂| 丁香五月婷婷啪啪| 亚洲色图欧美激情| 97资源免费视频| 日韩久久激情精品| 99久久精品国产系列| 中文字幕女同在线| 婷婷丁香六月| 亚洲春色欧美激情自拍| 久操视频在线| 夜夜狼人妻| 人人干人人搞人人摸| 青草精品视频日本久久久久网站在线| oumeisetupian| 国产 v乱码一区二| 国产捆绑一区| 97欧美色| 久久精品视频久久久| 国产大学生口爆吞精合集| 射综合网| 嗯嗯啊好大| 六月丁香网| 精品日韩中文在线| 91宗合网| 18禁久极品美女久久哦哟呀!| 丁香五月社区| 日韩卡一卡二卡三在线| 超碰2017| 欧美日韩97在线| 99热超碰| 成人片在线播放| 操操逼视频| 亚洲中文字幕一区| 超碰1024久久| 五月激情综合网| 国产精品欧美日韩久久| 深夜福利黄片| 精品人妻一区二区三区四区| 久久久专区| 天天综合AV| 日韩性爱视频免费在线| 超清福利精品视频在线| 欧美97在线欧| 亚洲色欧| 久久久久9| 久久久啊啊| 操一区| 日本欧美一区二区三区免费| 91 欧美| 东京热,男人的天堂| 校园春色宗合网| 青青草视频久久久久| 日本一本一区二区三区四区五区欧美日韩中文字幕| 丁香五六月啪啪| 亚洲日韩天堂| 99日免费视频中文字幕| 少妇500双飞99| 麻豆亚洲Av成人无码一区精品| 极品美女福利在线观看| 久操网视频| 久久久久久99AV无码免费网站| 欧美写真视频一区| 超碰九九| 国产精品电影推荐| 日日夜夜青青草母狗| 国产高清1234区| www.夜夜| 91精品伊人久久久大香线蕉91| A级在线视频| 9Ⅰ老熟女| 天天干18禁| 欧美综合中文| 在线 欧美 亚洲| 蜜臀无码一区二区| 免费成人在线熟妇网| 91电影色诱| 丝袜综合色图| 香蕉一区二区三区在线视频| 日韩另类色图| 成人婷婷丁香| 99激情视频| 午夜色婷婷| 国产 日韩 另类 视频一区爱| 久久精品欧美一区二区三区不卡| 97视频在线免费观看| 欧美天天弄| 天天噜| 91国模| 97色碰| 国产熟女精品一区二区| 亚洲黑人在线| 韩国一级做a久久久久| 欧美亚洲中文| 麻豆国产97在线| 最近2018中文字幕在线高清第一页| av黄图片在线观看| 精品福利| 大香蕉啪啪网| www…国产操逼| 久久‘黄片视频| 亚洲精品三区在线观看| 天天艹天天日| 可以在线观看AV的网站| 唐山老熟妇露脸啪啪叫| 欧美日韩国产高清在线一二三区| 国产熟女完整版中字| 八人操人人摸人人看| 乱伦AVxx| 激情五月天色色网| 亚洲成人免费电影| 97九色人妻| 嗯啊不要啊在线 | 国产中文字幕在线观看| 久久熟女嫩草成人片免费| 97中文综合| 欧洲综合色图| 东北少妇高潮zzzz| 国产二区视频在线观看电影| 日韩乱伦影音先锋| 岛国片在线观看视频亚洲| 任你艹| 少妇免费视频| 亚洲人91| 91男人天堂网| 国产9l 大屁股| 一区二区乱码福利| 国产区日韩区在线观看| 白天啪啪晚上啪啪视频| 97久久超碰| 亚洲AV无码| 欧美大战久久久伊人| 中出91视频| 曰韩中文人妻视频| 天天综合网日韩7799| 狠狠色综合网| 中文乱码99| 国产精品久久久久久久久久久久久久久久| 久久久久久久综合,国产| 婷婷激情四射| 国产乱色国产精品免费视| 日亚韩精品视频二区三| 亚洲性综合9| 国产十八禁视频| 亚洲欧美综合图片| 一个人免费视频观看在线WWW| 精品一区二区综合熟妇| 久久女人一区二区三区| 超碰中文字幕人妻草一区| 亚洲不卡一| 日韩日本欧美在线观看| 国产激情av女片自拍| 国产欧美美女免费观看视频| 欧美色图中文字幕| 超碰在线成人电影| 欧美亚洲国产91在线| 国产h片在线观看视频| 久久精品一区二区三区不卡| 亚洲综合性网址| 色九久| 日韩激情啪啪啪| 熟女人妻av在线资源,黄色的资源| 欧美色日本| 999久久久国产精品| 黄骗免费| 精品免费一区二区三区在线亚洲人成| 91国产在线精品| 欧美色狠| 国产成人无码高清| 久久夜夜夜夜| 天啪| 亚洲一卡2卡3卡4卡乱码网站| 神马视频久久久久久| 色综合1991| 99久久精品欧美国产| 国产激情久久久| 欧美日韩理论一区| 超碰97日韩| yellow网站免费观看日韩高清无码| 欧美制服网站美腿丝袜| 中出在线视频| 精品久久久久久中文字幕三区| 99热这里只有精品8| 蜜桃狠狠色伊人亚洲综合| 中文字幕人妻资源在线| 99久久综合| 国产91丝袜在线播放蜜月| 99热| www.色五月| 老熟妇一区二区三区啪啪| 黄片视频观看| 青青草视频久久| 新怡红院| 午夜影美女日鸡鸡天天视频国产| 欧美老妇女内射网址| 91bbb| 五月天婷婷综合网| 蜜臀一二三区| 风流老熟女一区二区三区l| 青青草吊丝| 懂色Av| 婷婷日韩一区二区三区中文字幕在线| 天天激色| 成全在线观看免费观看| 欧美爆操91| 张柏芝国产一区在线观看| 超91综合网| 国产精品久久泡妞网站| 日本精品一区二区中文字幕| 色天堂在线观看| 国产免a费看黄片在线| 78久久久| AVE乱伦| 91婷婷伊人狠人| 97视频免费| 91强热人妻| 亚洲丰满很很操| 乳欲人妻办公室奶水| 男人天堂综合| 亚洲国产ⅴ高清在线观看| 精品人妻视频一区二区三区蜜桃视频| 亚洲精品久久久久毛片A片拉屎| 国产亚洲一黄| 丰满人妻一区二区三区蜜桃视频| 性爱久久| 久久人妻一区二区三区高清| 91强奸乱轮| 亚洲欧美啪啪| 中文字幕在线观看二区三区| 亚洲中文字幕一区| 逼逼逼逼操操操操操操操操操午夜剧场 | 亚洲欧美另类少妇精品| 欧美视频一| 熟女自慰久久久| 最新av网站在线观看| 密臀AV在线| 99精品欧美一区二区三区桃色| 素颜老阿姨乱情色| 亚洲国产麻豆一区二区三区| 国精综合一二三区影视| 日本性爱欧美性爱| 加勒比伊人综合| 韩国三级理论在线| 国内毛片四区| 920日本午夜免费| 看全色黄大色大片免费视频| 操人妻少妇中文 | 国产精品乱码久久| 91九久| 日韩免费三级黄片电影| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国语精品av| 九九九九久久久| 蜜臀一区二区三区在线| 超碰碰97| 综合操逼| 青青草依人大香蕉| 荡小穴在线观看| 人妻精品视频一区二区三区| 精品久久久久久久久久久久| 国产真乱mangent| 中国的操老妇女| 亚欧日韩成人| 免费视频观看60秒| 啊啊啊啊视频免费| 精品欧美А∨无码黑人大荫蒂| 久久久成人免费av电影| 久久久久久久人妻| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 一区二区三区国产精产| 国产成人精品无码久久| 日韩AV噜噜噜一区二区三区四区| 国产超碰国产97| 夜草网站| 97资源站久久| 一区二区三区四区色图| 手机午夜电影神马久久| 午夜欧美神马久久久久| 日韩免费大片一级播放| 欧美日韩系列| 超碰97起碰| 日日噜噜夜夜狠狠视频无| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 加勒比人妻综合| 久热超碰| 午夜视频久久久久一区| 亚洲激情深爱文学小说网站| 中文字幕大片三级狠狠干| 少妇啪啪自拍| 欧姜老司机| 激情欧美日韩女同久久| 色情五月婷婷| 国产超碰AV在线精品| 色九九九九九九| 亚熟在线| 91在线免费精品视频| 男人天堂日日夜夜| 性色av网站| 国产精品高潮久久久无码| 国产人妻精品一区二区三区秋霞| 91色艳| 黄骗免费| 欧美成人一级麻豆| 男人的天堂kva| 国产成人主播| 啊啊啊啊啊在线观看网址| 黑人无码一区二区| 成人26uuu| 天天射日日干| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 色亚洲欧美| 97超碰精品成| 国产乱弄免费在线视频。| 一本道综合色图| 久久男女激情视频网站 | 91天天综合网| 91久久国产精品| 少妇内射视频| 97超碰久久色| 亚洲 图片 欧美 色图| 一区二区 韩日AV| 日韩性爱网址| 国产成人bd在线观看| 国产操逼视频在线观看| 夜夜骑夜夜操| 九久精品| 亚洲成人在线乱码色午夜| 国产丸一视频| 亚洲凸凹超碰成人| 午夜精品久久久久| 亚洲码和欧洲精品激情系列| 另类图片五月| 色色99| 五月天婷婷色| 狠狠色综合网| 人妻22p| 欧美黄片视频在线观看免费| 日本www操操操| 国产精品无套内谢| 日韩欧美aⅴ综合网站发布| 亚洲?V无码专区在线电影| 色综合国产在线观看| 人人操欧美风骚| 91啪啪| 91色色网站| 日韩三级伊人| 亚洲影院成人| 亚洲国产一级黄色视频| 精品无码久久久久久久久果冻糖心| 国产精品诱惑| AV中亚| 无码天堂| 国产毛片毛片4p懂色| 26uuu最新| 天天干天天舔| 日韩乱伦AⅤ| 欧美一级国产一级| 无码WWW免费视频网站| 两性色网| 一区二区三区 日韩欧美| 青娱乐久久艹| 亚洲国产欧美中文永久| 91精品黄在线观看| www.夜夜操| 国产少妇与亚洲av| 色综合中文字幕不卡| 99啪啪视频| 久久精品国产99国产精品亚洲| 亚洲视频小说| 色欧洲97| 欧美久久人体| 亚洲丝袜少妇在线| 亚洲欧洲激情卡通另类文学四射小说网站 | 97视频免费| 国产强奸乱伦第1页| 在线人成亚洲视频免费观看| 亚洲精品国产无码高清| 中文字幕aⅴ在线视频| 久操精品网| 夜夜一区二区| 97超碰无码网| 日韩一级二级三级免费看完整版国语版 | 青青草好吊色| 69视频入口| 成人七区| 巨爆乳肉感一区二区三区竹菊影视| 五月天婷婷成人网| 天堂资源欧美| 老熟女中文字幕高清| 欧洲色综合| 看全色黄大色大片免费视频| www.yeyecao| 久久草在线综合视频| 综合色图,成人综合网| 97看操| 偷拍欧美亚洲| 久久久久九九九九| 中国一级特黄大片护士| 1769精品一区二区三区| 蜜臀久久99精品久久综合| 欧亚第一综合网| 少妇激情AV| 欧美亚洲高清| 精品人妻av在线播放| 婷婷五月天AV| 97超久碰| 久伊人网78| 人人爱人人乐人人操| 强奸乱伦日韩AV| 一二三四日本视频高清| 国产精品丝袜久久亚洲不卡| 四虎AV在线播放| 欧美18 在线观看| 国产亚州日韩欧美看片| 欧美熟妇乱码在线一区| 91美女视频电影| 精品人妻一区二区三区在| 免费在线黄片视频| 夜夜中出国产| 国产免费一区| 一区二区三区国产在线播放| 日韩视频啪啪| 久久久9视频| 激情文学小说一区二区| 成人国产视频在线观看| 自拍偷拍2025在线观看| 五月天色图| 人妻丰满熟妇av无码区蜜桃| 欧美大香蕉久| 大香蕉九九| 久久99精品九九久久久婷婷| 超碰人妻97| 久草网站免费在线观看| 97视频观看| 91九色丰满高潮| 肏逼福利网站| 亚洲人妻av| 久久一本大香蕉| 免费a v| 日本色婷婷| 96久久久精品| 国产1024在线播放| 天天日夜夜爽| 九九九九九九九九九九九蜜桃| 国产午夜在线观看| 婷婷综合久久| 日韩97视频| 九九视频黄色片| 91N欧美| 插插综合网天天影视网| 亚洲欧美综合区自拍另类| 日本天天人人狠狠在线日美女| 啊啊啊男女| 久久五月天婷婷丁香中文字幕| 亚 欧 美 综合| 玖色av| 色哟哟511老熟女| 在线97在线| 亚洲中文字幕在现观看| 伊人久久婷婷| 久久人体一区二区| 国产精品亚洲天堂网址| 观看免费区二区三区二| 日韩综合97p| 国产女人成人精品视频| 加勒比伊人影院| 人人操人人摸人人看人人插| 偷窥自拍亚洲色图| 天天综合网~91| 免费观看啪视频| 无码高清专| 青青青艹在线视频| 操B视频日韩无码| 综精品久久久aaaa| 男人久久天堂| 91操人| 麻豆一区二区三区在线看| 大香蕉一线视频| 精品国产久久乱码| 日韩人妻一二三区视频| 欧美婷婷久久| 国产丝袜欧美在线视频| 美日韩一卡二卡三卡免费人妻精品| 91综合网在线| 久久乐| 国产精品9999| 激情五月天综合网| 风间由美日韩欧美久久| 欧美成人黄网色网站| 精品视频久久区| 国产精品视频一区二区三区八戒| 蜜臀久久99精品| 91香蕉视频在线观看免费| 蜜桃视频一区二区三区在线观看| 国产成人欧美精品在线| 97青青操视频| 日本国产欧美一区三区二区 | 亚洲性爱无码乱伦av| 91网站18+| 日韩精品在线观看网站| 久久久九| 十八禁视频网站| 亚洲色性| 东京热亚洲一区二区| 国产综合久久久麻桃个| 欧美综合站| 99色网| 欧美亚洲影视| 日韩美女啪啪一区| 欧美亚州色的图| 婷婷五月天激情网| 四虎精品亚洲| 92福利社视频| 色99999| 欧美中文字幕一区| 夜夜操青青草| 中文字幕乱偷人妻久久艾草网| 91精品人妻电影| 四季av一区二区凹凸精品小说| 欧美顶级黄片AAAAA在线免费看| 大香蕉日亚洲日本亚大| 国产激情综合| 啊啊啊啊啊好多水| 精品久久久久9999| 国模私拍一区二区三区神乳| 亚洲欧美国产va在线| 欧美成人黄网色网站| 无套后入双马尾| 搡老女人老妇女老妇老熟女怎么读| 日韩熟女无码| 青青草玖玖爱| 91啪啪视频| av亚欧| 久久综合av| 99无码视频| 乱操乱伦AV| 天欧美在线|