原文:
移位指令是一組經常使用的指令,包括:算數移位、邏輯移位、雙精度移位、迴圈移位、帶進製的迴圈移位;
移位指令都有乙個指定需要移動的二進位制位數的運算元,該運算元可以是立即數,也可以是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效果如下圖所示:
算數右移sar:把目的運算元的高位部分向低位方向移動cl或imm指定的位數;移位後,空出的高位部分全部用目的運算元原來的最高位(符號位)填充;如果只是向右移動1位,那麼,空出的最高位用目的運算元原來的最高位(符號位)來填充,移出的最低位存放到cf中;如果向右移動n位,那麼空出的n個高位全部都用目的運算元原來的最高位(符號位)填充,而移出的n個低位中,只把最後一次移出的那一位放到cf中,即:cf中存放的是最後一次移出的內容;換句話說,算數右移時,空出的高位上移入的是目的運算元原來的最高位的值,即:最高位保持不變,最低位同樣移入到cf中;算數右移常用於帶符號數的右移;sar效果如下圖所示:
二、邏輯移位指令:
邏輯移位分為:邏輯左移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效果如下圖所示:
邏輯右移shr:把目的運算元的高位部分向低位方向移動cl或imm指定的位數;移位後,空出的高位部分全部填充0,移出的低位存放到cf中;如果向右移動n位,則只把最後一次移出的內容存放到cf中;shr效果如下圖所示:
三、雙精度移位指令:
分為:雙精度左移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效果如下圖所示:
在執行雙精度右移指令shrd時,第一運算元向右移動n位,其"空出"的n個高位由第二運算元的低n位來填充,但是第二運算元本身並不移位、不改變;shrd效果如下圖所示:
四、迴圈移位:
迴圈移位指令分為:迴圈左移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效果如下圖所示:
迴圈右移ror:把運算元的高位部分向低位方向迴圈移動cl/imm指定的位數,空出的高位部分由移出的低位部分來填充,同時,移出的低位部分仍然會存放在cf中;如果是迴圈右移n位,那麼,就空出n個高位,移出n個低位,然後,把移出的這n個低位按照移出的順序依次填入空出的n個高位中,同時,cf中只儲存最後一次移出的那一位的內容;ror效果如下圖所示:
五、帶進製的迴圈移位指令:
帶進製的迴圈移位指令分為:帶進製的迴圈左移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效果如下圖所示:
帶進製的迴圈右移指令rcr:把運算元的高位部分想低位方向迴圈移動cl/imm指定的位數,每向右移動一位,rcl指令都會先把cf的原有值填充到空出的最高位上,再把移出的最低位存放到cf中;這樣迴圈右移n位之後,cf中儲存的仍然是最後一次移出的那一位的內容;rcr效果如下圖所示:
移位指令中,溢位標誌位of的設定規則為:如果只移動一位,則系統按照運算元的最高符號位在移位前後是否發生改變,來相應地設定溢位標誌of的值:如果移位前運算元的最高符號位與移位後運算元的最高符號位不相同(有變化),則設定of=1,認為溢位了;否則,設定of=0,認為沒有溢位;但是,如果移位位數大於1,則of的值不確定;也就是說,溢位標誌of的值只有在移位位數為1時才有意義;
進製標誌cf的設定規則:系統按照移入的位來設定進製標誌cf,根據移位後的結果影響sf,zf,pf,而對af的影響沒有定義;
15 ARM彙編自學筆記指令系統之移位指令(操作)
移位指令 操作 arm微處理器內嵌的桶型移位器 barrel shi f t er 支援資料的各種移位操作,移位操作在arm指令集中不作為單獨的指令使用,它只能作為指令格式中是乙個字段,在組合語言中表示為指令中的選項。例如,資料處理指令的第二個運算元為暫存器時,就可以加入移位操作選項對它進行各種移位...
組合語言 彙編指令
功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...
組合語言 傳送指令
一.傳送指令 1.通用傳送指令mov mov dst,src 將src傳送到dst中 dstsrc操作位數 mem reg imm8 16 mem reg seg reg8 16 reg seg mem 8 16 mem reg seg 8 16 imm是立即數,reg是暫存器,seg是段暫存器,m...