|
貳、指令的抓取與執行
程式碼的執行可以切成很多的指令,指令又分成指令的機械碼和指令的參數。
指令抓取細部動作圖解:
- 8051核心板電路
- 位址輸出時序
- 位址拴鎖時序
- 程式碼讀取信號時序
- rom程式碼輸出信號時序
一、8051核心板電路 這個電路是一塊8051核心板的電路,上面接有外部rom、外部ram、8255、lcd module(4x20)。
|
一、位址輸出時序 輸出程式計數器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) |
nop | 0x00 | 1 | 1 | 12 |
ajmp address11 | 0x01 | 2 | 2 | 24 |
ljmp address16 | 0x02 | 3 | 2 | 24 |
rr a | 0x03 | 1 | 1 | 12 |
inc a | 0x04 | 1 | 1 | 12 |
inc direct8 | 0x05 | 2 | 2 | 24 |
inc @r0 | 0x06 | 1 | 1 | 12 |
inc @r1 | 0x07 | 1 | 1 | 12 |
inc r0 | 0x08 | 1 | 1 | 12 |
inc r1 | 0x09 | 1 | 1 | 12 |
inc r2 | 0x0a | 1 | 1 | 12 |
inc r3 | 0x0b | 1 | 1 | 12 |
inc r4 | 0x0c | 1 | 1 | 12 |
inc r5 | 0x0d | 1 | 1 | 12 |
inc r6 | 0x0e | 1 | 1 | 12 |
inc r7 | 0x0f | 1 | 1 | 12 |
jbc bit_addr,relative_addr8 | 0x10 | 3 | 2 | 24 |
acall relative_addr11 | 0x11 | 2 | 2 | 24 |
lcall address16 | 0x12 | 3 | 2 | 24 |
rrc a | 0x13 | 1 | 1 | 12 |
dec a | 0x14 | 1 | 1 | 12 |
dec direct8 | 0x15 | 2 | 1 | 12 |
dec @r0 | 0x16 | 1 | 1 | 12 |
dec @r1 | 0x17 | 1 | 1 | 12 |
dec r0 | 0x18 | 1 | 1 | 12 |
dec r1 | 0x19 | 1 | 1 | 12 |
dec r2 | 0x1a | 1 | 1 | 12 |
dec r3 | 0x1b | 1 | 1 | 12 |
dec r4 | 0x1c | 1 | 1 | 12 |
dec r5 | 0x1d | 1 | 1 | 12 |
dec r6 | 0x1e | 1 | 1 | 12 |
dec r7 | 0x1f | 1 | 1 | 12 |
jb bit,relative_addr8 | 0x20 | 3 | 2 | 24 |
ajmp relative_addr11 | 0x21 | 2 | 2 | 24 |
ret | 0x22 | 1 | 2 | 24 |
rl a | 0x23 | 1 | 1 | 12 |
add a,#data8 | 0x12 | 2 | 1 | 12 |
add a,direct8 | 0x25 | 2 | 1 | 12 |
add a,@r0 | 0x26 | 1 | 1 | 12 |
add a,@r1 | 0x27 | 1 | 1 | 12 |
add a,r0 | 0x28 | 1 | 1 | 12 |
add a,r1 | 0x29 | 1 | 1 | 12 |
add a,r2 | 0x2a | 1 | 1 | 12 |
add a,r3 | 0x2b | 1 | 1 | 12 |
add a,r4 | 0x2c | 1 | 1 | 12 |
add a,r5 | 0x2d | 1 | 1 | 12 |
add a,r6 | 0x2e | 1 | 1 | 12 |
add a,r7 | 0x2f | 1 | 1 | 12 |
jnb bit,relative_addr8 | 0x30 | 3 | 2 | 24 |
acall relative_addr11 | 0x31 | 2 | 2 | 24 |
reti | 0x32 | 1 | 2 | 24 |
rlc a | 0x33 | 1 | 1 | 12 |
addc a,#data | 0x34 | 2 | 1 | 12 |
addc a,direct8 | 0x35 | 2 | 1 | 12 |
addc a,@r0 | 0x36 | 1 | 1 | 12 |
addc a,#r1 | 0x37 | 1 | 1 | 12 |
addc a,r0 | 0x38 | 1 | 1 | 12 |
addc a,r1 | 0x39 | 1 | 1 | 12 |
addc a,r2 | 0x3a | 1 | 1 | 12 |
addc a,r3 | 0x3b | 1 | 1 | 12 |
addc a,r4 | 0x3c | 1 | 1 | 12 |
addc a,r5 | 0x3d | 1 | 1 | 12 |
addc a,r6 | 0x3e | 1 | 1 | 12 |
addc a,r7 | 0x3f | 1 | 1 | 12 |
jc relative_addr8 | 0x40 | 2 | 2 | 24 |
ajmp relative_addr11 | 0x41 | 2 | 2 | 24 |
orl direct8,a | 0x42 | 2 | 1 | 12 |
orl direct8,#data | 0x43 | 3 | 2 | 24 |
orl a,#data | 0x44 | 2 | 1 | 12 |
orl a,direct8 | 0x45 | 2 | 1 | 12 |
orl a,@r0 | 0x46 | 1 | 1 | 12 |
orl a,@r1 | 0x47 | 1 | 1 | 12 |
orl a,r0 | 0x48 | 1 | 1 | 12 |
orl a,r1 | 0x49 | 1 | 1 | 12 |
orl a,r2 | 0x4a | 1 | 1 | 12 |
orl a,r3 | 0x4b | 1 | 1 | 12 |
orl a,r4 | 0x4c | 1 | 1 | 12 |
orl a,r5 | 0x4d | 1 | 1 | 12 |
orl a,r6 | 0x4e | 1 | 1 | 12 |
orl a,r7 | 0x4f | 1 | 1 | 12 |
jnc relative_addr8 | 0x50 | 2 | 2 | 24 |
acall relative_addr11 | 0x51 | 2 | 2 | 24 |
anl direct8,a | 0x52 | 2 | 1 | 12 |
anl direct8,#data | 0x53 | 3 | 2 | 24 |
anl a,#data | 0x54 | 2 | 1 | 12 |
anl a,direct8 | 0x55 | 2 | 1 | 12 |
anl a,@r0 | 0x56 | 1 | 1 | 12 |
anl a,@r1 | 0x57 | 1 | 1 | 12 |
anl a,r0 | 0x58 | 1 | 1 | 12 |
anl a,r1 | 0x59 | 1 | 1 | 12 |
anl a,r2 | 0x5a | 1 | 1 | 12 |
anl a,r3 | 0x5b | 1 | 1 | 12 |
anl a,r4 | 0x5c | 1 | 1 | 12 |
anl a,r5 | 0x5d | 1 | 1 | 12 |
anl a,r6 | 0x5e | 1 | 1 | 12 |
anl a,r7 | 0x5f | 1 | 1 | 12 |
jz relative_addr8 | 0x60 | 2 | 2 | 24 |
ajmp relative_addr11 | 0x61 | 2 | 2 | 24 |
xrl direct8,a | 0x62 | 2 | 1 | 12 |
xrl direct8,#data | 0x63 | 3 | 2 | 24 |
xrl a,#data | 0x64 | 2 | 1 | 12 |
xrl a,direct8 | 0x65 | 2 | 1 | 12 |
xrl a,@r0 | 0x66 | 1 | 1 | 12 |
xrl a,@r1 | 0x67 | 1 | 1 | 12 |
xrl a,r0 | 0x68 | 1 | 1 | 12 |
xrl a,r1 | 0x69 | 1 | 1 | 12 |
xrl a,r2 | 0x6a | 1 | 1 | 12 |
xrl a,r3 | 0x6b | 1 | 1 | 12 |
xrl a,r4 | 0x6c | 1 | 1 | 12 |
xrl a,r5 | 0x6d | 1 | 1 | 12 |
xrl a,r6 | 0x6e | 1 | 1 | 12 |
xrl a,r7 | 0x6f | 1 | 1 | 12 |
jnz | 0x70 | 2 | 2 | 24 |
acall | 0x71 | 2 | 2 | 24 |
orl | 0x72 | 2 | 2 | 24 |
jmp | 0x73 | 1 | 2 | 24 |
mov direct8,a | 0x74 | 2 | 1 | 12 |
mov direct8,#data | 0x75 | 3 | 2 | 24 |
mov a,#data | 0x76 | 2 | 1 | 12 |
mov a,direct8 | 0x77 | 2 | 1 | 12 |
mov a,r0 | 0x78 | 2 | 1 | 12 |
mov a,r1 | 0x79 | 2 | 1 | 12 |
mov a,r2 | 0x7a | 2 | 1 | 12 |
mov a,r3 | 0x7b | 2 | 1 | 12 |
mov a,r4 | 0x7c | 2 | 1 | 12 |
mov a,r5 | 0x7d | 2 | 1 | 12 |
mov a,r6 | 0x7e | 2 | 1 | 12 |
mov a,r7 | 0x7f | 2 | 1 | 12 |
sjmp relative_addr8 | 0x80 | 2 | 2 | 24 |
ajmp relative_addr11 | 0x81 | 2 | 2 | 24 |
anl c,bit | 0x82 | 2 | 2 | 24 |
movc a,@a+pc | 0x83 | 1 | 2 | 24 |
div ab | 0x84 | 1 | 4 | 48 |
mov direct8,direct8 | 0x85 | 3 | 2 | 24 |
mov direct8,@r0 | 0x86 | 2 | 2 | 24 |
mov direct8,@r1 | 0x87 | 2 | 2 | 24 |
mov direct8,r0 | 0x88 | 2 | 2 | 24 |
mov direct8,r1 | 0x89 | 2 | 2 | 24 |
mov direct8,r2 | 0x8a | 2 | 2 | 24 |
mov direct8,r3 | 0x8b | 2 | 2 | 24 |
mov direct8,r4 | 0x8c | 2 | 2 | 24 |
mov direct8,r5 | 0x8d | 2 | 2 | 24 |
mov direct8,r6 | 0x8e | 2 | 2 | 24 |
mov direct8,r7 | 0x8f | 2 | 2 | 24 |
mov dptr,#data16 | 0x90 | 3 | 2 | 24 |
acall relative_addr11 | 0x91 | 2 | 2 | 24 |
mov bit,c | 0x92 | 2 | 2 | 24 |
movc a,@a+dptr | 0x93 | 1 | 2 | 24 |
subb a,#data | 0x94 | 2 | 1 | 12 |
subb a,data | 0x95 | 2 | 1 | 12 |
subb a,@r0 | 0x96 | 1 | 1 | 12 |
subb a,@r1 | 0x97 | 1 | 1 | 12 |
subb a,r0 | 0x98 | 1 | 1 | 12 |
subb a,r1 | 0x99 | 1 | 1 | 12 |
subb a,r2 | 0x9a | 1 | 1 | 12 |
subb a,r3 | 0x9b | 1 | 1 | 12 |
subb a,r4 | 0x9c | 1 | 1 | 12 |
subb a,r5 | 0x9d | 1 | 1 | 12 |
subb a,r6 | 0x9e | 1 | 1 | 12 |
subb a,r7 | 0x9f | 1 | 1 | 12 |
orl c,bit | 0xa0 | 2 | 2 | 24 |
ajmp relative_addr11 | 0xa1 | 2 | 2 | 24 |
mov c,bit | 0xa2 | 2 | 1 | 12 |
inc dptr | 0xa3 | 1 | 2 | 24 |
mul ab | 0xa4 | 1 | 4 | 48 |
reserve | 0xa5 | x | x | x |
mov @r0,direct8 | 0xa6 | 2 | 2 | 24 |
mov @r1,direct8 | 0xa7 | 2 | 2 | 24 |
mov r0,direct8 | 0xa8 | 2 | 2 | 24 |
mov r1,direct8 | 0xa9 | 2 | 2 | 24 |
mov r2,direct8 | 0xaa | 2 | 2 | 24 |
mov r3,direct8 | 0xab | 2 | 2 | 24 |
mov r4,direct8 | 0xac | 2 | 2 | 24 |
mov r5,direct8 | 0xad | 2 | 2 | 24 |
mov r6,direct8 | 0xae | 2 | 2 | 24 |
mov r7,direct8 | 0xaf | 2 | 2 | 24 |
anl c,bit | 0xb0 | 2 | 2 | 24 |
acall relative_addr11 | 0xb1 | 2 | 2 | 24 |
cpl bit | 0xb2 | 2 | 1 | 12 |
cpl c | 0xb3 | 1 | 1 | 12 |
cjne a,#data,relative_addr8 | 0xb4 | 3 | 2 | 24 |
cjne a,direct8,relative_addr8 | 0xb5 | 3 | 2 | 24 |
cjne @r0,#data,relative_addr8 | 0xb6 | 3 | 2 | 24 |
cjne @r1,#data,relative_addr8 | 0xb7 | 3 | 2 | 24 |
cjne r0,#data,relative_addr8 | 0xb8 | 3 | 2 | 24 |
cjne r1,#data,relative_addr8 | 0xb9 | 3 | 2 | 24 |
cjne r2,#data,relative_addr8 | 0xba | 3 | 2 | 24 |
cjne r3,#data,relative_addr8 | 0xbb | 3 | 2 | 24 |
cjne r4,#data,relative_addr8 | 0xbc | 3 | 2 | 24 |
cjne r5,#data,relative_addr8 | 0xbd | 3 | 2 | 24 |
cjne r6,#data,relative_addr8 | 0xbe | 3 | 2 | 24 |
cjne r7,#data,relative_addr8 | 0xbf | 3 | 2 | 24 |
push direct8 | 0xc0 | 2 | 2 | 24 |
ajmp relative_addr11 | 0xc1 | 2 | 2 | 24 |
clr bit | 0xc2 | 2 | 1 | 12 |
clr c | 0xc3 | 1 | 1 | 12 |
swap a | 0xc4 | 1 | 1 | 12 |
xch a,direct8 | 0xc5 | 2 | 1 | 12 |
xch a,@r0 | 0xc6 | 1 | 1 | 12 |
xch a,@r1 | 0xc7 | 1 | 1 | 12 |
xch a,r0 | 0xc8 | 1 | 1 | 12 |
xch a,r1 | 0xc9 | 1 | 1 | 12 |
xch a,r2 | 0xca | 1 | 1 | 12 |
xch a,r3 | 0xcb | 1 | 1 | 12 |
xch a,r4 | 0xcc | 1 | 1 | 12 |
xch a,r5 | 0xcd | 1 | 1 | 12 |
xch a,r6 | 0xce | 1 | 1 | 12 |
xch a,r7 | 0xcf | 1 | 1 | 12 |
pop data | 0xd0 | 2 | 2 | 24 |
acall relative_addr11 | 0xd1 | 2 | 2 | 24 |
setb bit | 0xd2 | 2 | 1 | 12 |
setb c | 0xd3 | 1 | 1 | 12 |
da a | 0xd4 | 1 | 1 | 12 |
djnz direct8,relative_addr8 | 0xd5 | 3 | 2 | 24 |
xchd a,@r0 | 0xd6 | 1 | 1 | 12 |
xchd a,@r1 | 0xd7 | 1 | 1 | 12 |
djnz r0,realtive_addr8 | 0xd8 | 2 | 2 | 24 |
djnz r1,realtive_addr8 | 0xd9 | 2 | 2 | 24 |
djnz r2,realtive_addr8 | 0xda | 2 | 2 | 24 |
djnz r3,realtive_addr8 | 0xdb | 2 | 2 | 24 |
djnz r4,realtive_addr8 | 0xdc | 2 | 2 | 24 |
djnz r5,realtive_addr8 | 0xdd | 2 | 2 | 24 |
djnz r6,realtive_addr8 | 0xde | 2 | 2 | 24 |
djnz r7,realtive_addr8 | 0xdf | 2 | 2 | 24 |
movx a,@dptr | 0xe0 | 1 | 2 | 24 |
ajmp relative_addr11 | 0xe1 | 2 | 2 | 24 |
movx a,@r0 | 0xe2 | 1 | 2 | 24 |
movx a,@r1 | 0xe3 | 1 | 2 | 24 |
clr a | 0xe4 | 1 | 1 | 12 |
mov a,direct8 | 0xe5 | 2 | 1 | 12 |
mov a,@r0 | 0xe6 | 1 | 1 | 12 |
mov a,@r1 | 0xe7 | 1 | 1 | 12 |
mov a,r0 | 0xe8 | 1 | 1 | 12 |
mov a,r1 | 0xe9 | 1 | 1 | 12 |
mov a,r2 | 0xea | 1 | 1 | 12 |
mov a,r3 | 0xeb | 1 | 1 | 12 |
mov a,r4 | 0xec | 1 | 1 | 12 |
mov a,r5 | 0xed | 1 | 1 | 12 |
mov a,r6 | 0xee | 1 | 1 | 12 |
mov a,r7 | 0xef | 1 | 1 | 12 |
movx @dptr,a | 0xf0 | 1 | 2 | 24 |
acall relative_addr11 | 0xf1 | 2 | 2 | 24 |
movx @r0,a | 0xf2 | 1 | 2 | 24 |
movx @r1,a | 0xf3 | 1 | 2 | 24 |
cpl a | 0xf4 | 1 | 1 | 12 |
mov direct8,a | 0xf5 | 2 | 1 | 12 |
mov @r0,a | 0xf6 | 1 | 1 | 12 |
mov @ra,a | 0xf7 | 1 | 1 | 12 |
mov r0,a | 0xf8 | 1 | 1 | 12 |
mov r1,a | 0xf9 | 1 | 1 | 12 |
mov r2,a | 0xfa | 1 | 1 | 12 |
mov r3,a | 0xfb | 1 | 1 | 12 |
mov r4,a | 0xfc | 1 | 1 | 12 |
mov r5,a | 0xfd | 1 | 1 | 12 |
mov r6,a | 0xfe | 1 | 1 | 12 |
mov r7,a | 0xff | 1 | 1 | 12 |
|
|