Chaper 7 Assembly Language Programming for PIC18F: Part 2
PIC18F Jump/Branch instructions
GOTO k ( e.g. GOTO start )
- 會跳到一個 21-bit address。
- 會從 20-bit 的 k 讀進 PC 的前 20-bit 裡面,而最後一位放 0 ,這樣保證 PC 裡面一定會是偶數。
Bcc d ( e.g. Bcc start )(這是通式)
- 如果 cc 是 true 的話,會 branch 到 d (8-bit signed number )這個位置。
- 計算: PC = PC + 2 + 2 * d
- 這個 instruction 是一個 two-cycle instruction 。
- 共有:
- BC
- BNC
- BZ
- BNZ
- BN
- BNN
- BOV
- BNOV
去看一下第 8 頁 ppt 的例子,計算看看會比較了解。
BRA d ( e.g. BRA start )
- 會直接 branch 到 ( PC + 2 + 2 * d )的位置。
- d is a signed 11-bit number.
Test, Compare, and Skip instructions
Test Bit and Skip
BTFSC F, b, a ( e.g. BTFSC 0x40, 5 )
- 會先檢查 F register 的第 b 個 bit ,如果是 0 就跳過下一個指令。
- 常被用在 GOTO 和 BRA 前面。
BTFSS F, b, a ( e.g. BTFSS 0x70, 0 )
- 會先檢查 F register 的第 b 個 bit ,如果是 1 就跳過下一個指令。
Compare and Skip
- ⭐不會影響任何 STATUS register 的 flag 。
CPFSEQ F, a ( e.g. CPFSEQ 0x20 )
- 會比較 F register 和 WREG register 有沒有相等。(會透過 unsigned subtraction )
- 如果 F = WREG 就會跳過下一個指令。
CPFSGT F, a ( e.g. CPFSGT 0x10 )
- 會讓 F register 和 WREG register 比大小。(透過 unsigned subtraction )
- 如果 F > WREG 會跳過下一個指令。
CPFSLT F, a ( e.g. CPFSLT 0x70 )
- 會讓 F register 和 WREG register 比大小。(透過 unsigned subtraction )
- 如果 F < WREG 會跳過下一個指令。
Decrease and Skip
DECFSNZ F, d, a ( e.g. DECFSNZ 0x30, W or DECFSNZ 0x30, F )
- 會先把 F register 中的值先減 1 ,如果結果不為 0 就會跳過下一個指令。
DECFSZ F, d, a ( e.g. DECFSZ 0x30, W or DECFSNZ 0x30, F )
- 會先把 F register 中的值先減 1 ,如果結果為 0 就會跳過下一個指令。
Increase and Skip
INCFSNZ F, d, a ( e.g. INCFSNZ 0x40, W or INCFSNZ 0x40, F )
- 會把 F register 中的值加 1 ,如果結果不為 0 就會跳過下一個指令。
INCFSZ F, d, a ( e.g. INCFSZ 0x40, W or INCFSZ 0x40, F )
- 會把 F register 中的值加 1 ,如果結果為 0 就會跳過下一個指令。
這 4 個 Increase/Decrease and Skip instruction 可以用來當作一個跑 n 次的 loop 。
Test and Skip
TSTFSZ F, a ( e.g. TSTFSZ 0x60 )
- 會去檢查 F register ,如果其值為 0 ,就會跳過下一個指令。
PIC18F Table Read/Write Instruction
-
分別有四種 Table Read/Write instructions ,靠 8-bit TABLAT register 和 21-bit TBLPTR 做轉換。 ( TBALAT 就是底下的 table latch )
-
TBLPTR 包含三個 register ,由 high to low 分別為: TBLPTRU TBLPTRH TBLPTRL 。
-
有兩種 instruction 去轉換 program meory and data memory :
- Table Read ( TBLRD )
- 讓 program memory ( 16-bit ) 轉成 data memory ( 8-bit )。
- 由四種 addressing mode 實做而成( register indirect, postincrement, postdecrement, and predecrement )。
- Table Write ( TBLWT )
- 讓 data memory ( 8-bit )轉成 program memory ( 16-bit )。
-
Table operation work with data bytes.又因為 table block 只有 data 沒有 program instruction 所以他可以 start and end at any byte address.
TBLRD*
- 把 Table pointer 指到地址裡面的值,存到 Table latch 裡面。
TBLRD*+
- 把 Table pointer 指到地址裡面的值,存到 Table latch 裡面,然後把 Table pointer 裡面的值加 1 。
TBLRD*-
- 把 Table pointer 指到地址裡面的值,存到 Table latch 裡面,然後把 Table pointer 裡面的值減 1 。
TBLRD+*
- 把 Table pointer 裡面的值先加 1 ,然後把 Table pointer 指到地址裡面的值,存到 Table latch 裡面。
TBLWT*
- 把 Table latch 裡面的值,存到現在 Table pointer 指到的地址裡面。
TBLWT*+
- 把 Table latch 裡面的值,存到現在 Table pointer 指到的地址裡面,然後把 Table pointer 裡面的地址加 1 。
TBLWT*-
- 把 Table latch 裡面的值,存到現在 Table pointer 指到的地址裡面,然後把 Table pointer 裡面的地址加 1 。
TBLWT+*
- 把 Table pointer 裡面的地址先加 1 ,然後把 Table latch 裡面的值,存到 Table pointer 加完 1 後指到的地址裡面。
注意!!!似乎沒有 TBLRD-* and TBLWT-*
我看不太懂 ppt 裡面的 example ,懂的話記得跟我講一下 QQ
PIC18F Subroutine Instructions
- 包含 PUSH/POP and subroutine CALL/RETURN instructions 。
- subroutine instructions 自動使用 hardware stack 去實做; programmer 可以自己寫 software stack 去存 local variables 。
- CALL and RETURN 要 two instruction cycles 。
- POP and PUSH 要 one instruction cycle 。
- CALL is two words.
PIC18F Hardware vs. Software stack
Hardware stack
- Hardware stack 是由 31 個 21-bit registers 所組成。
- ⭐ Hardware stack 不屬於 data memory 或 program memory 。
- the stack size 和 the size of PC 一樣(同為 21-bit )。
- 而 SP ( Stack Pointer )是 5-bit wide ( 00001 to 11111 )。
- " 在程式 call subroutine 時會用到 ",但是如果還要儲存 local variable 的話空間可能會不夠,所以可以使用 software stack 。
Software stack
- 使用 File Select Register ( FSRs ) 來當作 SP 。
- 任何 bank 的 data registers 都可以拿來當作 software stack 的儲存位置。
- 可以由 HIGH 存到 LOW memory ( Top of stack )或 LOW 存到 HIGH memory ( Buttom of the stack )。
過程
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
- PC 在 0x000100 時遇到 subroutine call ,所以把下一個 0x000102 存到 STKPTR 中並把 STKPTR + 1 。
- 再來就直接改掉 PC 中要到的位置就好了(圖中為 0x000200 )。
Multiplication and Division algorthms
- PIC18F 只提供 unsigned multiplication instruction 其他的乘除法都不提供。
Signed Multiplication algorithm
設兩數字 M 和 Q
- 如果 ,計算 的 two's complement 。
- 如果 ,計算 的 two's complement 。
- 將兩數的 n-1 bits 以 unsigned multiplication 相乘。
- 計算 。
- 如果 ,計算步驟 3 的 two's complement 及為答案。
Unsigned Division algorithm
- 將除數和被除數做比較。
- 如果相等,將 counter 加 1 ,然後做 (被除數 - 除數) ,將結果存於被除數的 register 中。
- 如果 被除數 > 除數,將 counter 加 1 ,然後做 (被除數 - 除數),將結果存於被除數的 register 中。
- 回到步驟 1 ,直到 被除數 < 餘數。
- 當結束時, counter 裡面存的就是 quotient ,而 data register 裡面的是 remainder 。
Signed Division algorithm
就跟 signed multiplication 一樣只是過程變成除法而已。
Delay Routine
- 一般的 Delay Routine 是使用作減法的 machine cycles 來實現。