8051 的執行

壹、引言

微處理器的基本組成電路單位是cmos,正如人體的基本組成是細胞一樣。一、兩個cmos只能構成一個緩衝器或反向器的電路,數萬顆cmos的電路就可以組成一個可以自行抓取指令並執行指令的微處理器,而程式是運作在微處理器上面的靈魂。了解程式碼在8051上運作的過程將幫助我們寫出更好的8051程式。


貳、指令的抓取與執行

程式碼的執行可以切成很多的指令,指令又分成指令的機械碼和指令的參數。

指令抓取細部動作圖解:

  • 8051核心板電路
  • 位址輸出時序
  • 位址拴鎖時序
  • 程式碼讀取信號時序
  • rom程式碼輸出信號時序

一、8051核心板電路
這個電路是一塊8051核心板的電路,上面接有外部rom、外部ram、8255、lcd module(4x20)。

8051核心版

一、位址輸出時序
輸出程式計數器PC的值到P0、P2上。

地址值輸出

二、位址拴鎖時序
輸出位址拴鎖信號ale到74373以鎖住目前在P0上的低位元組位址值。

地址鎖住信號

三、程式碼讀取信號時序
輸出psen信號,rom接收到就會將rom data輸出到系統匯流排上。

程式碼讀取信號

四、rom程式碼輸出信號時序
唯讀記憶體rom將rom data輸出到系統匯流排上,8051的P0會把資料接受當成指令參數並執行之。

程式碼資料輸出

五、指令抓取範例
8051的指令屬於複雜指令集架構(cisc),指令的長度不一定一樣。當8051抓取的指令的第一個機械碼的時候,就要解出後面還有幾個參數要抓取,並進行抓取的動作。每次指令抓取(fetch)的時間應該是2 clock,我以nop、ajmp、ljmp這3個指令來解釋8051指令的抓取與執行。

每一個fetch都是上面四個時序的連續動作

指令執行

指令nop是一個1 byte的無動作指令,8051必須先到 ROM中抓取指令,這個指令抓取需要2 clocks。之後,在8051裡面花10 clocks 執行該指令。這樣的過程總共需要12clocks。

指令ajmp是一個2 bytes的跳躍指令,8051必須到先到ROM中抓取指令。因為匯流排是8位元,所以必須抓兩次,需要4 clocks。之後,在8051裡面再花20 clocks執行該指令。共需要24clocks。

指令ljmp是一個3bytes的跳躍指令,8051必須到先到ROM中抓取指令。因為匯流排是8位元,所以必須抓三次,需要6 clocks。之後,在8051裡面再花20clocks執行該指令。共需要24clocks。

如果我們想要到一個ajmp可以到達的地方卻用ljmp去寫的話,雖然結果都一樣,但是ljmp會花費更多的程式碼去執行這樣的指令。

指令執行動作說明:

指令抓取動作完成後,接著就是指令的執行了。

指令執行

指令執行是屬於8051核心電路的動作,有些指令不能藉由外面的信號解讀,有些可以。指令即使可以從外面信號解讀,但有些動作還是藏在8051核心內部,那些動作必須靠fpga配合邏輯分析儀器才能看得到。

指令movc的外部信號動作和指令抓取是一樣的,只是movc會把P0得到的資料再往acc塞,而指令抓取動作不需要這樣做。所以movc的動作會比指令抓取動作還要久。

指令movx的外部動作和指令抓取類似,指令抓取是靠psen而movx是靠/rd、/wr做讀寫動作。並且movx指令會把P0上面抓到的資料往acc塞,而指令抓去動作不會這樣做,所以movx的動作會比指令抓取動作需要更多的時間。

從下表,我們可以知道每個指令的執行時間。我們也可以觀察到同一個指令卻有不同的執行時間的問題。

8051指令執行時間表

指令(instruction)指令機械碼位元組數(bytes)機械週期數(machine cycle)時鐘數(clock)
nop0x001112
ajmp address110x012224
ljmp address160x023224
rr a0x031112
inc a0x041112
inc direct80x052224
inc @r00x061112
inc @r10x071112
inc r00x081112
inc r10x091112
inc r20x0a1112
inc r30x0b1112
inc r40x0c1112
inc r50x0d1112
inc r60x0e1112
inc r70x0f1112
jbc bit_addr,relative_addr80x103224
acall relative_addr110x112224
lcall address160x123224
rrc a0x131112
dec a0x141112
dec direct80x152112
dec @r00x161112
dec @r10x171112
dec r00x181112
dec r10x191112
dec r20x1a1112
dec r30x1b1112
dec r40x1c1112
dec r50x1d1112
dec r60x1e1112
dec r70x1f1112
jb bit,relative_addr80x203224
ajmp relative_addr110x212224
ret0x221224
rl a0x231112
add a,#data80x122112
add a,direct80x252112
add a,@r00x261112
add a,@r10x271112
add a,r00x281112
add a,r10x291112
add a,r20x2a1112
add a,r30x2b1112
add a,r40x2c1112
add a,r50x2d1112
add a,r60x2e1112
add a,r70x2f1112
jnb bit,relative_addr80x303224
acall relative_addr110x312224
reti0x321224
rlc a0x331112
addc a,#data0x342112
addc a,direct80x352112
addc a,@r00x361112
addc a,#r10x371112
addc a,r00x381112
addc a,r10x391112
addc a,r20x3a1112
addc a,r30x3b1112
addc a,r40x3c1112
addc a,r50x3d1112
addc a,r60x3e1112
addc a,r70x3f1112
jc relative_addr80x402224
ajmp relative_addr110x412224
orl direct8,a0x422112
orl direct8,#data0x433224
orl a,#data0x442112
orl a,direct80x452112
orl a,@r00x461112
orl a,@r10x471112
orl a,r00x481112
orl a,r10x491112
orl a,r20x4a1112
orl a,r30x4b1112
orl a,r40x4c1112
orl a,r50x4d1112
orl a,r60x4e1112
orl a,r70x4f1112
jnc relative_addr80x502224
acall relative_addr110x512224
anl direct8,a0x522112
anl direct8,#data0x533224
anl a,#data0x542112
anl a,direct80x552112
anl a,@r00x561112
anl a,@r10x571112
anl a,r00x581112
anl a,r10x591112
anl a,r20x5a1112
anl a,r30x5b1112
anl a,r40x5c1112
anl a,r50x5d1112
anl a,r60x5e1112
anl a,r70x5f1112
jz relative_addr80x602224
ajmp relative_addr110x612224
xrl direct8,a0x622112
xrl direct8,#data0x633224
xrl a,#data0x642112
xrl a,direct80x652112
xrl a,@r00x661112
xrl a,@r10x671112
xrl a,r00x681112
xrl a,r10x691112
xrl a,r20x6a1112
xrl a,r30x6b1112
xrl a,r40x6c1112
xrl a,r50x6d1112
xrl a,r60x6e1112
xrl a,r70x6f1112
jnz0x702224
acall0x712224
orl0x722224
jmp0x731224
mov direct8,a0x742112
mov direct8,#data0x753224
mov a,#data0x762112
mov a,direct80x772112
mov a,r00x782112
mov a,r10x792112
mov a,r20x7a2112
mov a,r30x7b2112
mov a,r40x7c2112
mov a,r50x7d2112
mov a,r60x7e2112
mov a,r70x7f2112
sjmp relative_addr80x802224
ajmp relative_addr110x812224
anl c,bit0x822224
movc a,@a+pc0x831224
div ab0x841448
mov direct8,direct80x853224
mov direct8,@r00x862224
mov direct8,@r10x872224
mov direct8,r00x882224
mov direct8,r10x892224
mov direct8,r20x8a2224
mov direct8,r30x8b2224
mov direct8,r40x8c2224
mov direct8,r50x8d2224
mov direct8,r60x8e2224
mov direct8,r70x8f2224
mov dptr,#data160x903224
acall relative_addr110x912224
mov bit,c0x922224
movc a,@a+dptr0x931224
subb a,#data0x942112
subb a,data0x952112
subb a,@r00x961112
subb a,@r10x971112
subb a,r00x981112
subb a,r10x991112
subb a,r20x9a1112
subb a,r30x9b1112
subb a,r40x9c1112
subb a,r50x9d1112
subb a,r60x9e1112
subb a,r70x9f1112
orl c,bit0xa02224
ajmp relative_addr110xa12224
mov c,bit0xa22112
inc dptr0xa31224
mul ab0xa41448
reserve0xa5xxx
mov @r0,direct80xa62224
mov @r1,direct80xa72224
mov r0,direct80xa82224
mov r1,direct80xa92224
mov r2,direct80xaa2224
mov r3,direct80xab2224
mov r4,direct80xac2224
mov r5,direct80xad2224
mov r6,direct80xae2224
mov r7,direct80xaf2224
anl c,bit0xb02224
acall relative_addr110xb12224
cpl bit0xb22112
cpl c0xb31112
cjne a,#data,relative_addr80xb43224
cjne a,direct8,relative_addr80xb53224
cjne @r0,#data,relative_addr80xb63224
cjne @r1,#data,relative_addr80xb73224
cjne r0,#data,relative_addr80xb83224
cjne r1,#data,relative_addr80xb93224
cjne r2,#data,relative_addr80xba3224
cjne r3,#data,relative_addr80xbb3224
cjne r4,#data,relative_addr80xbc3224
cjne r5,#data,relative_addr80xbd3224
cjne r6,#data,relative_addr80xbe3224
cjne r7,#data,relative_addr80xbf3224
push direct80xc02224
ajmp relative_addr110xc12224
clr bit0xc22112
clr c0xc31112
swap a0xc41112
xch a,direct80xc52112
xch a,@r00xc61112
xch a,@r10xc71112
xch a,r00xc81112
xch a,r10xc91112
xch a,r20xca1112
xch a,r30xcb1112
xch a,r40xcc1112
xch a,r50xcd1112
xch a,r60xce1112
xch a,r70xcf1112
pop data0xd02224
acall relative_addr110xd12224
setb bit0xd22112
setb c0xd31112
da a0xd41112
djnz direct8,relative_addr80xd53224
xchd a,@r00xd61112
xchd a,@r10xd71112
djnz r0,realtive_addr80xd82224
djnz r1,realtive_addr80xd92224
djnz r2,realtive_addr80xda2224
djnz r3,realtive_addr80xdb2224
djnz r4,realtive_addr80xdc2224
djnz r5,realtive_addr80xdd2224
djnz r6,realtive_addr80xde2224
djnz r7,realtive_addr80xdf2224
movx a,@dptr0xe01224
ajmp relative_addr110xe12224
movx a,@r00xe21224
movx a,@r10xe31224
clr a0xe41112
mov a,direct80xe52112
mov a,@r00xe61112
mov a,@r10xe71112
mov a,r00xe81112
mov a,r10xe91112
mov a,r20xea1112
mov a,r30xeb1112
mov a,r40xec1112
mov a,r50xed1112
mov a,r60xee1112
mov a,r70xef1112
movx @dptr,a0xf01224
acall relative_addr110xf12224
movx @r0,a0xf21224
movx @r1,a0xf31224
cpl a0xf41112
mov direct8,a0xf52112
mov @r0,a0xf61112
mov @ra,a0xf71112
mov r0,a0xf81112
mov r1,a0xf91112
mov r2,a0xfa1112
mov r3,a0xfb1112
mov r4,a0xfc1112
mov r5,a0xfd1112
mov r6,a0xfe1112
mov r7,a0xff1112