彙編語言基礎之 移位指令

原文:http://bdxnote.blog.163.com/blog/static/
移位指令是一組經常使用的指令,包括:算數移位、邏輯移位、雙精度移位、循環移位、帶進位的循環移位;
移位指令都有一個指定需要移動的二進制位數的操作數,該操作數可以是立即數,也可以是CL的值;在8086中,該操作數只能是1,但是在其後的CPU中,該立即數可以是定義域[1,31]之內的數;
一、算數移位指令:
算數移位指令分爲:算數左移SAL(Shift Algebraic Left)和算數右移SAR(Shift Algebraic Right);
指令格式: SAL/SAR reg/mem,CL/imm
受影響的標誌位:CF,OF,PF,SF,ZF;對AF的影響無定義;
算數左移SAL:把目的操作數的低位部分向高位方向移動CL或imm指定的位數;移位後,空出的低位部分全部用0填充;移出的高位存放在CF中;如果只向左移動1位,那麼,空出的最低位填0,移出的最高位存放在CF中;如果向左移動N位,那麼,空出的N個低位全部用0填充,移出的N個高位中,只把最後一次移出的那一位存放在CF中,即:CF中只存放最後一次移出的內容;SAL效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
算數右移SAR:把目的操作數的高位部分向低位方向移動CL或imm指定的位數;移位後,空出的高位部分全部用目的操作數原來的最高位(符號位)填充;如果只是向右移動1位,那麼,空出的最高位用目的操作數原來的最高位(符號位)來填充,移出的最低位存放到CF中;如果向右移動N位,那麼空出的N個高位全部都用目的操作數原來的最高位(符號位)填充,而移出的N個低位中,只把最後一次移出的那一位放到CF中,即:CF中存放的是最後一次移出的內容;換句話說,算數右移時,空出的高位上移入的是目的操作數原來的最高位的值,即:最高位保持不變,最低位同樣移入到CF中;算數右移常用於帶符號數的右移;SAR效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
二、邏輯移位指令:
邏輯移位分爲:邏輯左移SHL(Shift Logic Left)和邏輯右移SHR(Shift Logic Right);
指令格式: SHL/SHR reg/mem,CL/imm
受影響的標誌位: CF,OF,PF,SF,ZF;對AF的影響無定義;
邏輯左移SHL:把目的操作數的低位部分向高位方向移動CL或imm指定的位數;移位後,空出的低位部分全部填充0,移出的高位存放到CF中;如果向左移動N位,則只把最後一次移出的內容存放到CF中;SHL效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
邏輯右移SHR:把目的操作數的高位部分向低位方向移動CL或imm指定的位數;移位後,空出的高位部分全部填充0,移出的低位存放到CF中;如果向右移動N位,則只把最後一次移出的內容存放到CF中;SHR效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
三、雙精度移位指令:
分爲:雙精度左移SHLD(Shift Left Double)和雙精度右移SHRD(Shift Right Double);這組指令都有三個操作數;
指令格式: SHLD/SHRD reg/mem,reg,CL/imm
其中,第一操作數reg/mem是一個16位或32位的寄存器或存儲單元;第二操作數reg與第一操作數具有相同位數,但它一定是一個寄存器;第三操作數CL/imm指定了移動的位數;
受影響的標誌位:CF,OF,PF,SF,ZF;對AF的影響無定義;
在執行雙精度左移指令SHLD時,第一操作數向左移動N位,其"空出"的N個低位由第二操作數的高N位來填充,但是第二操作數本身並不移位、不改變;SHLD效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
在執行雙精度右移指令SHRD時,第一操作數向右移動N位,其"空出"的N個高位由第二操作數的低N位來填充,但是第二操作數本身並不移位、不改變;SHRD效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
四、循環移位:
循環移位指令分爲:循環左移ROL(Rotate Left)和循環右移ROR(Rotate Right);
指令格式: ROL/ROR reg/mem,CL/imm
受影響的標誌位只有:CF、OF;
這兩條指令不會把進位標誌CF納入循環位中;
循環左移ROL:把操作數的低位部分向高位方向循環移動CL/imm指定的位數,空出的低位部分由移出的高位部分來填充,同時,移出的高位部分仍然會存放在CF中;如果是循環左移N位,那麼,就空出N個低位,移出N個高位,然後,把移出的這N個高位按照移出的順序依次填入空出的N個低位中,同時,CF中只保存最後一次移出的那一位的內容;ROL效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
循環右移ROR:把操作數的高位部分向低位方向循環移動CL/imm指定的位數,空出的高位部分由移出的低位部分來填充,同時,移出的低位部分仍然會存放在CF中;如果是循環右移N位,那麼,就空出N個高位,移出N個低位,然後,把移出的這N個低位按照移出的順序依次填入空出的N個高位中,同時,CF中只保存最後一次移出的那一位的內容;ROR效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
五、帶進位的循環移位指令:
帶進位的循環移位指令分爲:帶進位的循環左移RCL(Rotate Left Through Carry)和帶進位的循環右移RCR(Rotate Right Through Carry)
指令格式: RCL/ROR reg/mem,CL/imm
受影響的標誌位只有:CF,OF;
這兩條指令把進位標誌CF納入了循環位中;
帶進位的循環左移指令RCL:把操作數的低位部分向高位方向循環移動CL/imm指定的位數,每向左移動一位,RCL指令都會先把CF的原有值填充到空出的最低位上,再把移出的最高位存放到CF中;這樣循環左移N位之後,CF中保存的仍然是最後一次移出的那一位的內容;RCL效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
帶進位的循環右移指令RCR:把操作數的高位部分想低位方向循環移動CL/imm指定的位數,每向右移動一位,RCL指令都會先把CF的原有值填充到空出的最高位上,再把移出的最低位存放到CF中;這樣循環右移N位之後,CF中保存的仍然是最後一次移出的那一位的內容;RCR效果如下圖所示:
2010年07月16日 - 哥哥 - 哥哥
移位指令中,溢出標誌位OF的設置規則爲:如果只移動一位,則系統按照操作數的最高符號位在移位前後是否發生改變,來相應地設置溢出標誌OF的值:如果移位前操作數的最高符號位與移位後操作數的最高符號位不相同(有變化),則設置OF=1,認爲溢出了;否則,設置OF=0,認爲沒有溢出;但是,如果移位位數大於1,則OF的值不確定;也就是說,溢出標誌OF的值只有在移位位數爲1時纔有意義;
進位標誌CF的設置規則:系統按照移入的位來設置進位標誌CF,根據移位後的結果影響SF,ZF,PF,而對AF的影響沒有定義;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章