之前有說(shuō)要學(xué)習一下移位循環(huán)指令的,那么今天就開(kāi)始學(xué)習一下移位循環(huán)指令的使用吧。移位指令有左移也有右移,移位指令也分有字節、字、雙字類(lèi)型的移位,同樣的,循環(huán)指令也有左移右移,也有字節、字、雙字類(lèi)型的循環(huán)。除此之外,我們也可以在指令列表看到還有SHRB移位寄存器指令。這些指令我們都要靈活地掌握,掌握了這些指令,在以后編程的時(shí)候有時(shí)可以做到簡(jiǎn)化程序的效果,所以它還是比較有用的指令。
下面先學(xué)習一下移位指令,移位指令格式里面有使能輸入、輸入、輸出和移位位數N。下面就以字節移位指令為例看一下,字節左移SHR_B和字節左移SHL_B指令是將輸入字節(或字或雙字)數值根據移位位數向左或向右移動(dòng),并將結果送輸出字節(或字或雙字)。我們要注意的是對一個(gè)數左移一位相當于乘以2,右移一位相當于除以2。
對于移位指令,我們要注意的是移位指令是對每個(gè)移出的位進(jìn)行自動(dòng)補0的。如果移位位數大于或等于8(或字操作16或雙字操作32),那么數值最多是被移位8(或字操作16或雙字操作32)次的。當移位位數大于或等于最大允許值時(shí),其實(shí)就相當于進(jìn)行清零的操作。
除此之外,我們還要注意特殊內存位的使用,對于SM1.0,如果移位結果是零,則SM1.0被置位;對于SM1.1,就是把最后一次移出位的數值被復制到SM1.1,要注意這個(gè)前提是移位位數大于0。我們要注意的是SM1.0和SM1.1是會(huì )自動(dòng)復位的。
就以下面這個(gè)程序來(lái)說(shuō)明一下指令的使用,這條指令是I0.0接通執行移位操作,它是接通一次移位一次的,若VW200寫(xiě)入的是1110 0010 1010 1101,因為移位位數是3,那么移位的最后結果是0001 0101 0110 1000的。因為移位位數是大于0的,最后一位移出位的數值是1,那么就把SM1.1置為1。
下面再學(xué)習一下循環(huán)移位指令,循環(huán)移位指令格式里面一樣是有使能輸入、輸入、輸出和移位位數N的。下面就以字節循環(huán)移位指令為例看一下,字節循環(huán)左移ROR_B和字節循環(huán)左移ROL_B指令是將輸入字節(或字或雙字)數值根據移位位數向左或向右旋轉N位,并將結果送輸出字節(或字或雙字)。
對于循環(huán)移位指令,我們要注意的是如果移位位數大于或等于8(或字操作16或雙字操作32),那么執行循環(huán)移位之前要先對移位位數N進(jìn)行模數8(或字操作16或雙字操作32)操作,使得移位位數在0~7(或字操作0~15或雙字操作0~31)之間,得到一個(gè)有效的移位位數。這里說(shuō)的模數8操作是什么呢?它其實(shí)也就是對移位位數N除于8再求余數,舉個(gè)例子,如果移位位數是20,那么20除于8等于2余4,那么4就是實(shí)際移位數目。
我們要知道如果移位位數為0,這指令也就沒(méi)有什么意義了,它是不執行循環(huán)操作的。如果執行循環(huán)操作,也就是移位位數大于0,那么旋轉的最后一位數值被復制到SM1.1。對于SM1.1,還有如果移位位數不是8(或16或32)的整數倍,那么旋轉出的最后一位數值也被復制到SM1.1;對于SM1.0,當需要循環(huán)的數值是零時(shí),SM1.0被置位。
就以下面這個(gè)程序來(lái)說(shuō)明一下指令的使用,這條指令是I0.0接通執行循環(huán)操作,若AC0寫(xiě)入的是0100 0000 0000 0001,因為移位位數是2,那么移位的最后結果是0101 0000 0000 0000的。因為移位位數是大于0的,最后一位移出位的數值是0,那么SM1.1就為0。

下面就以小程序案例的形式講一下這幾個(gè)指令。
1、編寫(xiě)跑馬燈程序,8個(gè)燈從左往右循環(huán)點(diǎn)亮,即Q0.0---Q0.7每隔1秒點(diǎn)亮一個(gè)燈,周期循環(huán)。

2、編寫(xiě)8個(gè)燈先全部亮,接著(zhù)8個(gè)燈從左往右依次熄滅,即Q0.0-Q0.7每隔1s熄滅一個(gè)燈。

那么這就是移位指令和循環(huán)指令了,今天主要是學(xué)習指令的基本使用,這里還有移位寄存器指令沒(méi)有學(xué)習,那么明天就學(xué)習一下移位寄存器,并且后面再來(lái)學(xué)一下對這些指令的應用。
聯(lián)系客服