280 likes | 425 Vues
HT48R70A Instruction Set. Program Develop Flow. 指令語法. [ 標記 ] [ 指令 or 假指令 ] [ 運算元 ] [ 註解 ]. EX:. Delay: MOV A, 30 ; move value 30 to Accumulator. 上述四個成員並不一定都要指定。 成員的字型是無大小寫之分 假指令用來告知組譯器如何編譯 指令則是告知微控制器如何執行 運算元 (operand) :提供假指令或指令所需的資料。 任何分號 ( ; ) 之後的文字均視為註解。. 假指令.
E N D
指令語法 [標記] [指令or假指令] [運算元] [註解] EX: Delay: MOV A, 30 ; move value 30 to Accumulator • 上述四個成員並不一定都要指定。 • 成員的字型是無大小寫之分 • 假指令用來告知組譯器如何編譯 • 指令則是告知微控制器如何執行 • 運算元(operand):提供假指令或指令所需的資料。 • 任何分號(;)之後的文字均視為註解。
假指令 • 假指令: 用來告知組譯器如何來組譯程式 • 檔案控制的假指令 • INCLUDEfile-name or INCLUDE “file-name” • 將file-name的內容,嵌入至目前的原始碼檔案,並被視為原始碼。 • 程式假指令 • END • 宣告程式的結束,因此最好不要在含入檔(included file)中加入這個指令。 • ORG expression • 告知組譯器將下面的程式碼儲放到ROM的何位址 • EX: ORG 000h JMP Start ORG 08h Start: … • name PROC v.s. name ENDP • 用來定義副程式之範圍 • EX: Delay PROC MOV a, 20 … Delay ENDP
指令:●SECTION 格式: name ●SECTION ‘class’ • Class:用於指定以下的程式碼屬性,其名稱有CODE與DATA。 • CODE:表此段程式碼為程式段,是放在ROM記憶體內。 • DATA:表此段程式碼為資料段,是放在RAM記憶體內。 指令: DC 格式:[label:] DC expression1 [,expression2 [,...]] • 保留程式記憶體(ROM)之空間(此假指令只能用於code類別之程式段) • label代表該位址之標名,expression1 及expression2 的值是要儲存至ROM的內容。 • Ex ORG LASTPAGE table: DC 0128H, 025CH, 28H • 在此範例中,組譯器會在last page(0x1F00~0x1FFF)內預留三個位址的程式記憶體空間、並將0128H 、025CH和0028H 儲存至這三個位址中。 16-bit 0x1F00 0x01 0x28 0x02 0x5C 0x00 0x28
指令:DBIT、DB、DW、DUP 格式:[name] DB value1 [,value2 [,...]] [name] DW value1 [,value2 [,...]] [name] DBIT [name] DB repeated-count DUP(?) [name] DW repeated-count DUP(?) • 在資料或程式記憶體(ROM or RAM)內保留一個位元(DBIT)、一個位元組(DB)或二個位元組(DW)的記憶體空間 • name (如果有指定name)為該位址之標名, • value1、…代表在保留的記憶體位址中存入之數值 • 注意:如果保留的是資料記憶體(RAM)空間的話,則不可以指定存入之value!此時之value必須以「?」取代。 • 而DUP代表此型態(BYTE或WORD)的記憶體要保留幾組。 MY_DATA .SECTION ‘DATA’ BUF1 DB ? BUF2 DW ? FLAG1 DBIT ARRAY DB 20 DUP(?) MY_CODE .SECTION ‘CODE’ TAB_1 DW 1,2,4,8, 16, 32, 64, 128, 256 TAB_2 DW ‘ABCDEFG’
指令: LOW、HIGH 格式: LOW expression、HIGH expression • 用來取得expression之高(HIGH)、低(LOW)位元組 • EX MAX EQU 8822H HI_BYTE EQU HIGH MAX ; HI_BYTE = 88H LO_BYTE EQU LOW MAX ; LO_BYTE = 22H • $: 表示目前指令的位址 (PC-1的位址) • ex: MOV AX, 20 JMP $
ADC A,[90h] Add a,[90h] Addm a,[90h] Add a, 20H ADCM A,[90h] data memory data memory data memory data memory A 80H 20H 20H 90H 80H A 80H 20H 90H 20H 90H 20H 90H A 80H A 80H A 80H 80H 20H + 80H 20H 80H 20H 80H 20H + A A0H C = 1 + + C = 1 + 90H A0H A A1H A A0H 90H A1H SUB A,20h SUBM A,[90h] SUB A,[90h] SBCM A,[90h] SBC A,[90h] data memory data memory data memory data memory A 80H 20H 80H 20H 90H - 20H 90H 20H 90H A 80H 20H 90H A 80H A 80H A 80H 80H 20H A 60H 80H 20H 80H 20H 80H 20H C = 0 - C = 0 - - - 90H 5FH A 60H A 5FH 90H 60H
ADD A,[90H] INC [90H] DEC [90H] DECA [90H] INCA [90H] data memory data memory data memory data memory data memory A 29H 90H 20H 90H 21H 20H 90H 65H 21H 1 1 1 1 65H 29H 20H 21H 20H 21H + - + + - C = 0 AC =0 8EH A 90H 21H A 90H 20H 21H A 20H DAA [90H] 90H 94H 動作:DAA只有在以BCD格式作加法後,立即執行此指令,才會有正確結果。 範例:ADD A,[90H] ; A=0x65, [90H]=0x29 DAA [90H] ADD A, [90H]後的A值為8EH DAA [90H] 後的值為 65+29 = 94 (即十進位的加法運算)。
XOR A, [90H] OR A, [90H] AND A, [90H] A: 10001111 (2) [90H] : 01001010 (2) AND: 00001010 (2) A: 10001111 (2) [90H] : 01001010 (2) XOR: 11000101 (2) A: 10001111 (2) [90H] : 01001010 (2) OR: 11001111 (2) A 0AH A C5H A CFH XORM A, [90H] ORM A, [90H] ANDM A, [90H] A: 10001111 (2) [90H] : 01001010 (2) AND: 00001010 (2) A : 10001111 (2) [90H] : 01001010 (2) XORM: 11000101 (2) A: 10001111 (2) [90H] : 01001010 (2) OR: 11001111 (2) 0AH [90H] C5H [90H] [90H] CFH
XOR A, x OR A, x AND A, x A: 10001111 (2) x : 01001010 (2) AND: 00001010 (2) A: 10001111 (2) x : 01001010 (2) XOR: 11000101 (2) A: 10001111 (2) x : 01001010 (2) OR: 11001111 (2) A 0AH A C5H A CFH CPL [m] CPLA [m] [90H]: 10001000 (2) [90H]: 10001000 (2) 1’S 1’S 01110111 (2) 01110111 (2) [90H]: 77H A: 77H
XOR 的用途 • 判斷二暫存器的內容是否完全相同 • M1 + M2 = 0 M1=M2 • 提供反邏輯NOT運算 • ~a = a + 1 • 二個暫存器的內容對調 c = a + b c + a = b, c + b = a EX: mov a, [90h] xor a, [91h] xorm a,[90h] xorm a,[91h] • 二記憶體內容中最低二位二互換 mov a, [90h] xor a, [91h] and a, 00000011b xorm a,[90h] xorm a,[91h
b7 b6 b5 b4 b3 b2 b1 b0 RL [m] b7 b6 b5 b4 b3 b2 b1 b0 RLA [m] A : b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 C RLC [m]
C b7 b6 b5 b4 b3 b2 b1 b0 RLCA [m] A : b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 RR [m] b7 b6 b5 b4 b3 b2 b1 b0 RRA [m] A : b7 b6 b5 b4 b3 b2 b1 b0
b7 b6 b5 b4 b3 b2 b1 b0 C RRC [m] C b7 b6 b5 b4 b3 b2 b1 b0 RRCA [m] A : b7 b6 b5 b4 b3 b2 b1 b0
定址模式 • 立即定址(Immediate addressing) • MOV A, 20H A=20H • 直接定址(Direct addressing) • MOV A, [30H] • 間接定址(Indirect addressing) • MOV A, 31H • MOV MP0, A • MOV A, 40H • MOV IAR0, A • 指標定址(Pointer addressing) 內部RAM A 30H 55H 55H 31H 40H 40H
指標定址法 • 對HOTEK晶片而言, 只有ROM的內容才具有指標定址法 • 使用指標暫存器 TBLP, 配合 查表指令 TABRDC、TABRDL) ORG 100H ORG 170H MOV A, 70H DC 011H MOV TBLP, A DC 022H TABRDC [30H] DC 033H • 目前頁為100h + TBLP (70H) = 170H • 所以ROM[170H]=0033H RAM[30H]= 33, TABH=00
計算式跳躍(Computation jump) • 利用改變PCL來決定LED的顯示內容 MAIN: CLR INDEX MOV A, 06 MOV COUNT, A LOOP: MOV A, INDEX CALL GET-VALUE MOV PA, A CALL DELAY INC INDEX SDZ COUNT JMP LOOP JMP MAIN GET-VALUE PROC ADDM A, PCL RET A,10000001B RET A,01000010B RET A,00100100B RET A,00011000B RET A,00100100B RET A,01000010B GET-VALUE ENDP IR MEM[PC] PC PC+1 * 讀取指令時, PC內容即加1
計算式跳躍 • 利用ADDM A, PCL指令達到控制程式流程的方式 ADDM A, PCL ; PCL=Acc+PCL JMP EQU-0 ; Jump to EQU-0 if Acc=0 JMP EQU-1 ; Jump to EQU-1 if Acc=1 JMP EQU-2 ; Jump to EQU-2 if Acc=2 JMP EQU-3 ; Jump to EQU-3 if Acc=3 ….
軟體時間延遲--指令執行週期之計算 • Holtek的所有指令大都是1個指令週期,除了該指令的執行會破壞執行順序 ,則為2個指令週期 • 所謂 破壞執行順序 是指:他的下一個執行之指令不是 PC+1 • 即程式分支指令: • JMP, SZ [m], SZA [m], SZ [m].i, SNZ [m].i, SIZ [m], SDZ [m], SIZA [m], SDZA [m], Call addr, RET, RET A, x, RETI • 若供給 Holtek 晶片的工作頻率fsys=4MHz, 則其內部指令工作頻率fsys/4=1MHz • 指令週期為1/1MHz=1us
指令週期計算 指令週期 pa equ [12h] 0 pac equ [13h] 0 org 0h 0 jmp reset 2 reset: mov a,00h 1 mov pac,a 1 start: clr pa.0 1 call delay 2 set pa.0 1 call delay 2 jmp start 2 delay: mov a,07fh 1 mov [61h],a 1 wait_1: mov a,0ffh 1 mov [60h],a 1 wait_2: sdz [60h] 1 or 2 jmp wait_2 2 sdz [61h] 1 or 2 jmp wait_1 2 ret 2 Delay= 1+1+Y+2 Y= (7F-1)*(1+1+X+1+2)+2 or 7F*(1+1+X+1+2)-1 X= (FF-1)*3 + 2 or FF*3 -1
隨堂測驗-計算執行下列程式到ProgEnd結束所需時間(若fsys=4MHz)隨堂測驗-計算執行下列程式到ProgEnd結束所需時間(若fsys=4MHz) Variable .Section ‘DATA’ Delta db ? Prog .Section ‘CODE’ Main: MOV A,200 CALL Delay ProgEnd: NOP Delay PROC MOV Delta, A SDZ Delta JMP $-1 RET Delay ENDP END