Shift and Rotate — 組合語言筆記
這次的主題,想要紀錄一下,Shift and Rotate在組與上的用法,順便增加印象。
主要可以分成下面兩大類,之後會再一一介紹。
首先先從,右半邊的Shift開始介紹。
Logic shift 跟 arithmetic shift比較不同的點在於「SAR」(shift arithmetic right)。等等會介紹。
Shift → Logic (SHL, SHR):
SHL: 白話文來說就是往左移。
規則:每個bit都會往左邊移動,The highest bit(也就是最左邊的那個數)會移動到CF(carry flag),然後the lowest bit (最右邊)會由0補上。
SHL destination, count (移動到的目的地,移動幾個bit)
SHL reg, imm8
SHL mem, imm8
SHL reg, CL
SHL mem, CL
*CL是一個暫存器可以幫忙存取,要移動幾個bit的個數。
SHR: 白話文來說就是往右移。
規則:每個bit都會往右邊移動,The Lowest bit(也就是最右的那個數)會移動到CF(carry flag),然後The Highest bit (最左邊)會由0補上。
以上兩種,在算數上可以有很多的幫助,
shift Lift (SHL)可以說是有「乘2」的概念。
shift Right(SHR):可以說有「除2」的概念。
Shift →Arithmetic (SAL, SAR) :
SAL:其實這個就跟SHL一模一樣,所以沒有什麼特別的,這邊就不多提。
SAR:
規則:往右移後,補上的0, 1會由他原本的東西來決定,看圖可以比較容易了解。
*依照The highest bit是多少來決定,要補什麼數字。
Rotate → 不包含carry flag(ROL, ROR) :
為什麼叫做rotate的原因是因為他有一點輪轉的感覺。
ROL:往左邊移動,補上的bit是由移動到CF的那個bit決定。
ROR:往右邊移動,補上的bit由移動到CF的那個bit決定。
Rotate → 包含carry flag(RCL, RCR) :
RCL: 往左邊移動,補上的bit是從CF得到的。
RCR:往右邊移動,補上的bit是從CF得到的。
SHLD/SHRD Instructions
還有一個好用的instruction可以使用。
SHLD/SHRD dest, source count (要存到哪裡,來源bit,移動幾格bit)
*這個有一個特色是source不會變,他只是把自己的某些bit給dest。