什么是單片機(jī)的邏輯運(yùn)算指令與移位指令
在計(jì)算機(jī)技術(shù)中,“指令”是由指令集架構(gòu)定義的單個的CPU操作。在更廣泛的意義上,“指令”可以是任何可執(zhí)行程序的元素的表述,例如字節(jié)碼。一臺計(jì)算機(jī)通常有幾十條到幾百條指令,按其所完成的功能可分為:算術(shù)邏輯運(yùn)算指令、移位指令、浮點(diǎn)運(yùn)算指令、十進(jìn)制運(yùn)算指令、數(shù)據(jù)傳送指令、轉(zhuǎn)移指令、字符串處理指令、向量運(yùn)算指令、堆棧指令、輸入輸出指令、特權(quán)指令和控制指令等。算術(shù)邏輯運(yùn)算指令的主要功能是進(jìn)行各類數(shù)據(jù)信息處理,計(jì)算機(jī)一般都具有這類指令。早期的小型計(jì)算機(jī)和微型計(jì)算機(jī)的硬件結(jié)構(gòu)比較簡單,一般只設(shè)置二進(jìn)制定點(diǎn)加減法、比較和求補(bǔ)碼(取負(fù)數(shù))等最基本的算術(shù)指令。
由于芯片集成度的提高,后來的中央處理器都支持用硬件實(shí)現(xiàn)的乘除法指令。計(jì)算機(jī)還具有對兩個操作數(shù)進(jìn)行邏輯乘、邏輯加和按位加(異或)操作的邏輯運(yùn)算。有些計(jì)算機(jī)還設(shè)置位操作指令,如位測試(測試指定位的值)、位清除(把數(shù)中的某一位置為零)、位求反(取某位的非值)等指令。
邏輯運(yùn)算指令
邏輯運(yùn)算指令進(jìn)行二進(jìn)制數(shù)據(jù)的按位運(yùn)算。例如邏輯與指令,當(dāng)兩個操作數(shù)的對應(yīng)位都為“1”時,邏輯與操作結(jié)果中該位才為“1”,該指令常用于屏蔽或檢測數(shù)據(jù)字中的某些位;邏輯或指令則是當(dāng)兩個操作數(shù)的對應(yīng)位中有一個為“1”時,操作結(jié)果中的該位為“1”,該指令常用于將數(shù)據(jù)字中的某些位置為“1”;邏輯非就是把數(shù)據(jù)字中的所有位求反。
邏輯運(yùn)算可以分成字節(jié)邏輯運(yùn)算和位邏輯運(yùn)算兩大類,其指令格式見表3-8。當(dāng)邏輯運(yùn)算指令的目的操作數(shù)是累加器A、程序狀態(tài)字寄存器PSW或進(jìn)位標(biāo)志位CY時,PSW會受到影響,否則PSW不受影響。
1.字節(jié)清零CLR和取反CPL指令
字節(jié)清零指令“CLR A”將累加器A清0。字節(jié)取反指令“CPL A”將累加器A中的數(shù)按位二進(jìn)制取反。
【例3-39】字節(jié)取反指令。確定以下兩條指令執(zhí)行后累加器A的值。
解:答案在程序段的注釋中給出。
2.字節(jié)“與”ANL、“或”O(jiān)RL及“異或”XRL運(yùn)算指令
字節(jié)“與”ANL、“或”O(jiān)RL及“異或”XRL運(yùn)算指令對指令中的兩個操作數(shù)進(jìn)行按位的二進(jìn)制“與”“或”“異或”運(yùn)算,運(yùn)算結(jié)果存放于目的操作數(shù)中。
【例3-40】字節(jié)邏輯運(yùn)算指令A(yù)NL、ORL和XRL。確定以下程序段中ANL、ORL和XRL指令執(zhí)行后累加器A的值。
解:答案在程序段的注釋中給出。由本例可知:①與“0”進(jìn)行“與”運(yùn)算的二進(jìn)制位會被清0,與“1”進(jìn)行“與”運(yùn)算的二進(jìn)制位保持不變;②與“1”進(jìn)行“或”運(yùn)算的二進(jìn)制位會被置1,與“0”進(jìn)行“或”運(yùn)算的二進(jìn)制位保持不變;③與“1”進(jìn)行“異或”運(yùn)算的二進(jìn)制位會被取反,與“0”進(jìn)行“異或”運(yùn)算的二進(jìn)制位保持不變。
3.位變量狀態(tài)設(shè)置指令CLR、SETB、CPL
如表3-8所示,位變量狀態(tài)設(shè)置指令CLR和SETB指令中僅有一個位操作數(shù),這兩條指令分別對位操作數(shù)進(jìn)行清0和置1的操作,而CPL指令的作用是將位操作數(shù)取反。
【例3-41】位變量狀態(tài)設(shè)置指令。確定下段程序中,每條指令執(zhí)行后F0的值。
解:答案在程序段的注釋中給出。
位清0指令“CLR C”(或“CLR bit”)與字節(jié)清0指令“CLR A”的差別是:字節(jié)清0指令中唯一的操作數(shù)一定是累加器A,如果CLR指令的操作數(shù)不是累加器A,則一定是位清0指令。相似地,位取反指令與字節(jié)取反指令的差別也在于操作數(shù)是否是累加器A。
4.位“與”ANL及“或”O(jiān)RL運(yùn)算指令
見表3-8,位“與”ANL及“或”O(jiān)RL指令的邏輯運(yùn)算在兩個位操作數(shù)之間進(jìn)行,而且目的操作一定是進(jìn)位標(biāo)志位CY。
【例3-42】位“與”ANL及“或”O(jiān)RL運(yùn)算指令。確定下段程序中,每條指令執(zhí)行后操作數(shù)的值。
解:答案在程序段的注釋中給出。
移位指令
移位操作指令是一組經(jīng)常使用的指令,屬于匯編語言邏輯指令中的一部分,它包括移位指令(含算術(shù)移位指令、邏輯移位指令),循環(huán)移位指令(含帶進(jìn)位的循環(huán)移位指令),雙精度移位指令三大類。其功能為將目的操作數(shù)的所有位按操作符規(guī)定的方式移動1位或按寄存器CL規(guī)定的次數(shù)(0~255)移動,結(jié)果送入目的地址。目的操作數(shù)是8位(或16位)的寄存器數(shù)據(jù)或存儲器數(shù)據(jù)。
移位指令對其操作數(shù)進(jìn)行循環(huán)移位,其指令語法格式見表3-9。二進(jìn)制數(shù)向左移位一次相當(dāng)于乘以2,向右移位一次相當(dāng)于除以2。通過移位的方法進(jìn)行乘、除法運(yùn)算比使用MUL和DIV指令速度更快,因?yàn)镸UL和DIV指令執(zhí)行時間是4個機(jī)器周期(見表3-7),而移位指令執(zhí)行一次僅用時1個機(jī)器周期(見表3-9)。圖3-4展示了移位指令的工作方式,結(jié)合表3-9可以更好地理解移位指令的功能。