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
...