6502 處理器


How do Cpus read machine code

 

6502 CPU芯片組裝計算機

 

 

 

 

...

 

(JMP的指令是4C)

 

 

 

 (makerom.py)

 

 

python makerom.py
hexdump -C rom.bin

 

 

 

 插上去reprogram (那是一個 EEPROM Programmer)

 

 

(輸入命令 reprogram)


然后就可以開始操作,讀取二進制機器碼了

 

 

(取指令,讀指令)

Assembly language vs. machine code

 

 

blink.s( 匯編語言)


assembler 匯編器

 

 

編譯后輸出到bin文件然后再寫入使用

 

Connecting an LCD to our computer
略...

 


What is a stack and how does it work?

在剛才匯編語言示例中,只是打印hello world 就用了150行

 

 

 

然后我們可以把打印的過程封裝起來,到那一步的時候,就跳過去執行,執行完就return回來

 

 

 

封裝一個icd_instruction ,rts的意思是return

 

 

使用這個封裝的

 

 

但是插上去以后並沒有按預期顯示hello word, 然后我們單步執行看一下:

 

 

 

 

800c地址 是jump
按理說 800c之后,應該就是lcd_instruction的內容,

讀取800d
讀取 800e
得到805d這個地址,然后讀取805d

(,注:8d是storea指令的機器碼)

 

可是讀取800d和800e之間多了一些奇怪的內容

 

 

 

0124 w80
0123 w0e

其實是在寫地址, 因為return語句執行之后要回到原來的地址,
這里是在寫原來的地址。

what the processor is doing is taking a couple extra clock cycles here to save that address so we can return back to it

寫到了0123和0124上


writing 800e somewhere in memory so that we can get back to it

 

 

 

 

806f 讀取到 60 指令

60是從lcd_instruction 返回的指令(return)


繼續向下看,下一次執行到了8070,但是這個沒有啥用,這個是cpu在taking extra clock cycles做一些internal stuff

 

 

 

之后,是讀取0122,0123,0124

 

 

 

回憶一下,在一開始的時候,我們是把要return的地址寫入到0124和0123中的

 

 

 

但是有問題,在我們read 0123和 0124的時候,得到的結果都是8d,並不是我們寫入的那個地址80 0e,

這就是我們程序出問題的原因,我們沒有響應 0123 和0124的對應的硬件,
這個地址上沒有硬件


the processor is trying to save the return address but our computer doesn't actually have any RAM in it, so it doesn't work

繼續向下單步執行,

 

 

程序跑到了8d8d,
后面就持續做一些wierd wild things,不是我們想的了

 

 

 

 

 

 

現在有個問題,
為什么一開始在return的時候,他要把地址寫到0124 和0123厘米,為什么不是別的?

 

 

 

 

看一下6502的說明書,這些地址被Stack所使用

 

 

 

Stack Pointer(SP)

 

 

 

一開始,pointer是指在0124的,

當執行到subroutine的時候,將繼續return的地址push到stack中

0123 推入0e
0124 推入80

如果在那個subroutine中,我們繼續調用下一個子程序,我們還會像stak中推入地址 ,

我們甚至可以把自己的數據推到stack中,
stack actually be a really handy place to temporarily store data

 

 

 

比如這句,我們先load a , load something to the a register

and then call the subroutine,

 

 

 

在這個subroutine中,里面還有load a,所以a寄存器里的內容其實在執行完sbroutine后是會消失的

,在我們的例子中,load a的沒有什么用,所以消失了也沒關系,

但是其實我們可以在剛進入subroutine的時候,把a里的數據推到stack中,

 

 

 

 

(加一個push a)

實際會產生下面的效果:

 

 

 將數據推入到0122中

 

 

 

 在后面的時候,一定要pull出來,否則這個數據就永遠留在這里了


在這個8bit系統中,如果你沒pull出來,最后會認為你要return的數據是0E 38,就會出問題

 

 

 

===============

還有就是,如果Stack里一直推入數據,

 

就會到達頂部,然后又開始從下面開始向上

 

 

 

直到overwrite, 這個被稱作stackoverflow

這就有問題了,因為當我們return的時候,地址就不對了

 


================

 

現在還有個問題,為什么我們的SP是在0124的

答案是他就是任意的,當CPU powers on的時候正巧在0124


如果一開始能在01FF就好了,

 

 

 

我們就能知道還剩多少stack,
那么我們要手動初始化一下,


查看手冊:

 

 

 根據手冊內容需要txs 和ldx配合

 

 

 

(加上去來初始化SP位置)

 


現在我們只有ROM(read only)


后面我們會加上RAM

來讓程序運行

 

 

RAM and bus timing
(總線時序)
...

 

Subroutine calls, now with RAM

...

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM