汇编语言—移位指令(如何正确学习汇编语言)
移位指令是一組經(jīng)常使用的指令,包括:算數(shù)移位、邏輯移位、雙精度移位、循環(huán)移位、帶進(jìn)位的循環(huán)移位;
移位指令都有一個(gè)指定需要移動(dòng)的二進(jìn)制位數(shù)的操作數(shù),該操作數(shù)可以是立即數(shù),也可以是CL的值;在8086中,該操作數(shù)只能是1,但是在其后的CPU中,該立即數(shù)可以是定義域[1,31]之內(nèi)的數(shù);
一、算數(shù)移位指令:
算數(shù)移位指令分為:算數(shù)左移SAL(Shift Algebraic Left)和算數(shù)右移SAR(Shift Algebraic Right);
指令格式: SAL/SAR reg/mem,CL/imm
受影響的標(biāo)志位:CF,OF,PF,SF,ZF;對(duì)AF的影響無(wú)定義;
算數(shù)左移SAL:把目的操作數(shù)的低位部分向高位方向移動(dòng)CL或imm指定的位數(shù);移位后,空出的低位部分全部用0填充;移出的高位存放在CF中;如果只向左移動(dòng)1位,那么,空出的最低位填0,移出的最高位存放在CF中;如果向左移動(dòng)N位,那么,空出的N個(gè)低位全部用0填充,移出的N個(gè)高位中,只把最后一次移出的那一位存放在CF中,即:CF中只存放最后一次移出的內(nèi)容;SAL效果如下圖所示:
算數(shù)右移SAR:把目的操作數(shù)的高位部分向低位方向移動(dòng)CL或imm指定的位數(shù);移位后,空出的高位部分全部用目的操作數(shù)原來(lái)的最高位(符號(hào)位)填充;如果只是向右移動(dòng)1位,那么,空出的最高位用目的操作數(shù)原來(lái)的最高位(符號(hào)位)來(lái)填充,移出的最低位存放到CF中;如果向右移動(dòng)N位,那么空出的N個(gè)高位全部都用目的操作數(shù)原來(lái)的最高位(符號(hào)位)填充,而移出的N個(gè)低位中,只把最后一次移出的那一位放到CF中,即:CF中存放的是最后一次移出的內(nèi)容;換句話說(shuō),算數(shù)右移時(shí),空出的高位上移入的是目的操作數(shù)原來(lái)的最高位的值,即:最高位保持不變,最低位同樣移入到CF中;算數(shù)右移常用于帶符號(hào)數(shù)的右移;SAR效果如下圖所示:
二、邏輯移位指令:
邏輯移位分為:邏輯左移SHL(Shift Logic Left)和邏輯右移SHR(Shift Logic Right);
指令格式: SHL/SHR reg/mem,CL/imm
受影響的標(biāo)志位: CF,OF,PF,SF,ZF;對(duì)AF的影響無(wú)定義;
邏輯左移SHL:把目的操作數(shù)的低位部分向高位方向移動(dòng)CL或imm指定的位數(shù);移位后,空出的低位部分全部填充0,移出的高位存放到CF中;如果向左移動(dòng)N位,則只把最后一次移出的內(nèi)容存放到CF中;SHL效果如下圖所示:
邏輯右移SHR:把目的操作數(shù)的高位部分向低位方向移動(dòng)CL或imm指定的位數(shù);移位后,空出的高位部分全部填充0,移出的低位存放到CF中;如果向右移動(dòng)N位,則只把最后一次移出的內(nèi)容存放到CF中;SHR效果如下圖所示:
三、雙精度移位指令:
分為:雙精度左移SHLD(Shift Left Double)和雙精度右移SHRD(Shift Right Double);這組指令都有三個(gè)操作數(shù);
指令格式: SHLD/SHRD reg/mem,reg,CL/imm
其中,第一操作數(shù)reg/mem是一個(gè)16位或32位的寄存器或存儲(chǔ)單元;第二操作數(shù)reg與第一操作數(shù)具有相同位數(shù),但它一定是一個(gè)寄存器;第三操作數(shù)CL/imm指定了移動(dòng)的位數(shù);
受影響的標(biāo)志位:CF,OF,PF,SF,ZF;對(duì)AF的影響無(wú)定義;
在執(zhí)行雙精度左移指令SHLD時(shí),第一操作數(shù)向左移動(dòng)N位,其”空出”的N個(gè)低位由第二操作數(shù)的高N位來(lái)填充,但是第二操作數(shù)本身并不移位、不改變;SHLD效果如下圖所示:
在執(zhí)行雙精度右移指令SHRD時(shí),第一操作數(shù)向右移動(dòng)N位,其”空出”的N個(gè)高位由第二操作數(shù)的低N位來(lái)填充,但是第二操作數(shù)本身并不移位、不改變;SHRD效果如下圖所示:
四、循環(huán)移位:
循環(huán)移位指令分為:循環(huán)左移ROL(Rotate Left)和循環(huán)右移ROR(Rotate Right);
指令格式:
ROL/ROR reg/mem,CL/imm
受影響的標(biāo)志位只有:CF、OF;
這兩條指令不會(huì)把進(jìn)位標(biāo)志CF納入循環(huán)位中;
循環(huán)左移ROL:把操作數(shù)的低位部分向高位方向循環(huán)移動(dòng)CL/imm指定的位數(shù),空出的低位部分由移出的高位部分來(lái)填充,同時(shí),移出的高位部分仍然會(huì)存放在CF中;如果是循環(huán)左移N位,那么,就空出N個(gè)低位,移出N個(gè)高位,然后,把移出的這N個(gè)高位按照移出的順序依次填入空出的N個(gè)低位中,同時(shí),CF中只保存最后一次移出的那一位的內(nèi)容;ROL效果如下圖所示:
循環(huán)右移ROR:把操作數(shù)的高位部分向低位方向循環(huán)移動(dòng)CL/imm指定的位數(shù),空出的高位部分由移出的低位部分來(lái)填充,同時(shí),移出的低位部分仍然會(huì)存放在CF中;如果是循環(huán)右移N位,那么,就空出N個(gè)高位,移出N個(gè)低位,然后,把移出的這N個(gè)低位按照移出的順序依次填入空出的N個(gè)高位中,同時(shí),CF中只保存最后一次移出的那一位的內(nèi)容;ROR效果如下圖所示:
五、帶進(jìn)位的循環(huán)移位指令:
帶進(jìn)位的循環(huán)移位指令分為:帶進(jìn)位的循環(huán)左移RCL(Rotate Left Through Carry)和帶進(jìn)位的循環(huán)右移RCR(Rotate Right Through Carry)
指令格式: RCL/ROR reg/mem,CL/imm
受影響的標(biāo)志位只有:CF,OF;
這兩條指令把進(jìn)位標(biāo)志CF納入了循環(huán)位中;
帶進(jìn)位的循環(huán)左移指令RCL:把操作數(shù)的低位部分向高位方向循環(huán)移動(dòng)CL/imm指定的位數(shù),每向左移動(dòng)一位,RCL指令都會(huì)先把CF的原有值填充到空出的最低位上,再把移出的最高位存放到CF中;這樣循環(huán)左移N位之后,CF中保存的仍然是最后一次移出的那一位的內(nèi)容;RCL效果如下圖所示:
帶進(jìn)位的循環(huán)右移指令RCR:把操作數(shù)的高位部分想低位方向循環(huán)移動(dòng)CL/imm指定的位數(shù),每向右移動(dòng)一位,RCL指令都會(huì)先把CF的原有值填充到空出的最高位上,再把移出的最低位存放到CF中;這樣循環(huán)右移N位之后,CF中保存的仍然是最后一次移出的那一位的內(nèi)容;RCR效果如下圖所示:
移位指令中,溢出標(biāo)志位OF的設(shè)置規(guī)則為:如果只移動(dòng)一位,則系統(tǒng)按照操作數(shù)的最高符號(hào)位在移位前后是否發(fā)生改變,來(lái)相應(yīng)地設(shè)置溢出標(biāo)志OF的值:如果移位前操作數(shù)的最高符號(hào)位與移位后操作數(shù)的最高符號(hào)位不相同(有變化),則設(shè)置OF=1,認(rèn)為溢出了;否則,設(shè)置OF=0,認(rèn)為沒(méi)有溢出;但是,如果移位位數(shù)大于1,則OF的值不確定;也就是說(shuō),溢出標(biāo)志OF的值只有在移位位數(shù)為1時(shí)才有意義;
進(jìn)位標(biāo)志CF的設(shè)置規(guī)則:系統(tǒng)按照移入的位來(lái)設(shè)置進(jìn)位標(biāo)志CF,根據(jù)移位后的結(jié)果影響SF,ZF,PF,而對(duì)AF的影響沒(méi)有定義;
FROM: http://bdxnote.blog.163.com/blog/static/8444235201061610333135/
總結(jié)
以上是生活随笔為你收集整理的汇编语言—移位指令(如何正确学习汇编语言)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql select count 5
- 下一篇: 物联网之Zigbee系统开发一(zigb