色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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)能寫完整程序、但對(duì)指令編碼和標(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 位有符號(hào)位移量。可它內(nèi)部干的事并不簡(jiǎn)單CPU 執(zhí)行到LOOP時(shí)會(huì)一口氣做完三步先把 CX 的內(nèi)容減一結(jié)果寫回 CX然后判斷 CX 是不是等于零如果不等于零就把 IP 加上那個(gè) 8 位位移量跳到目標(biāo)地址繼續(xù)執(zhí)行如果等于零就什么都不做順序執(zhí)行下一條指令。請(qǐng)注意順序是先減、后判這個(gè)順序決定了 CX 初值和實(shí)際循環(huán)次數(shù)之間的對(duì)應(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è)問題后面會(huì)專門用一節(jié)講。把LOOP拆開它其實(shí)等價(jià)于這么兩條指令的組合DEC CX JNZ 標(biāo)號(hào)區(qū)別在于LOOP只占 2 字節(jié)而DEC CX加JNZ rel8要占 3 字節(jié)更重要的是LOOP不修改任何標(biāo)志位而DEC會(huì)實(shí)打?qū)嵉馗膭?dòng) ZF、SF、PF、AF、OF。這個(gè)差異在循環(huán)體依賴標(biāo)志位的場(chǎng)合是致命的后面 2.3 節(jié)會(huì)展開。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é)就被動(dòng)了如果不小心把計(jì)數(shù)器也放在 CX 上循環(huán)次數(shù)立刻失控。第二份兼職是串操作重復(fù)次數(shù)。REP、REPE、REPNE這些前綴指令本質(zhì)上就是以 CX 為次數(shù)、每執(zhí)行一次串操作自動(dòng)減一的硬件循環(huán)。REP MOVSB干的事情和手寫一個(gè)LOOP加MOVSB一模一樣只是更快。第三份兼職是除法除數(shù)。DIV CX、IDIV CX會(huì)把 CX 當(dāng)除數(shù)用這在循環(huán)體里做整數(shù)運(yùn)算時(shí)也得留個(gè)心眼。一份兼職撞上另一份循環(huán)就亂了。我見過最典型的翻車現(xiàn)場(chǎng)是循環(huán)體里調(diào)了個(gè)子程序子程序內(nèi)部為了字符串拷貝把 CX 設(shè)成了字符串長(zhǎng)度返回之后外層的循環(huán)計(jì)數(shù)器已經(jīng)被改成別的數(shù)了外層循環(huán)要么提前結(jié)束要么多跑幾十次。提示寫循環(huán)之前先掃一遍循環(huán)體看看里面有沒有MOV CX、REP前綴、SHL AX, CL這類會(huì)碰到 CX 的指令。有的話要么換寄存器要么進(jìn)循環(huán)體之前壓棧保護(hù)。1.3 為什么不用 DX 或者 BX 來計(jì)數(shù)既然 CX 這么容易被別的指令搶走為什么不用 DX 或者 BX 當(dāng)計(jì)數(shù)器原因有三個(gè)都很實(shí)際。第一個(gè)是指令長(zhǎng)度。LOOP是專門為 CX 設(shè)計(jì)的別的寄存器沒有對(duì)應(yīng)的單指令循環(huán)。你要是用 DX只能寫成DEC DX加JNZ 標(biāo)號(hào)三條字節(jié)起步循環(huán)體稍微長(zhǎng)一點(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é)會(huì)講。2. LOOP 家族的指令細(xì)節(jié)與位移計(jì)算2.1 LOOP / LOOPE / LOOPNE / JCXZ 的差別LOOP不是孤零零一條指令它有一個(gè)家族四條指令各有各的適用場(chǎng)景。把它們的判斷條件列清楚比背定義管用。指令機(jī)器碼執(zhí)行動(dòng)作轉(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ì)在循環(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é)是有符號(hào)數(shù)取值范圍 -128 到 127。這個(gè)數(shù)字不是標(biāo)號(hào)的絕對(duì)地址而是相對(duì)下一條指令的偏移。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跟上面寫的對(duì)上了。反過來如果你在 DEBUG 里看到一條E2 F9怎么推目標(biāo)地址F9H 作為有符號(hào)數(shù)是 -7假設(shè)這條指令在 000EH下一條就是 0010H0010H - 7 0009H。目標(biāo)標(biāo)號(hào)在 0009H。這套計(jì)算沒什么技巧但必須會(huì)因?yàn)檎{(diào)試的時(shí)候沒有源代碼只有機(jī)器碼你得能從字節(jié)反推出跳轉(zhuǎn)目標(biāo)才能判斷跳飛了是跳到哪兒去了。至于 ±128 字節(jié)的限制這是 8 位位移字段的硬邊界跟標(biāo)號(hào)寫在哪沒關(guān)系。循環(huán)體寫長(zhǎng)了LOOP就夠不著。這個(gè)坑后面 4.3 節(jié)有專門的改寫方案。注意不同匯編器對(duì)LOOP短跳轉(zhuǎn)越界的報(bào)錯(cuò)措辭不一樣MASM 一般提示Jump out of rangeNASM 會(huì)說short jump out of range??吹竭@類報(bào)錯(cuò)先量一下循環(huán)體長(zhǎng)度基本就定位了。2.3 LOOP 不碰標(biāo)志位這件事有多重要前面提過LOOP和DEC CX加JNZ的等價(jià)性但有一處不等價(jià)標(biāo)志位。LOOP做的事情只有兩件CX 減一、判斷是否為零全程不動(dòng)標(biāo)志寄存器。DEC CX則會(huì)更新 ZF、SF、PF、AF、OF。為什么不改標(biāo)志這么重要舉一個(gè)具體場(chǎng)景。循環(huán)體內(nèi)部做比較比較結(jié)果保存在 ZF 里然后循環(huán)結(jié)束——如果你用DEC CX / JNZ收尾DEC會(huì)先把 ZF 覆蓋掉你原來比較出來的結(jié)果就沒了。而用LOOP收尾ZF 原封不動(dòng)出了循環(huán)還能接著JE、JNE這就是差別。再比如循環(huán)體里有CMP [SI], AL配合LOOPE做查找如果LOOPE換成DEC CX加JNZ那DEC在LOOPE的位置上會(huì)先動(dòng)標(biāo)志LOOPE賴以判斷的 ZF 就不可靠了。這類 bug 特別隱蔽程序不一定崩但結(jié)果不對(duì)且很可能在不同機(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)體超長(zhǎng)導(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í)模式匯編的入門級(jí)坑第一節(jié)課基本都會(huì)踩一次。XOR AX, AX比MOV AX, 0短一個(gè)字節(jié)而且是公認(rèn)的清零慣用法。這里還順帶把 CF 清了為后面可能的進(jìn)位運(yùn)算留下干凈狀態(tài)。ADD SI, 2這一行在純 8086 上會(huì)被匯編成81 C6 02 00四個(gè)字節(jié)。因?yàn)?8086 的加法立即數(shù)指令只有 16 位立即數(shù)的編碼形式80286 之后才引入了 8 位立即數(shù)的緊湊格式。如果你想讓代碼更短可以寫成兩條INC SI各占一字節(jié)省兩個(gè)字節(jié)但執(zhí)行時(shí)間反而更長(zhǎng)——兩條指令的取指和譯碼開銷抵不過一次四字節(jié)指令。這個(gè)取舍在現(xiàn)代 CPU 上意義不大但在老機(jī)器上曾經(jīng)是值得爭(zhēng)論的話題。3.2 逐條拆解求和循環(huán)從NEXT標(biāo)號(hà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。對(duì)0119H。這個(gè)數(shù)字在 DEBUG 里可以用D DS:0直接看數(shù)據(jù)段驗(yàn)證。數(shù)組占 12 個(gè)字節(jié)TOTAL緊跟在后面偏移是 000CH值是19 01小端序低字節(jié)在前??吹竭@個(gè)序列程序就對(duì)了。有個(gè)地方容易出問題ADD SI, 2的步長(zhǎng)必須和數(shù)據(jù)類型匹配。數(shù)組是DW定義的每個(gè)元素兩個(gè)字節(jié)所以步長(zhǎng)是 2。如果定義成DB步長(zhǎng)就得改成 1如果寫錯(cuò)了讀到的是相鄰兩個(gè)字節(jié)拼起來的數(shù)結(jié)果會(huì)莫名其妙。這類錯(cuò)誤在調(diào)試時(shí)表現(xiàn)為結(jié)果看著像個(gè)正常數(shù)但就是不對(duì)而且往往前幾個(gè)數(shù)還是對(duì)的后面才開始飄。提示累加類程序的經(jīng)典自檢方法是拿第一個(gè)元素單獨(dú)跑一次——把 COUNT 改成 1看結(jié)果是不是等于第一個(gè)元素。如果是說明尋址和累加邏輯沒問題再把 COUNT 改回去。這個(gè)手法能把邏輯錯(cuò)和步長(zhǎng)錯(cuò)快速區(qū)分開。3.3 用 DEBUG 盯住 CX 的每一次變化代碼寫完編譯通過不等于程序是對(duì)的。匯編這門東西靜態(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 就會(huì)變成 0005IP 跳回NEXT。真正高效的調(diào)試方式是G加斷點(diǎn)。在LOOP指令的地址上下斷點(diǎn)反復(fù)G每停一次看一次 CX能在一分鐘內(nèi)確認(rèn)循環(huán)次數(shù)對(duì)不對(duì)-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)的人幾乎都會(huì)困惑一下。我在教別人調(diào)試循環(huán)的時(shí)候一般會(huì)讓他們做一件事把 CX 的每次變化抄在紙上六次一輪和手算的累加過程對(duì)一遍。聽起來笨但比對(duì)兩三遍之后對(duì)先減后判的理解就從概念變成肌肉記憶了。3.4 嵌套循環(huán)里 CX 的保護(hù)單層循環(huán)用 CX 天經(jīng)地義一進(jìn)嵌套就麻煩——CX 只有一個(gè)內(nèi)外兩層都要計(jì)數(shù)怎么辦三種方案各有適用場(chǎng)合。方案一壓棧保護(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)里不算便宜。但它的好處是絕對(duì)可靠不用擔(dān)心內(nèi)層代碼有沒有動(dòng)過 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會(huì)修改標(biāo)志位。內(nèi)層循環(huán)依賴標(biāo)志位的場(chǎng)合要小心。方案三計(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)體的長(zhǎng)度和調(diào)用頻率。內(nèi)層循環(huán)體短、跑得次數(shù)多選方案二內(nèi)層循環(huán)體長(zhǎng)、邏輯復(fù)雜選方案一求穩(wěn)寄存器實(shí)在不夠用了才考慮方案三。嵌套層次超過兩層的時(shí)候建議直接把計(jì)數(shù)器都放內(nèi)存代碼可讀性比那點(diǎn)性能重要得多。三層嵌套的壓棧彈棧順序一旦寫錯(cuò)出錯(cuò)現(xiàn)場(chǎng)會(huì)非常難查——程序不崩只是結(jié)果不對(duì)而且只在特定輸入下才不對(duì)。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 位無符號(hào)數(shù)里等于 FFFFH也就是 65535不等于零于是跳轉(zhuǎn)。接下來每次減一要走 65535 次才能回到 0。加上第一次總共 65536 次。這個(gè)坑在兩種場(chǎng)景下最容易觸發(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ù)長(zhǎng)度等于 B 減 A。如果 B 和 A 相等長(zhǎng)度是 0LOOP就開始空轉(zhuǎn)。這類運(yùn)算的結(jié)果最好在進(jìn)循環(huán)之前用CMP CX, 0加JE判一下。注意JCXZ只是在入口判一次如果 CX 是在循環(huán)體內(nèi)部被改到 0它救不了你。所以這道防線只對(duì)初值為零有效。還有一種情況更隱蔽CX 的高位被別的東西污染了。比如你本來只想用 CL 存?zhèn)€值結(jié)果上面某條指令動(dòng)了 CHCX 整體變成 0x0500 之類LOOP就會(huì)跑 1280 次。排查這類問題的方法是單步到LOOP之前用R命令看 CX 的完整 16 位值而不是只看低字節(jié)。4.2 循環(huán)體里偷吃 CX 的指令CX 被循環(huán)體內(nèi)部的指令改掉是第二大高頻問題。表現(xiàn)形式有兩種一是循環(huán)次數(shù)變多程序耗時(shí)明顯拉長(zhǎng)二是循環(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這種寫法會(huì)把 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)體寫長(zhǎng)了LOOP的 8 位位移字段裝不下匯編器直接報(bào)錯(cuò)。這個(gè)錯(cuò)誤很好認(rèn)換一種寫法就能過去NEXT: ; 很長(zhǎng)的循環(huán)體 DEC CX JNZ NEXTJNZ用的是 8 位位移跟LOOP一樣有 ±128 的限制換成它不一定解決問題。要徹底擺脫距離限制得用JMP類的近跳轉(zhuǎn)配合條件判斷NEXT: ; 很長(zhǎng)的循環(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í)候按癥狀對(duì)號(hào)入座比從頭讀代碼快?,F(xiàn)象可能原因排查動(dòng)作處理辦法程序卡住不動(dòng)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)號(hà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é)果偏差指針步長(zhǎng)與元素寬度不匹配檢查ADD SI, n的 nDW用 2DB用 1這張表不是窮舉但覆蓋了我這些年實(shí)際遇到的八成場(chǎng)景。真正遇到表上沒寫的問題通用的排查順序是先看 CX 初值再看循環(huán)體里有沒有指令碰 CX最后看標(biāo)志位有沒有被意外覆蓋。這三步走完問題基本就浮出來了。5. 進(jìn)階塊復(fù)制、循環(huán)展開與 REP 前綴5.1 手寫塊復(fù)制循環(huán)數(shù)組求和是熱身塊復(fù)制才是循環(huán)真正的日常用途。需求簡(jiǎ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ù)制會(huì)把還沒讀的源數(shù)據(jù)覆蓋掉。這時(shí)候必須改成從高地址往低地址復(fù)制也就是指針先指向末尾每次減一。這個(gè)方向問題在內(nèi)存管理類的程序里出現(xiàn)頻率不低而且癥狀很怪——復(fù)制出來的數(shù)據(jù)有一部分是對(duì)的另一部分是錯(cuò)的看著像隨機(jī)損壞。5.2 REP 前綴把 CX 交給硬件REP MOVSB這條指令把上面整個(gè)循環(huán)體壓縮成了一行而且速度更快原理就在 CX 身上。REP的本質(zhì)是一個(gè)硬件級(jí)的循環(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就會(huì)從高地址往低地址搬結(jié)果和預(yù)期相反。我一般習(xí)慣在每條REP之前都寫一句CLD雖然多數(shù)時(shí)候是多余的但省得排查。第二SI 和 DI 的初值要落在正確的段里。MOVSB默認(rèn)用 DS:SI 做源、ES:DI 做目的ES 段寄存器必須提前設(shè)好否則會(huì)寫到一段莫名其妙的內(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 歸零做完之后想用原來的長(zhǎng)度得提前備份。注意REP MOVSW一次搬一個(gè)字比MOVSB快一倍前提是長(zhǎng)度是偶數(shù)、源和目標(biāo)地址都是字對(duì)齊的。長(zhǎng)度是奇數(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)在要不要這么做得看具體場(chǎng)景。現(xiàn)代處理器有分支預(yù)測(cè)和指令緩存LOOP這類短小的循環(huán)控制指令很可能被預(yù)測(cè)器提前處理掉展開帶來的收益未必明顯反過來代碼體積變大會(huì)擠占指令緩存在某些場(chǎng)景下反而更慢。所以我的原則是除非實(shí)測(cè)發(fā)現(xiàn)這個(gè)循環(huán)是熱點(diǎn)否則不主動(dòng)展開??勺x性的損失是實(shí)打?qū)嵉氖找鎱s要打了問號(hào)。真要追求塊復(fù)制的極致性能現(xiàn)代的做法是用單指令多數(shù)據(jù)擴(kuò)展一次搬十六個(gè)甚至六十四個(gè)字節(jié)那已經(jīng)是另一套指令體系了跟 8086 的LOOP不在一個(gè)層面上。就 8086 這個(gè)平臺(tái)本身而言這幾個(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í)際動(dòng)手寫下來我對(duì)LOOP和 CX 這套機(jī)制的體會(huì)是它們的設(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)出哪些指令會(huì)碰它、哪些子程序可能動(dòng)它畫完再動(dòng)手。這個(gè)習(xí)慣幫我省掉的調(diào)試時(shí)間比任何優(yōu)化技巧都多。真要說有什么值得反復(fù)強(qiáng)調(diào)的那就是初值為零這一條——JCXZ多寫一行能省掉一下午。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
麻豆黄色五月天| 麻豆一区在线| 爽极品影院| 国产区在线| 亚洲激情色片 | 中文久久一区| 欧美天天插| 国产精品视频一区二区三区八戒| 欧美黑人熟妇精品91| 1024午夜激情男人的天堂| 91欧美高清| 国产激情久久| 另类 日韩 熟女| 久久精品国产亚洲妲己影视| 午夜精品久久99蜜桃的功能章节| 精品丰满熟妇人妻一区| 九九九九九九视频| 91久久国产综合精品| 久久精品人体| 精品女人999| 激情婷婷| 农村妇女一级二级三级视频| 婷婷丁香熟妇综合网| 99精品视频在线观看免费| 久久精品国产亚洲AV清纯| 久久久亚洲精品中文字幕人妻| 国产久久久久影院老熟女| 欧美专利1区2区3区4区5区免费| 色婷亚洲五月在线观看| 中文字幕黄色片| 夜嗨影院| 自拍鲍鱼一区在线高清观看免费| 婷婷久草一区二区三区| 亚洲……91| 五月丁香啪| 啊视频在线| 国产67194| 免费一级毛片在线视频观看| 日韩欧美女优电影| 91欧美另类| 北野未奈加勒比av| 少妇久久久久久| 91啪啪| 亚洲97在线| 呦呦一区| AV天堂国产| 欧美日韩国产高清在线一二三区 | 亚洲欧美日韩制服另类| 亚洲天堂五月天国产| 久久精品国产Aⅴ| 夫妻天天操岛国视频| 久久东京热久久| 亚洲色交| 人人玩人人添人人澡免费| 999精品国产高清一区二区| 亚洲综合影院| 亚洲综合中文字幕有码| 五月婷视频| 红桃视频高潮| 襙一襙| 欧美午夜一区二区三区| 97电影院超碰| 超碰欧美在线欧美| 欧美色涩| 嗯嗯嗯嗯啊啊啊好紧好大| 大香蕉欧美伊| 在线视频免费观看午夜| 女人高潮大叫一级毛片| 亚洲国成人情色好看电影| 超碰久久精品| 国产精品免费1区2区视频| 日欧亚洲二三区大片不卡| 国产成人无码久久精品| 国产美女91视频| 98福利在线视频| 丝袜加勒比| 日韩字幕一区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 热无码中文亚洲H一道本一区二区| 日本十八禁免费看污网站| 国产精品岛国片在线观看| 午夜精品久久久久久久男人的天堂| 97欧美精品综合| 久久久久久久久国产| 女生久久网| 18禁精品网站在线看| 色色色色网站| 青操影院| 免费一级黄色录像影片| 99热97| 日韩中文字幕宗合在线| 日本视频在线中文字幕| 九热视频| 亚洲偷拍欧美激情| 中文字幕高清精品一区| 激情丁香五月| 久热精品在线| 女人双腿搬开让男人桶| 精品国产72| 成年人网站在线免费观看| 97国产成人精品免费视频| 天天日天天射天天干| 99re99| 婷婷99| 青青草好吊| 欧美激情性久久久久久| 国产传媒日本欧美专区| 天天射夜夜操| 亚洲日韩肥臀视频在线观看| 欧美亚洲天堂| 俺去久久| 久久狠狠色噜噜狠狠狠狠97| 青青网三级视频| 99少妇| 亚洲成人久久一区二区| 伊人嫩草| 玖玖婷婷五月天| 人妻少妇久久| 国模少妇一区二区三区| 风骚少妇视频中文字幕| 欧美疯狂做爰xxxx| 久操网址| 日日干男人的天堂| 五月丁香六月激情综合| WWW.操逼.COM| 久久只有精品一区二区三区| 丁香九月 婷婷| 亚洲s在线观看| 欧美亚洲天堂| 青娱乐大香蕉| 丁香五月综合| 亚洲情色欧美| 牛牛久久国产精品视频一二三 | 亚洲码和欧洲精品激情系列| 天天激情综合站| 国产亚洲欧洲在线观看| 做爱A级亚欧| 蜜桃狠狠色伊人亚洲综合| 操逼啊啊啊91| 一区二区三区高清| 啊啊啊啊啊啊啊在线| 岛国片国产成人亚洲播放| 中亚黄色三级大片| 丁香五月激情网| 天天噜| 91欧美偷拍| 久久亚洲欧美中文字幕国语| 欧美伦乱| 日本免费一区二| 高清国产成人无码| 国产一区二区精品久久久不卡蜜臀| 99热最新| 日韩强奸av| 天天综合麻豆视频| 青青青国产| 国产大学生口爆吞精合集| 欧美综合综合| 亚州综合AⅤ| 大香蕉黄色一区| 清纯唯美亚洲综合| 成人一级二级| 亚洲欧美另类少妇精品| 99精品久久久久久久婷婷蜜桃| 亚洲欧美伦综合| 亚洲AV不卡在线观看尤物| 日韩av影片在线观看| 美女黄站| 久久精品无码熟妇一区二区三区视频导航 | 一级毛片久久久久久久女人18| 午夜精品久久久99热蜜桃的功能特点| 亚洲成人精品久久久| 超碰人人草| 国产高清精品一区二区三区毛片 | 欧美精品1区2区3区| 玖玖综合网| 91草草草| 神马视频久久久久久| 95自拍视频在线观看| 青娱乐91| 久久久久九九九九九| 精品传媒在线一区| 亚洲男人天堂2017| 97干色| 四虎影视国产精品| 中文熟女五十乱码在线| 亚洲国产一级中文综合久久天堂在线免费观看| 久久久人体| 狠狠穞A片一區二區三區| 亚洲欧洲精品视频发布| 极品欧美一区二区三区| 澳门黄片一香蕉视频| 91性网| 日韩欧美麻豆 | 黄片视频观看| 隔壁邻居波多野结衣中文字幕| 操逼视频国产无套| 1级午夜影院费免区| 国产中出内射一区二区| 久久色网| 白丝被操91| 97欧美精品| 欧美se综合| 伊人9| 亚洲性少妇| 国产熟妇一区二区| 国精综合一二三区影视| 日韩欧美丝袜诱惑| 超碰性爱97| 91伊人大香蕉| 亚拍在线| 春色综合免费| 青青草依人大香蕉| 婷婷综合伊人一区| 免费的很黄很污的全部视频| 午夜一区二区三区国产| 囯产操逼片| 成人八戒网站| 九九九九9999| 欧美成人一区二区| 亚洲一区二区三区在线激情| 伊人成人中文字幕久久网| 91大学精品激情戏| 夜夜骑操视频| 中文字幕一区 二区三四五 区日 日骚| 97国产中文| 999九九九九国产动| 九色 人妻 大香蕉| 婷婷激情丁香| 91制服丝袜| 久久精品高清无码一区| 亚洲妇色| 超碰爽人妻熟女Av| 情色五月天网| 欧美桃色网| 日躁天天爽爽| 翔田千里AⅤHD无码| 伦伦成年午夜免费视频| 97综合在线| 欧美有码亚洲中文字幕一区二区三区四区| 91jk色拍| 热热色中文无码| 亚洲密乳AV| 欧美黄片视频在线观看免费 | 色玖玖| 啊a一区在线| 色综合超碰超| 欧美99999| 欧美老妇曰批的视频| 国产一区二区av综合| 国产欧美日韩在线观看麻豆传媒公司 | 久久宗合97| 亚洲色图综合| 亚洲日韩成人性爱视频| 中文字幕丝袜美腿| 欧美色九九| 国产高清免费不卡av| 性爱久久| 精品人妻一区二区三区四区| 欧美日韩国产三级黄色| 在线观看AV不卡| 伊人四虎综合| 九月激情婷婷| 最新AVzaixian| 无码九九九九| 人人操人人操人人操人人操人人操人人人11.CM| 久久精品国产亚洲AV高级北京| 天天日少妇逼AV| 美女让帅哥通她小鸡鸡| 欧美性爱第一页久久| 九九色热| 91久久精品美女高潮喷水| 国产激情视频一区区三区| av在线一区二区三区| 爽爽淫人网| 草B在线| 人妻一区二区三区视频| 午夜后入| 香蕉热人人精品| 天堂日本亚洲欧美| 热思思免费视频| 久久99热这里只频精品6学生| 欧美在线第五页| 国产精品极品美女视频| 大香网伊人久久综合网eew| 999久久久| 夜夜中出国产| av网站免费线看| 91久热这里只有精品| 久久日本熟妇熟色一区| 丝袜AV一二三区| 男人天堂2030| 国产成人资源| 中文字幕美女91| 福利风月五月天影院| 欧美中文综合| 日本天堂网| 欧美18老人禁| 精品视频专区| 国产精品无码av在线| 欧美熟女妇同| 日韩精品 视频一区二区| 麻豆激情综合| 国产亚洲日本精品在线| 中文字幕一区二区无码成人| 一区二区激情国产熟女| 日韩无码精品综合久久| 亚洲一区二区 麻豆传媒| 操操操五月天婷婷丁香影院| 亚洲天天精品| 999日韩中文精品观看视频。| 熟妇女伦乱视频| 五月天激情小说网| 丁香色狠狠色综合久久小说| a人欧美综合天堂麻豆| 亚洲av无码国产精品字幕| 国产天天看| 超碰成人最新最好看| 视频黄站| 日本特黄f c2| 无码高清操逼网址| 99re99在线视频| 91粉芽高清在线一区二区| 国产精品白丝| 97免费视频在线观看视频| 国内自拍 日韩激情 99| 青娱乐福利99| 久久久精品,3| www老逼91| 国产91啪| 美女9118禁| 欧美色图亚州激情| 一块操欧美性爱| 欧美亚洲激情| 亚洲加勒比色图| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 黑丝自慰喷水网站| 日韩小电影| 青草香蕉网| 国产精品午夜高潮呻吟久久av| 无码精品一区二区三区潘金莲| 精品人妻一区二区三区免费视频| 超碰97网址| 乱伦系列一区二区| 操啊国产| 2017天天操| 大香蕉色欲AV| 亚洲天堂女优在线| 欧美色图天堂在线| A片 AV一级在线播放观看免费| 操逼操逼操| 亚洲色图欧美色图综合| 91嫩草欧美| 午夜天堂精品久久久久91| 萌白酱自拍视频| 国产91影院| 啊啊啊啊好疼| 天美欧美国产| WWW4虎| 人妻精品视频一区二区| 亚洲综合另类小说色区亚洲成av人片在www | 久久久久亚洲Av无码专区老牛影视 | 久久 久久国内精品亚洲| 青娱乐导航AV| 操久久久久久| 亚洲色图欧美视频| 国产午夜无码片在线观看影视| 蜜臀一区二区三区在线 | 久综合国内精品自在自线| 亚洲日韩美女丝袜美腿人妻视频| 美女爽到高潮91| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 国产精品伦理| 午夜亚洲| 久久这里只精品| 呻吟 欧美 日本 中出| 四虎AV影视国产精品亚洲精品| 夜夜爽爽爽| 无码又爽又硬又激情免费视频| 国产福利小视频高清在线观看| 中文AV制服乱伦| 欧美激情一区| 91精片| 亚洲av噜噜噜噜噜噜| 天啪| yw尤物av无码点击进入麻豆| 日本一级特级毛片视频| 放黄片放3级黄片没穿衣服| 欲香欲色综合天天伊人| www欧美91| 97干色| 欧美综合天天| 日本影视久久免费| 亚洲日本激情| 黄色网址在线免费观看| 91精品国产高清久久久久久,亚洲成人| 青娱乐欧美激情一区二区| 国产精品不卡一区二区三区av| 久久91| www熟女乱伦com| 性videos欧美熟妇hdx| 翔田千里无码一区| 午夜亚洲国产理论秋霞| 丁香五月综合| 欧美黑人性猛交91| 美女啪欧美一区| 精品久久艹| 久久久月天| 欧美天天综合在线| 无码一区二区精品视频久久久春药| 日韩精品在线放| 精品无码不卡视频| 在线黄页看毛片| 岛国人妻少妇av在线观看| 啊啊啊啊啊啊啊啊啊啊在线观看| 日日日日做夜夜夜夜做无码97| 天美传媒精品久久视频| 91网九色蝌蚪操熟女| 天天弄天天操| 亚洲精品丝袜-不卡成人免费……| 天天看综合网| 日本中文字幕熟妇| 激情欧美97| 高清国产成人无码| 日韩AV电影网站| 亚洲欧洲色情高清| 亚洲色天| 日韩性爱网址| 免费看污网址| 91精品国产91久久青草 | 欧美中字不卡| 亚洲精品免费中文字幕| 婷婷五月在线视频| 97视频新免费| A 天堂| 亚洲 欧美日韩 另类| 亚洲有薄码区日本系列中文字幕| 欧美一区二区三区黄色影视| 国产强奸乱伦无码视频| 动漫区日韩区欧美区| 天天操福利视频综合网站| 大香蕉乱级| 中文字幕 人妻不满 在线视频| 欧美 亚洲 另类 综合| 视频不卡中文字幕| 啊v视频在线观看| WWW.加勒比人妻一区不卡.com| 春色综合网| 欧美国产伊人久久久久| 欧美日动态视频| 亚洲成人激情小说视频| 天天干,天天日| 97国产伦理| 岛国1区2区3区在线观看| 亚洲男人bt天堂| 国产日韩中文字幕欧美| 日韩无码黄色片| 97干色天堂| 97操| 日本一区二区三区欧美日韩中文字幕| 成人性交午夜免费片| 成人国产精品三级A片| 东京热大香焦| 欧美十八禁导航成人| 九九久久国产精品| 性爱视频免费网址| 超碰97资源中文字幕| 亚洲欧美黄| 久久丁香| 久久九色| 天天操女人| 啪啪视频免费在线观看| 97玖玖人妻| 亚洲一卡二卡在线免费| 75大香蕉| 青娱乐国产精品| 91伊人久久在线| 亚洲无码久久久久久久| 亚洲欧美内射| 志村玲子视频一区二区| 91操熟女| 久久 亚洲 日韩 人妻| 秋霞网—男女啪啪亚洲免费体验区| 亚洲AV资源| 小视频国产| 久久美国毛片| 五月丁香久久| 免费人成毛片乱码| 97视频www| 黄片不用下载在线观看| 日本媚薬中文字幕在线| 免费看美国人人爽,人人操| CCYY草草影院地址入口| 国产热av| 午夜呻吟欧美| 乱伦AVxx| 午夜毛片亚洲精品片国产久久久| 麻豆AV96熟妇人妻| 丁香九月激情啪| 综合网亚洲| 久久久久密臀视频| 久久激情网| 欧美传媒| 精品人妻少妇| 国产成人主播| 97人人草| 国模不卡| 12一15性XXXX粉嫩国产| 曰本道人妻久久久在线不卡色视频| 天天天天干| 日韩欧美成人综合在线| 香蕉精品二区二区| 在线观看视频91| 九九九九九九九精品视频| 欧美亚洲素人制服精品| 欧美情色亚洲| 伊人精品国产| 日韩伦理视频| 欧美激情综合| 伊人久操| 国产精品露脸在线观看| 中文字幕一区二区三区人妻不卡| 性色国产东北露脸精品视频| 99热这里只有精| 日本精品无码三级网站| 天天做天天爱夜夜爽毛片试看| 人妻无码视频一区二区三区久久| 日本不卡码黄色| 激情AV| 青娱乐国产精品| 亚洲色婷婷久久91| 日夜精品| 欲色综合| 超碰色美女| SUV一区二区在线看| 亚洲精品久| 色综合99| 日本久久99| 欧美午夜一区二区三区| 奇米四色影视777久久久| 亚洲人妻久久| 欧美色图电影| 男人天堂新| 中文字幕一区二区三区四五区| 日本淫穴在线| 精品96久久| 精产国品一区二三产品| 麻豆久久久久久久久丝袜| 首页亚洲国产高跟丝袜诱惑视频 | 久久美国毛片| Aa东京男人的天堂| 欧美在线 亚洲| 国产av热热色| 一级黄碟| 神马久久久久久久久| 欧美熟女逼久久久久久| 神马九九九| 青青草久草AV| 小电影欧美91| 99热婷婷一区二区三| 怡红院久久老司机| 亚洲精品人体| 91啦人妻| 男人天堂黄片| 国产97视频免费观看| 国产麻豆福利av在线播放| 亚洲最新中文字幕免费| h无码动漫在线观看| 26uuu国产成人综合| 国产三级中文有码在线视频| 97人人模人人爽人人| 狠狠色婷婷7777久| 在线黄页看毛片| 色噜噜人妻av 中文字幕| 精品久久久av| 精品一二三区四视频| 黄久在线| 九九九九AV| 国产无码三级视频在线观看| 婷婷去俺也去六月色| 多乙久久久久久| 亚洲人妻av| 亚洲中文字幕妇伦久久| 欧美激情久| 亚洲做性| 一区AV| 熟女字幕| 久热伊人99re| 大屁股国产在线视频| 亚洲黄色电影| 一级做a爰片性色毛片久久| 太久视频| 好淫网一二三视区| 91影视亚洲| 久久伊人影院| 欧美精品99久久久**| 日本色婷婷| 超碰综合色| 78操B| 国产最新小视频在线播放下载| 日韩性爱小视频在线观看| 日韩欧美女优电影| 啊啊啊啊啊好舒服视频| 欧美激情综合| 男男H黄动漫啪啪无遮挡网站| 男人的天堂2010| 久久久久无码一妻区| 97亚洲中文| 国产av波波国产精品| 婷婷色网| 四虎影视永久在线观看精品免费网站 | 亚洲一区在线观看欧洲| 丁香五月婷婷基地| 欧美青青视频| 中日韩免费看男女操逼大全| 国产精品熟女乱伦| B049AV在线播放| 色综合av综合久久| 伊人久久婷婷| 天天在线91| 在线观看无码三级少妇| 美女人妻色网站| 日本在线999| 韩国一级AAA| 情色av电影| 东京热男人天堂| 91小视频| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | caopeng97| 欧美九九九| 熟女人妇一区二区三区| 久9久9精品| 欧美gv在线观看| 中日无幕一二三四区| 蜜臀网 一区| 亚洲图片激情综合另类| 久久九九一区二区三区成人| 夜夜黄| 插欧洲美女欧美精品| 日韩一级二级三级免费看完整版国语版 | 国产强奸超碰AV| 91精品国久久久久久无码| 超清福利精品视频在线| 久热精品色情| 国产三级在线现体验区| 亚州精品丝袜-不卡成人免费| 亚洲开心网| 99热成人| 懂色aV一区二区天美传媒| 屌色在线97视频| 99热销国产这里有精品| 色情综合网| 91色欧美| 国产原创精品| 国内精品嫩模A∨私拍小视频| 人人手机欧洲亚洲国产人妻| 新亚洲无码| 欧洲射精91| 国模私拍一区二区三区神乳| 91精品成人| 人人艹亚洲| 久久高清无码夜夜操| 口爆吞精在线观看| 91亚洲最新在线| 95人妻爽爽人人做人人澡 | 91欧美在线| 久久精品性| 日本免费一区二区不卡| 秋霞一级A片黄色视频| 蜜臀99999| 日本成人电影资源网| 探花精品 一区二区| 嗯啊啊啊轻点视频| 亚洲日本韩国在线| 中文字幕亚洲热播人妻| 亚洲国产精品无码AV久久| 97看操| 久久激情五月| 午夜福利成人免费视频| 无码人妻精品一区二区三区99不卡 | 快点操死我| 久久精品国产精品亚洲艾通辽熟妇 | 懂色AV蜜臀无码精品APP | 亚州91| 99久久精品无码一区二区毛片免费 | 亚洲s在线观看| 2019男人的天堂| 26uuu国产免费观看| 久久av色| 亚洲欧洲激情卡通另类文学四射小说网站| 不卡在线一区,精品一区二区三区中| 日夜精品| 97这里都是精品| 可能人人看人人摸| 亚洲熟女一区二区| 97玖玖人妻| 高清成年美女黄网站免费大全| 国产丝袜一区二区三区| 日本91白丝| 午夜福利激情在线视频| 婷婷8月天青娱乐| 精品一区二区三区最新| 亚洲五码一区二区三区| 日韩猛交| 无码免费在线观看黄色片| 天堂亚洲精品久久老牛| 国产成人网址| 麻豆国产视频精品观看| 亚洲极品| 久久精品一区| 色狠狠色| 狠日操| 欧美高清第一页| 久久精品国产久精国产| 久超碰在| 911粉嫩人妻| 精品欧美老熟女一二区| 久久久噜噜噜久久人妻| 性九九九九九九| 色臀aV| 久久久久久中文字幕中文字幕最新| 国产一区二区三区久久久精品| 久久内射| 天堂av最新电影网| 精品无码人妻一区二区免费蜜桃| 亚洲午夜av| 高清国产成人无码| 亚洲爽图| 天天躁日日躁狠狠狠躁| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 天天爽夜夜欢视| 97干在线| 日本在线激情一区二区三区| 亚洲国产精品有声| 亚洲熟女乱色一区二区三区| 九九热九九| 久久99久久99精品天美传媒棢·纸:.| 求求你操操我| 韩国三级三级BD在线| 欧美视频在线第3页| 国产成人综合网| 久久香蕉综合一本到3atv| 亚洲欧美自拍偷拍| 国产精品熟女九色九色蜜臀| A级国产欧美激情在线| 亚洲情色欧美| 亚洲天天综合| 日本一区二区不卡| 中文字幕99999| 欧姜老司机| 九t超碰| 农村少妇久久久久久久| 风韵犹存大大大大香蕉 | 色区久久| 丁香六月啪啪| 日本熟妇一区二区三区| renqi久久久久久久久久久久| 色999亚洲人成色| 五月天婷婷久久| 五月婷婷综合网| 91狠| 97久久超碰国产网站| 精品国产99| x97av| 99热婷婷一区二区三| 91成人18| 欧美综合娱乐久久| 无码视频黄色网战| 久久男人的天堂国产| 在线观看成人性爱免费小视频| 欧美在线伊人色| 日本欧美m v精品网站加| 精品视频一区二区| 天堂69亚洲精品中文字| 狠狠操狠狠爱| 人人色人人射人人妻| 中文色综合| 国产懂色精品国产av| 五月婷婷六月天| 成人熟女视频一区二区三区| 亚州男人的天堂| 国产区在线| 国产探花日韩援交| 综合激情婷婷| 青青草精品| 欧中美三级一区二区三区| 天天日天天干天天操| 干干干天天| 天天91~综合入口| 日韩中文字幕宗合在线| 欧美色图电影| 黑人操一区二区| caopeng97| 欧美洲精品一级| 88xx成人精品视频| 欧美日韩性爱视屏免费看了| 密臀在线免费观看| www.人人摸在线视频| 日熟女| 久久99久久99久久99人受| 成人热久久精品| 91观看 国产白丝| 亚洲精美粉嫩嫩泬在线观看| 天天看片天天爽| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 俺去啦俺来也久久综合| 超碰9 7女人| 天天做日日爱夜夜爽| 午夜无码熟妇丰满人妻| 国产福利av精彩对白| 亚洲欧洲第二视频在线观看色图| 久久久久亚洲?V片无码V| 91劲爆| 国产偷拍网站| 超碰狠狠操| 久久精品无码不卡| 性爱视频无打码在线观看| 欧美图片偷拍| 欧美九九九| 黑人黄片在线免费观看| 91超碰碰在线| 亚洲国产精品成人综合| 热久久精品| 欧美姓爱综合网| 影音先锋国产精品| 日韩 女同 综合| 亚州免费啪啪视频| 色九九九九| 亚洲在线网站| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 青娱乐福利99| 欧美中文字幕男人天堂久久精品| 欧美性爱一区二区三区| 伊人久久艹| 国产尤物在线三区| 欧美性生活综合| 亚洲97网站| 操逼网站视频漫画国产| 亚洲国产中文字幕| A 天堂在线观看视频| 中文字幕乱偷人妻久久艾草网| 少妇人妻好深太紧了vr91| 日本加靬比网站发布页| 亚洲熟女乱色一区二区三区| 秋霞男人网| 久久久久久亚洲Av无码| 97精品久久久久久久| 8x福利精品第一福利视频导航| 亚熟在线| 在线观看高清AV| 亚州色阁| 欧美一级做a爰片免费视频| 久久是精品| 99热99在线| 欧美九九九九九| 国产四虎在线| 97人人夜夜精品视频| 伊人久久蜜月| 手机在线观看不卡无码av| 久久久精品九| 欧亚综合一卡二卡中文字幕| 日韩成人高清一区二区| 久久九七| 精品毛片久久久精品毛片| 麻豆天天躁天天揉揉AV| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日本性爱少妇| 国产97av| juliaann精品熟女一区| 啪啪啪东京| 超碰9 7女人| 中文字幕老熟妇黄色视频| 国产精品直播在线观看直播| 亚洲AV无码久久精品蜜桃小说| 逼逼逼逼操操操操操操操操操午夜剧场 | wuyechaopeng| 大香蕉宗合网在线| 免费观看性欧美一级| 亚洲色图第四色| 中文啪啪视频| 欧美强奸乱能| 亚洲欧洲激情卡通另类文学四射小说网站 | 撸撸成人在线视频| 丁香五月婷婷基地| 嫩草美女久久| a啊啊啊啊啊啊啊啊一区二区| 刺激性视频黄页| 97欧美性爱| 国产精品人妻无码久久久老鸭窝| 2026国产精品视频| 亚洲有码 视频一区| 美国人人操人人操| 五月丁香激情四射| 国产精品69久久久久孕妇欧美| 中日无幕一二三四区| 国产一级作爱毛片| 色哟哟 日韩精品| 麻豆色99999| 超碰这里只有精品| 少妇二级| 伊人五月天| 95自拍视频在线观看| 男人的天堂2019| 久操视频在线| 好舒服视频| 日韩精彩免费| 天天综合色| 激情接吻视频久久久久久| 婷婷伊人五月| 神马午夜久久| 97亚洲自在精品在线观看| 性色国产东北露脸精品视频| 夜夜爽爽爽| 一级啊性爱在线视频| 一本久道在线综合视频| 九九九九热| 中文字幕一区二区无码成人| 久热大香蕉网站| 国产精品欧美激在线| 美女啊啊啊啊啊啊啊| 色999亚洲人成色| 黄色性爱网网| 国产麻豆福利av在线播放| 成人自拍三级在线观看| a级免费在线观看| 97资源久久| 国产sv美女内射| 欧美综合综合| 欧美日韩精品青青| 超碰久久综合| 夜夜嗨TV| 老鸭窝在线视频播放| 久草久日| 日韩精彩视频| 视频在线观看青青99国产| 日产123区精品免费观看| 日韩丝袜高跟制服在线观看| 日本日日色视频| 亚洲中文字幕日产无码久久| 日本一区二区亚洲综合| 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | 色激情综合网站| 亚洲综合另类| 极品销魂美女一区二区| 久久亚洲中文字幕视频| 四虎午夜影院| 天天激情干| 近亲乱伦一区二区| 女人午夜视频777| 一区二区三区视频在线观看免费| 久久99午夜精品一区人妻| 亚洲砖码砖专无区2023| 免费一级毛片在线视频观看| 伊人色综合网电影| 色九月婷婷| 伊人久久青青草| 欧美白嫩在线放| 久久爱超碰网| 久久↗↗| 欧美亚洲手机在线| 国产精品白领在线观看| 无码外流操逼视频| 欧美视频边做饭边橾| 亚洲夜夜欢无码一区二区| 91视频国品一二三区| 久极品在线观看| 久草在| 亚洲成人AB| 黄片免费日韩| 老熟女乱子伦中文字幕一区二区| 久久久久国产一区二| 这里有精品| 久久久久久性爱视频| 小骚逼被操的爽不爽| 精品丰满熟妇人妻一区| 久久久久久九九九九| 国产精品视频自拍在线| 留下AⅤ黄色片| 97人肏| 日韩视频小说在线观看| 9久久久久久| 翔田千里无码一区| 久久久久久AⅤ无码免费肉站| 大香蕉碰碰| 欧美与日韩97| 97在线免费观看视频| 免费在线黄片视频| 人妻天天夜夜爽一区二区| 亚洲天堂情色| 欧美日韩资源| 男女激情黄色网址| 久久久久成人蜜桃精品| 老熟妇一区二区三区啪啪| 中国少妇啪啪视频| 国产av强奸美女| 草草影院在线视频| 9997se| 98人妻精品一区二区色欲| 国产自偷自拍一区| 美女91在线观看| 久热热| 亚洲女毛多水多21P| 人妻天天爽夜夜爽精品2| 自拍啪啪视频| 国产 日韩 欧美高清| 久久久亚洲精品电影免费看| 夜夜做夜夜爽精品视频| 欧美v亚洲v综合v国产v妖精| 这里只有精品视频在线| 青青草日韩免费观看高清在线| 大香蕉78| 天天爽天天干| 欧美综合狠| xxx0国产在线播放| 91久久午夜无码鲁丝片久久人妻| 东京热综合久久一区二区| 欧美一区二区观看在线| 国产肏屁眼视频| 狠狠爱综合网| 九九热在线视频| 99久在线精品99re8| 老熟女乱子伦中文字幕一区二区| 精品久久99| 色逼综合| 六月婷婷五月丁香| 91麻豆天美国产欧美高潮| 国产精品欧美日韩久久| 97欧美色资源| 岛国福利在线精品播放| 九九玖玖精品| 天天综合91| 久久久草成人网站久久久草成人久久久草久久久 | 精品美女人人干| 国产www色在线观看| 美女AV一区二区| 黑人美精品 A片| 色九九九九| av无线看| 中文字幕女同在线| 国产熟女完整版中字| 久久久久网站-538在线视频-欧美永久乱码| 国产精品成人AV片免费看网站| 国产精品老熟女一区二区| 亚洲激情片| 欧美一区二区在线资源| yaouchengrenav| 欧美白嫩在线放| 在线看的av| 亚洲色图第四色| 亚洲成av人片色午夜乱码| 天天干人妻视频| 精品一区二区三区蜜桃臀赵总 | 日本不卡一区| 亚熟在线| 美国人人操人人操| 久操av在线| 久99| 2024黄色视频| 91处女视频在线观看| 美国一区二区三区视频| 91国精产品| 国产成人网址| 张柏芝国产一区在线观看| 色婷婷综合久久中文字幕雪峰| 天天干天天燥| 天天综合网合集91| 性爱视频久久| 丁香婷婷五月| 超碰午夜| 婷婷五月花| 国产福利电影| www.acm成人黄色毛片| 久久99久久99精品免视看婷婷| 老女人91| 涩亚洲欧洲| 亚洲成人在线高清| 98福利在线视频| 99综合免费视频| 人人弄人人摸| 少妇高潮喷水无套久久久久久| 婷婷五月丁香五月| 日韩免费一级性爱视频| 国产精品 午夜福利| 久久久国产精品人妻丝袜| 91高潮喷水美女| 国产精品爽爽va在线观看98| 校园激情狠狠四射| 欧洲Au麻豆| a天堂视频| 99人妻| 欧洲精品一二三在线| 一区二区偷拍拍视频| 亚洲AV无码翔田千里网站| 四虎AV在线播放| 国产精品网站免费| 日韩人妻无码专区| 福利操逼| 91五十路| 台湾佬中文娱乐网久久久久久久久久com | 亚洲欧美中文一区二区三| 九九久久玖玖| 亚洲色图第一页| 欧美日韩欧美| 牛牛久久国产精品视频一二三| 婷婷导航| 精品国产丝袜一区二区三区乱码| 91成人无码| 本道在线| 北京美女一区二区| 91亚洲不卡一区| 婷婷99| 日本色色的视频| 国产特级毛片AAAAAA高潮流水| 神马午夜久久| 清纯唯美综合亚洲| 国产第11页| 久草婷婷| 91九九九馒头| 午夜人妻精品综合在线| 秋霞一级视频在线观看免费| 国产精品久久久久久久电影渣男| 日韩少妇无码| 天天夜夜rb| 国产精品久久久午夜夜伦鲁鲁| 亚洲黄色网址| 激情亚洲天堂| 国产自产91区13区| 亚洲,欧美,春色,另类| 婷婷在线精品| 九九aV| 曰韩av中文字幕专区| 久久精品高清AV| 日本免费人成视频播放120秒| 亚洲天堂在线怕怕视频| 五月天AV资源| 9 9无尺码天堂网| 日韩亚洲美州欧洲综三区一品在线| 黄页视频网站野外| 久综合国内精品自在自线| 天天操天天干一区二区 | 熟女六十路| 国产区91柔拿会所技师| 国产探花日韩援交| 久久久久久久九九九九九九| 中文字幕av亚洲精品| 欧美色图色综合| 亚洲天天操| 青娱乐休闲视频在线观看| 酒色综合网| 欧美色女人| 国产高清午夜成人在线观看| 人人摸人人舔一区二区| 日韩性爱网址| 综合激情二| 日韩本不卡视频在线观看 | 成人午夜小视频手机在线看| 日韩成人性日韩成人性爱视频在线免费观看| 成人AV素股で擦久久| 久草免费在线视频| 后入式在线免费观看60秒| 欧美午夜视频|