久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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 寄存器就是典型例子。看教程五分鐘就能背下LOOP指令的語義但真正上手寫程序第一次跑出來的結(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
返回資訊列表
婷婷五月影院| 久久99九九九九6666免费观看软件| 在线观看不卡一区二区三区| 韩日精品福利视频一区不卡在线免| 中文字幕亚韩| 99这里只有精品国产| 91天堂丝袜美腿| 亚洲 欧美 天天| 啪啪免费| 好色综合| 天天操天天干美女网址导航| 亚州国产成人精品女人久久| 97精品97| 青青青操| 蜜臀久久一区二区| 日本岛国黄色网址| 国产福利小视频高清在线观看| 久久久久亚洲| 日逼97| 日欧毛片久久| 妇人噜噜| 日本九九久久99播| 蜜桃久久久久久久| 综合色图,成人综合网| 久久九九视频九九视频| 一本一道波多野毛片中文在线| 青青在线视频日韩欧美| a片在线播放| 欧美五十路熟| 国产精品一区二区手机看片| 日本乱人伦片中文三区| 无码天堂| 国产黄色在线播放观看| 成人午夜高潮av猛片| 91热| 日韩人妻无码不卡网站| 亚洲综合色图欧美| 老女人综合| 人妻 欧美亚洲| 劲爆欧美人妖三区91| 国产欧美黑人丰满在线| 久久久久久一日韩字幕无码| av网站在线观看了| 国产女同视频在线播放| 亚洲性爱电影| 强奸乱伦Av网| 亚洲高清国产理伦片| 国产一进一出视频网站| 国产成人资源| 97视频620| 国产丝袜美腿美女麻豆| 天天爱综合网| 玖玖大干人妻| 诱惑网综合| 天天综合网~91| 78操B| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 欧美日韩电影一区二区| 蜜臀久久在线视频| 超碰久在线天天做| 久久久999| 思思久热在线精品66| 欧美精品精品一区二区| 国产精品无码久久久久2025| 爱我干综合| 密桃99999| 亚洲国产剧情少妇激情| 亚洲高清少妇| 啊啊啊啊啊啊在线| 久碰视频| 午夜福利区| 伊人在线大香蕉视频久久| 手机在线大香蕉| 人人操我人人干| 午夜精品五区| 欧州色图区| 亚洲精品骚逼| 999久久久免费精品国产牛牛| 午夜电影在线观看无码专区| 嗯嗯啊啊操死我| 熟女一区二区三区四区| 国产婷婷综合在线观看| 亚洲黄网在哪免费看| 18精品一区| 亚洲一二三四区在线免费看视频| 中文视频在线观看| A V少妇特黄三级| 美欧老女人97| 亚州综合| 久久五月份| 欧美天堂亚洲电影院一区在线播放| 精品人妻丰满熟妇一区二区三| 欧美一区二区一级岛国大片| 少妇一级无码精品| 综合网色| 色香在线| 日本韩国国产精品一区| 亚洲欧洲偷拍一区| 色偷综合| 色情乱伦AV| 97人肏| 极品色电影院| 在线人成亚洲视频免费观看| 欧美性天天影视| 亚洲偷拍欧美激情| 欧美黄色大片在线观看 | 精品一区二区成人动漫| 男人精品天堂一区| 国产精品蜜乳AV| 97久久资源| 久久久精| 黑人狂躁日本妞一区二区三区| 91丨九色丨43老版熟女| 超碰偷拍| 户外裸露刺激视频第一区| 熟女一区二区| 欧美日韩在线小说| 国产亚洲日韩在线三区黑人| 97亚洲欧美日韩| 国产精品内射婷婷一级二| 高清在线偷拍自拍视频| 色香91| 免费αⅴ在线观看| 色婷婷成人综合| 日本506070| 黄色片大香蕉| 污电影在线观看| 综合激情二| 久久婷婷伊人| 欧美色图20P| 亚欧性爱在线无码| 日韩成人人妻网站| 亚洲无码久久久久久久| 男人的天堂在线| 国产又色又粗又黄又爽| 中文字幕久久精品一区| 久久性爱精品一区| 日日A∨| 1级午夜影院费免区| 婷婷色香| 国产高清免费不卡av| 91在线美女| 一级婬片120分钟试看| 久操九九九九| 欧美激情视频一区二区| 国产精品午夜成人福利| 蜜乳av一区二区| 日本不卡二三区| 亚洲春色欧美激情自拍| 久久99草| 免费毛片在线播放| 日韩有码中文字幕女同性恋| 91精品成人| 国产一区二区在线播放量| 丝袜喷水在线| 国产1769在线| 欧美成人一区二区三区在线播放| 九九九国产精品| 国产精品一区av在线| 男人天堂久久精品不卡| 久久人妻视频| ,成人免费啪啪视频| 蜜桃视频一区二区三区| 歐美一級亂黃99在綫精品| 国产无吗在线播放| 亚洲极品| 夜夜操天天肏| 国产www色在线观看| 九九热re99re6在线精品| 一区二区三区四区色图| 日韩操p| 青草视频人妻在线观看| 亚洲色天堂日韩中| 一级特级aaaa毛片免费观看| 九月伊人中文字幕| 久久精品99久久久久久| 久久亚洲不卡| 国产亚洲精品玖玖玖在线观看| 91宗合网| 蜜臀久久99'精品久久久| 少妇二级| 天堂中文资源在线bt| 少妇熟女一区二区三区| 91精品免费| 91亚洲人电影| 国模精品娜娜一二三区| 国产女人和拘做爰视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 蜜臀亚洲中文| 9久热| 国产精品一区二区亚洲人成毛片| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 狠狠狠狠狠| 成人午夜小视频手机在线看| 国产精品永久免费10000| 亚州,欧美在线| 一区中文字幕二区日韩| 99精彩视频| 激情干在线| 亚洲欧洲自拍图片专区满春格| 亚洲国产精品久久久久婷婷老年 | 啊啊啊啊好多水| 国产精品久久久久久夜夜夜夜| 欧美日韩性感| 色色色999| 免费在线黄片视频| 国产精品制服丝袜清纯唯美| 国产精品爱欲| 国产精品一区二区亚洲人成毛片| 影音先锋每日最新资源在线观看 | 亚洲本色精品一区二区久久| 97伊人| 热热热热日日漂亮永久永久国产日| 午夜福利久久久噜久噜久久综合| 国产亚洲人妻综合日韩 久久| 国产不卡免费在线视频| 在线观看成人性爱免费小视频| 无码久久国产 | 亚州精人品大香蕉| 日韩精品一二三四| 熟妇在线视频一区二区| 九九无码久久精品视频| 日韩天堂av电影在线观看| 日本三级中国三级99人妇网站| 五月天婷精品激情| 91成人在线免费视频| 中文字幕91页| 亚洲 欧美日韩 另类| 亚洲色图日韩精品| 亚洲欧美中文一区二区三| 曰韩操B| 在线欧美69V免费观看视频| 免费中文综合精品| 久久精品日韩| 操高情无码| 中文字幕 国产区| 十八禁视频网站| 国产版a级片直播在线| 91快色色色色色| 搡老人老9丨女老熟人| 中国人高清www色视频免费| 国产精品乱码久久久久| 超碰免费人妻人人| 中文字幕aⅴ在线视频| 天天色黄色影院天天操| 手机在线观看不卡无码av| 福利色色| 久久精品亚洲婷婷| 久久精品高清无码一区| 亚洲黄色电影| 99久久国产精品免费高潮| 亚洲精品国产日韩无码AV永久免| 一级黄色性爱A级片| 国产激情在线| 有码免费观看| 精品然女一区二区| 中国少妇啪啪视频| AA级电影三区| 国产亚洲综合欧美一区| 国产精品情侣啪啪| 天天躁夜夜躁狠狠躁AV| 亚洲色欧美| AV网站高清无码在线观看| 激情久久久| 性性欧美| 91久久青青草原精品| 三级色综合| 五月丁香六月激情| 国产熟女二区| 亚洲色综合| 五月丁香拍拍激情综合三级| 好湿好紧好爽 视频| 精品无码久久久久| 亚洲国产综合图区中文字幕| 久草免费福利在线播放| 97视频观看| 少妇激情AV| 99精品国产户外露出| 日va操| 亚洲s在线观看| 啊啊啊啊啊好舒服视频| 国产成人在线观看网址| 天天干,天天日| 天天天天天超碰| 另类欧美色| 日韩精品免费高清视频在线| 俺去久久| 91欧美长吊| 性性欧美| 丰满少妇人妻久久久久久| 乱伦系列一区二区| 2024人人操人人摸| 日韩有码免费视频| 亚洲av总站| 中文字幕人乱码中文字的预防方法 | 亚洲综合另类小说色区亚洲成av人片在www | 五月婷婷激情网| 99色在线视频| 青青草大香蕉在线视频| 综合大香蕉美。| 大香蕉懂9| 国产人妖视频一区在线观看| 青青青操| 综合欧美亚洲| 久久久久亚洲Aⅴ无码| 亚洲人在线成线成人| 亚洲清纯综合| 国产成人无码网站在线视频| gogogo免费高清看中国国语| 日本有码影片下载 | 97精选久久| 性饥渴少妇av无码毛片| 操狠狠| 少妇精品久久| 欧美一区91大爱| 哈哈操 大香蕉| 三级AV入口| 国产精品熟女AV中文字幕在线播放| 91精品操美女| 1024亚洲中文字幕久在线看片你懂的| 曰韩中文人妻视频| 91oumei| 熟妇人妻精品一区二区| 成人免费在线网站| 日本大香蕉综合网红本杳社区| 亚洲欧洲国产综合av| 欧洲站一级二级三级h| 思思性爱| 日本一级特级毛片视频| 久久国语| 亚洲图片欧美在线视频| 亚洲一二三四区| 蜜桃久久综合视频| 国产精品高清2021在线| 神马久久久久久久久久| 久久av无码| 99国产精品免费| 涩涩这里只有精品视频| 999色欧美中文字幕| 乱老女人一区二区视频| 国产三级资源在线观看| 国产精品伦理| 最新精品久久蜜桃| 色色热| 久操网址| 麻豆三极片| 操曰本熟女| 俺去久久| 亚洲日产专区| 日韩黄色一区二区三区| 天天视频黄| 亚洲日本天堂| 中国黑人三级片网站上区| 日本亚洲熟女视频| 日韩乱插| 久久国产免费激情视频| 国产日韩在线播放av| 亭亭丁香激情| 一区二区娱乐网站| 亚洲一卡2卡3卡4卡乱码网站| 日本大香蕉综合网红本杳社区 | 中文字幕日韩精品一区二区三区| 婷婷亚洲综合| 99九九精品| 国产精品99久久久www| 亚洲 小说 欧美 激情 另类| 青青操视频在线| 亚洲综合97中文网| 超碰人人草| 中文字幕亚洲热播人妻 | 亚洲一区二区三区春色| 国产家庭乱伦表演| 男人的天堂 在线一区| 综合av影片| 久久精品老司| m欧洲一级午老| 精品人妻一区二区免费蜜桃| 96AV久久久| 久草婷婷| 国产九九九九九九| 欧在线一二区| 亚洲一级性爱视频免费看| 国产不良强奸视频免费看| 欧美超碰97| 天天噜| 日韩一级性爱无码| 中国亚洲呦女专区| 夜夜高潮夜夜爽| 色呦呦、国产精品| 99蜜桃臀亚洲成人在线观看| 色噜噜人妻丝袜AV资源| 蜜臀aV午夜一区二区三区| 亚洲成人在线资源| 色噜噜国产精品视频一区二区| 欧美美女视频| 亚洲欧美综合区自拍另类| 99999精品视频| 色娱乐色呦呦夜夜夜夜av| 夜夜操一区二区| 日韩在线电影| 粉嫩av在线一区二区| 亚欧成人综合影院| 欧美刺激色黄片免费看| 台湾佬中文娱乐自偷自拍| 欧美国产一区二区三区麻豆传媒 | 91成人亚洲色图| 国产日韩欧美中文在线播放| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 超碰午夜| 尤物av网站免费在线播放| 男女猛烈无遮掩视频免费软件| 凸凹视频在线观看| 国产午夜福利视频在线| 中文字幕第2页| 精品国产人成在线| 蜜臀久久久| 国产精品不卡av免费在线观看| 啊…啊…操我用力操我| 日韩十八禁| 妺妺跟我一起洗澡没忍住| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 久久久久女教师免费一区| 天天操夜夜操狠很操| 中文字幕在线观看AV| 91亚洲人| 嗯嗯嗯啊啊啊在线免费观看| 人人弄人人摸| 日韩精品三区四区| 国产家庭乱伦性爱视频| 中文幕97| 91精品人妻电影| 国产热av| 熟女精品一区二区三区| 清纯唯美亚洲综合| 中文字幕精品丝袜| 国产精品一级毛片不卡视| 亚洲日韩东京热一区| 一级黄色视频网| 国产麻豆一区二三区| 亚洲中文字幕av| 91被操| 97chaopenrihan| 青青草在线视频人人想人人上| 蜜臀久久99精品久久久久久酒店| 综合熟女| a一区二区三区乱码在线| surenchaopeng| 欧亚成人在线视频| 五月天社区| 久久久久免费看少妇A片特黄| 亚洲男人综合网| 99国产精品在线观看| 天天艹天天日| 天天噜| 91少妇通奸网站| 丁香久久| 久久精品性| 国产高清精品一区二区三区毛片| 超碰九7免费| 天天情欲宗合网| 91色图片| 国产精品久久久久久久久久久久久久久久久久 | 在线精品福利免费播放| 久久国内| 国产福利小视频高清在线观看| 99re免费| 丰满熟女一区二区三区在线播放| 在线洲亚线| 日韩精品9区| 天天摸夜夜摸| 久久精品免费| 亚洲综合码| 久久嫩草国产成人一区| 丝袜综合色图| 午夜无码熟妇丰满人妻| 91情色在线| 久久内射| 欧美96精品在线| 99久久99九九99九九九| 久久国产乱子伦精品免费女,网站| 亚洲精品97久久中文字幕| 无码九九| 啪啪啪综合网| www.超碰| 国产怡红院| 综合97亚洲| 一本大道久| 四虎在线视频| 草草电影院| 久久无码一区二区二三区性色| 亚洲精品免费中文字幕| 美女操逼福利视频| 国产刺激视频| 青青草色情网站视频| 伊人亚洲综合| 香蕉99秘 一区精品蜜桃臀| 久久精品熟妇丰满人妻99| 先锋激情∨在线视频播放| 人人扣人人操| 成人在线视频一区| 国产老太乱伦一区| 伊人女女资源在线观看| 91oumei| 亚洲淫色网中文| 中文字幕丝袜| 久久五月天婷婷丁香中文字幕| 九九综合久久| 婷婷五月天无码| 亚洲欧美日韩免费观看| 亚洲综合在线视频| 久久久久久久久9| 成人乱码一区二区三少妇| 91伊人大香蕉| 亚洲国产成人精品久久久国产成人一区二区| 人妻献身系列第54部| 96久久精品一二三区色欲| 色哟哟AⅤ| 午夜福利免费福利视频| 亚洲日韩青青草色月| 男人的天堂三级| 日熟女| 精品久久久av| 日韩欧美亚洲自拍偷拍| 亚洲一区深夜| 国产自制av蜜乳| 日韩精品.久久精品.AV女优.天美传媒| 9 9无尺码天堂网| 1人人看人人摸人人操| 人人噜夜夜操| 天天草天天日| 极品内射| 久久免费精品视频免一| 91中出在线| 久久9视频| 欧美色涩| 精品综合久久久久久97| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 黑人与人妻| 亚洲九月丁香| 久久久亚洲| 97资源免费视频| 久久五月综合| 国产av强奸美女| 欧美黑人日韩少妇色情| 手机看片1025| 一级片视频啪啪| 老司机久久| 丁香五月大香蕉| 在线观看无码三级少妇| 天堂性色| 丰满人妻一区| 91 丝袜在线| 人妻少妇久久久| 亚洲男人综合| 夜夜 中文视频rt| 99热综合| 久久久久久精品免费看A级| 91欧美情色| 97色涩| 夜夜爽爽爽| 女人午夜视频777| 亚洲男人久久综合天堂| 最近二区三区视频大全| 欲色综合| 麻豆黄站| 欧美体内射精| 99re在线视频国产| 无毛精品| 久久人妇| 亚洲黄色网址| 久久超碰av在线| 美女91在线观看| 亚洲综合113页| 屌妞视频久久久久久久 | 久久九九精品一区二区| 是还免费视频1727我| 日日做夜狠狠爱欧美黑人| 中文幕97| 热久日综合| 欧美内射少妇| 91视频综合在线| 久热大香蕉网站| 91亚洲综合在线| 欧洲亚洲人妻无码久久三区四区| 中文字幕视频在线观看| 超碰在线一区二区| 黑人精品一区二区在线播放| 人人干黄色| 欧美性爱视频免费一区一A| 天堂а√在线最新版在线| 久久成人国产精品| 很很热性爱视频| 日日操天天操| 青青网三级视频| 久久综合精品一区二区三区| 日本高清加勒比| 欧美色图 色综合图| 亚洲精品国产熟女久久久久久| 九九色热| 99热这里只有精品1| 素人一区二区三区日韩| 中日韩久久久| 99热亚洲天堂| 黑人粗大V S日韩女优视频| 女人天堂av在线播放| 探花熟女,姿勢到位,體驗感也到位| 五月婷婷综合激情| 久久久91福利姬| 97超碰磁| 欧亚乱色熟一区二区三四区| 91激情国产| 搡老女人911熟妇老熟女| 伊人久久大香大香线蕉中文| 亚洲人在线| 亚洲欧美综合| 97人妻色| 乱伦强奸区日韩| 九九Av| 日韩天天综合| 91精品丝袜在线观看| 97超色| 日本欧美亚洲高清在线看| 欧美综合第一| 欧差乱伦二三| 色网在线| 成人亚欧免费视频| 久久发布国产伦子伦精品| 中文字幕一区电影在线观看| 78p欧美| 影音先锋少妇| chaopen97久久| 五月丁香啪啪| 蜜汁欧美| 骚乳在线| 久久美女国产| 啊啊啊啊啊啊在线| 精品十三区| 久久国内| 日韩av免费一级电影| 啊嗯嗯啊好大好爽| www.色99| 99久久无码| 日韩精品99久久久久久中文字幕| 18禁免费视频| 欧美日韩亚洲天堂| 国产丰满熟夫69mpp| 99热超碰| 家庭乱伦网站国产| 久久久久久久久久久久97| 精品射1999| 亚洲国产午夜真人一级片中文字幕精品黄网站 | daxiangjiao你懂的| 色嘟嘟人妻天堂网| 中文字幕精品资源在线| 天堂а√在线最新版在线| 亚洲不雅视频1区二区| 亚洲美女 晚间男人天堂| 亚洲欧美日韩夜夜| 翔田千里AⅤHD无码| 天天欧美| 啊啊啊水好多| 伊人网一本| 午夜精品人妻二区三区| 麻豆成人av| 亚州综合电影| 亚洲日韩肥臀视频在线观看| 婷婷色网| 天综合中文| 欧美综合骚| 熟女一区二区| 超碰在线97国产| 99只有精品| 精品一区二区三区四区外站| 亚洲Av噜噜一区二区三区妖精| 天天操狠狠日夜夜干超碰撸com视频在线观看| 国产高清26uuu| 国产专区第一页| aaa一级黄片| 亚洲午夜av| 91干熟女| 天天爽天天| 亚洲色图91欧美日韩| 偷拍欧美激情| 国产精彩女在线观看视频| 天天在线91| 亚洲黄色电影| 狼人狠干| 国产中文大片资源中文字幕| 人人做人人妻人人夜视频| 3P乱轮视频| 97色色色| 欧美综合 站| 啊啊啊啊啊啊好多水| 国产精品毛片?v一区二区三区| 亚洲天堂,男人| 大香蕉操久久| 成人在线永久| 亚洲国产成人精品女人久久久| 另类亚洲一区二区三区| 操比国产| 青青欧洲黑| 免费一二区| 太久视频| 国产一级久久久| 亚洲综合九九| 婷婷丁香六月| 熟女熟妇伦久久影院毛片一区二区 | 色色毛片| 狠狠色丁香| 日韩精品影视| 97久久网| 丁香五月激情综合| 江都AV在线| 日韩91网站| 日本操嫩b网| 夜夜国产一区| 秋霞成人一级在线观看| 尤物av网站| 亚洲欧美日韩中文播放| 色婷视频| 日比av无码| 久久综合婷婷| 天天噜| 色色色色色色色色色色色色色色综合 | 五月婷婷六月色| 日韩精品午夜操呦呦不卡影院| 日本精品一区二区中文字幕| 97视频900| 视频黄色国产一级| 大香蕉日韩欧美| 超碰久热| 在线观看无码三级少妇| 老司机午夜精品福利视频一区二区| 亚洲精品乱码线路中文字幕 | 夜夜操一区二区| 午夜理论片在线观看免费| 91国产丝袜白虎| 性站 | 久干网| 五月丁香色色网| 不卡日本一区二区| 少妇内射视频| 78久久久| 天天看片天天爽| 日本性爱欧美性爱| 亚洲色综网| 99www.bibizy香蕉资源国产一区二区三区高清 | 国产91丝袜 在线播放| 男人兔费天堂| 色就色综合| 国产精品成人午夜福利| 天天日天天操VV| 日本高清电影欧美色图| 日本欧美亚洲高清在线看| 午夜舔阴达高潮视频免费看| 欧美午夜视频| 欧美操逼一二三区| 熟女被操视频网址| 日韩在线一区高清在线| 欧美日日操| 伊人五月天婷婷| 唯美清纯 妖精视频| 国产福利夜| 视频在线观看一二三区| 日本有码影片下载| 久久久久熟女| JuliaAnn丝袜熟女系列| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 国产97av| 久久午夜色播影院免费高清| 人妻天堂三区| 欧美亚洲中文| 国产一级内射高清视频| 91丝袜美女视频| 新91视频.cmp| 欧美se综合| 天天肏天天干| 久久综合国产精品国产| 国产精品一区二区三区,亚洲综合| 无码动漫av中文字幕| 丁香婷婷五月| 国产精品久久久久久久久久梁医生| 九九九久久久| 草草影院最新网址| 亚洲精品国产精品乱码不99| 美女露胸露尿口| 中文字幕在线观看第二页| 久久一二三级一一一| 蜜臀无码一区二区| 另类图片五月天| 污色区网站| 亚洲aV无码成人在线观看| 久久婷婷五月综合| 亚洲精品欧美专业| 欧美热图99| 亚洲?V无码专区在线电影| A久久| 人妻熟女一区二区| 超碰诱惑| 国产精品久久久久久无码红治院| 亚洲综合色男人网| 久久久久深夜无码| 人人操人人插人人摸人人干| 欧美少妇一区二区三区| 99精品九九九九九九| 超碰人人操97碰| 久久99黄色卞西瓜| 久操频道免费在线呗看| 日本亚洲熟女视频| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 蜜桃久久精品一区二区三区| 97超碰磁| 97干天天| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 97 国产一区| 久久色网| 久久久久9999妇女| KK色在线影院| 操碰91| 亚洲色天堂九9| www.av在线观看| 日本好吊色视频| 亚洲精品无码成人久久久99| 精品久久久av| 亚洲伊人久久综合97| 九九九九88| 亚洲欧美高清无码| 国产精品密臀网在线观看| 视频不卡中文字幕| 久久国产三区| 神马久久久久久| 亚洲色图加勒比| 97资源视频| 日韩中文9| 国产蜜臀精品一区免费尤物| 超碰免费人妻人人| 大香蕉欧美国产日韩高潮| 久久美女福利是上海美女| 97超碰站| 偷窥自拍亚洲| 欧美激情亚洲色图| 色天使亚洲综合在线观看| 91热色| 刺激性视频黄页| 国产18精品亚洲精品| 国产深夜福利| 亚洲999综合| 婷婷五月天成人网| 两女互慰AV高潮喷水在线观看| 亚州精品人妻一二三区| 亚州久久9| 国产精品肉丝自拍| 日韩一区二区三区四区五区| 78精品| 99精品无码| 欧美色图成人网一区二区| 偷拍 精品 另类 四区| 粉嫩在线一区二区懂色| 激情综合网亚洲| 97视频播放| 亚洲图片偷拍欧美| 久久网亚洲| 九九av| 射丝袜高跟鞋99| 婷婷亚洲综合| 五月婷在线| 色99视频| 五月天啪啪| 激情综合网激情五月天| 久久鲁干| 九九综合久久| 欧美精品第3页| 欧美精品成人亚洲| 精品免费1| 99中出在线| 人人摸人人干| 午夜福利在线视频1000| 伊人在线大香蕉视频久久| 久草电影网| BBBBB97COM| 成人怡红院| 久操精品| 99re公开精品免费视频 | 吻戏激情性巴克| baisiav| 婷婷香网站| 日韩毛片9| 男啪女色黄无遮挡免费观看| 超碰免费97| 久久天天艹| 亚洲免费看片| 欧美 中文字幕 一区| 国产久久久久影院老熟女| 加勒比AV天堂| 久射吧| 亚洲阿v天堂无码z2018| 综合激情五月天| 97色色国产视频| 中文字幕一区二区三区四五区| 91美女视频。| 亚洲成人性爱网站在线播放| 九九激情网| 综合网欧| 青娱乐91| 婷婷丁香在线| 欧美亚洲清纯| 多乙久久久久久| 青青草视频久久久久| AV中文字幕三四五| 中文字幕AV乱伦| 97视频在| 夜夜操青青草| 97这里都是精品| 亚洲精品久久久久久久蜜桃臀| 性开放中文AV高清无码免费看| 91挑色欧美| 强奸乱伦AV网址| 91粉芽高清在线一区二区| 精品一区二区久久| 91c色| 97视频在线免费播放| 伊人精品久久网站| 加勒比av官网在线| 欧美刺激色黄片免费看| 狠狠爱夜夜干| 婷婷五月成人| 亚洲黑人在线| 久久中文色图| 亚洲综合欧美| 97久精品| 久久这里只有精品9| 亚洲精品 欧美精品| 18禁无码永久免费无限制| 国产精品视频电影| 午夜激情成人在线观看| 97天天在线| 欧美性爱另类综合| 超碰欧美97| 97自拍一区| 九九热最新| 亚洲春色欧美激情自拍| 亚洲aw毛茸茸在线| 视频在线观看免费一区二区三区 | 麻豆60秒| 内射夫妻三片| 黑人精品欧美一区二区蜜桃| 亚洲色图欧美色图制服丝袜| 久久人人看| 熟妇乱伦一区二区| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 日本女优在线视频福利| 日韩精品亚洲一二三| 亚洲自拍欧美色综合| 91在线免费观看处女| 国产精品久久久久久 百度| 亚洲欧美97| 91视频综合在线| 东北女人操比视频| 熟妇一区二区三区| 婷婷尹人大香蕉免费| 精品区国产区一区二区三区| 婷婷久久五月综合激情| 欧综合网| 97久久超碰日韩精品| 国产丸一视频| 天美麻豆黄色录像| 国产不卡的视频| 日本好吊色视频| 九九九九九九成人| 欧美熟妇人体| 91熟女综合| 欧亚第一综合网| 国产suv精品一区二区四| 91亚州日韩高清| 欧美熟女激情| 日韩情色AV| 伊人精品视频| 插入粉嫩少妇视频| 中韩中文字幕在线观看| 97色亚洲| 日本一区二区中文字幕久久| 蜜臀久久99精品久久久久| 亚洲婷婷丁香在线| 色操逼网| 成人av影院在线观看| 久久久亚洲高清不打码| 秋霞免费AV| 蜜桃视频精品一区二区| 九九九久千久久激情蜜桃在线看 | 成人午夜小视频手机在线看| 日韩欧美亚洲一区二区三区影院| 天天射影院| 亚洲色香| 亚洲中文字幕一区二区| 亚洲最新Av| 免费看日本操逼视频| 婷婷激情一区二区三区俺也去| 国产地址二三| 亚洲美女精品九九视频| 国产欧美日韩一区二区三区| 99热这里只有精品99| 欧美精品第四五页中文字幕在线观看| 精品人妻一区二区蜜桃视频| 国产精品亚洲色婷婷久久久| 91狠狠综合久久| 五月综合久久| 色欲人妻一区二区在线| 中文字幕欧美日韩三级| 色区久久| 日本二区不卡| aaa亚无码专区| 天综合网| 青草精品视频-日本久久久久网站| 淫荡少妇免费| 色婷婷蜜臀av| 啪啪啪亚欧美视频| 超碰99在线| 91撸色网 玖玖网 欧美| 精品久久久久久中文字幕视频免费| 91一起操| 亚洲成人AB| AV网站高清无码在线观看| 日本三级日本三级三级人妇四虎| 99re9| 内射日韩大臀美女| 欧美综合网A| 91人妻Pr| 肥臀熟女一区二区三区视频| 口爆综合网| 亚洲欧美第一页| 欧美人妻二区三区| 亚洲一欧洲中文字幕在线| 伊人在线大香蕉视频久久| 秋霞曰韩R级| 97资源站日韩| 天天日天天舔东京热| 成人av性爱电影在线观看| 日韩人体偷拍| 国产自产一区视频在线| 久久精9| 国产精品熟女丝袜一区二区| 色97综合中文字幕| 精品伊人久久久大香线蕉小说| 91东北熟女| 欧美韩日精品资源| 野狼激情网| 无码WWW免费视频网站| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 国产成人久久久精品免费AV| 91少妇| 蜜臀在线网站| 97久久国产亚洲精品超碰热| 久久久人妻| 人人操人人色人人摸| 亚洲图片欧美色| k频道色撸撸| 亚洲春色激情小说| 人人操人人色网| 亚洲欧美另类图片| 亚洲,欧美,春色,另类| wwwcaobibi| 亚洲男人天堂网| 精品9999| 青娱乐 成人娱乐在线| 欧美色偷拍| 午夜福利免费精品视频| 高潮毛片无遮挡高清免费| 欧美资源| 天堂v无码免费视频| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 久久久久久久亚洲Av无码| 国产亚洲中文不卡二区| 成人怡红院| 99热这里只有精品18| 放黄片放3级黄片没穿衣服| 舔足天天操天天射| 欧美小说区视频区| 熟女熟妇一区二区三四区 | 九九热精品视频六| 1024手机看片欧美日韩| 狠狠躁久久躁| 97久久久| 美中日韩无码| 女优视频第10页| 久久婷婷在线观看视频| 一区久久久二区| 色偷综合| 91福利网在线观看| 欧美日韩国产高清在线一二三区| 亚州操逼图| 亚洲宅男天堂| 欧美黄色图片| 风骚少妇视频中文字幕| 操久久久久| 综合 欧美 亚洲 日本| 91香蕉视频在线观看免费| 色色色999| 偷拍亚洲高清图片| 日韩毛片9| 久久久久幕乱码| 伊人黄色片| 欧美性爱五月天| 丝袜狠狠草尤物人妻av91| 色亚洲欧美| 人妻乱仑一区二区三区| 射丝袜高跟鞋99| 男人的天堂2019| 深夜激情无码| 夫妻四区五区六区| 女色综合| 久久99国产综合精品女同| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | WWW美腿丝袜香蕉中文| 96精品久久久久久久久久| 日韩乱伦视频| 亚洲精品97p| 日韩大香蕉AV影片| 婷婷中文字幕| 日本综合色图| 无码 有码 国产18p| 欧美另类天堂| 亚洲色五月| 欧美草草高清日韩视频| 亚洲制服欧美另类内射| 中文字幕成人乱码熟女精品国50| 欧美国产伊人久久久久| 九九久精品| 国产91美女视频| 99成人| 中国和日本人色哪个不下载能放| 7777奇米影视久久| 丝袜高跟澳门91视频| h无码动漫在线观看| 久艹99| 五月天精品| 91一区二区三区蜜桃| 久久99精品九九久久久婷婷| 亚洲 日本 国产 综合| 中文熟女五十乱码在线| www.色操逼| 欧美亚洲高清| 麻豆人妻少妇在线免费观看| 国产中文精品一区二区在线观看| 97国产亚洲中文在线| 亚洲第一黄色av网站| 国产老女人久久毛| 又黑又大又粗| 国产精品无码av嫩草| 黄色交缠性感爆操91国产精品免费一区二区三区 | 日韩欧美tv一区二区在线观看| 91国产美女丝袜足交精品视频| 五月综合婷婷久久网站| 国产成人五月天丁香花| 天天干天天狼在线视频| 91亚洲综合| 久久久亚洲熟妇资源| av婷婷色网| 资源在线观一 二| 国产亚洲精品久久久久小| 亚洲久久久|