我有這樣的代碼在8051彙編:8051彙編程序的指令序列是做什麼的?
MOV A,#04H
RL A
MOVC A,@A+PC
SJMP Cont
Cont: DB 10H, 20H, 30H, 40H, 50H, 60H, 70H, 80H
的問題是,這些指令執行後,什麼是有價值的;答案是A保持值(A)= 70H。
我已經搜索了關於MOV和RL的指令,並且我明白了,但是我不清楚,剩下的指令和我們如何得到寄存器A的值?
我有這樣的代碼在8051彙編:8051彙編程序的指令序列是做什麼的?
MOV A,#04H
RL A
MOVC A,@A+PC
SJMP Cont
Cont: DB 10H, 20H, 30H, 40H, 50H, 60H, 70H, 80H
的問題是,這些指令執行後,什麼是有價值的;答案是A保持值(A)= 70H。
我已經搜索了關於MOV和RL的指令,並且我明白了,但是我不清楚,剩下的指令和我們如何得到寄存器A的值?
MOVC A, @A+PC
移動從程序存儲器的數據的8位(MOVC代表「移動代碼」或類似的)在由甲 + PC並將其存儲給定到累加器的地址。
@
的存在是雄辯的,它用於表示register indirect addressing mode,完整表達式@A+PC
指定它實際上是indexed addressing mode。
需要注意的是:
的PC
已經被它是用來做內存存取時間遞增。
由於MOVC A, @A+PC
是1個字節長,它的語義是:
PC = PC + 1
A = (A+PC)
在符號表達式@A+PC
,將@
是爲了有比+
少優先,所以它應被理解爲@(A+PC)
。
SJMP
是SHORT JUMP和它簡單地執行被指定爲操作數的目標。
MOV A, #04H
將值04h移動到A
。
這裏符號「#」表示immediate addressing mode。
RL A
只需將一個位置右轉A
即可。
假設代碼開始於X,然後
Address Data Instruction State before State after Description
X + 00 : 74 04 : MOV A, #04 : A = ? PC = X : A = 4 PC = X + 02 Set A to 4
X + 02 : 23 : RL A : A = 4 PC = X + 02 : A = 8 PC = X + 03 Rotate left 4 = 0000 0100 -> 0000 1000 = 8, now A is 8
X + 03 : 83 : MOVC A, @A+PC : A = 8 PC = X + 03 : A = 70 PC = X + 04 Read from memory A+PC, A = MEM[A + PC after] = MEM[8 + X + 04] = MEM[X + 0C] = 70
X + 04 : 80 00 : SJMP X + 06 : A = 70 PC = X + 04 : A = 70 PC = X + 06 Goto X + 06, PC <- X + 06
X + 06 : 10
X + 07 : 20
X + 08 : 30
X + 09 : 40
X + 0A : 50
X + 0B : 60
X + 0C : 70
X + 0D : 80
簡單地說,在執行時MOVC A, @A+PC
,一個字節由8添加的下一個指令(地址值讀取在A
)。
由於SJMP
,下一條指令的長度爲1個字節,就像從Cont
讀取7個字節。
Cont
的第七項是70h。
此代碼的處理器是什麼? – duskwuff
8051微處理器 – stones