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