打字猴:1.700414037e+09
1700414037
1700414038 一旦把207写入到端口A控制寄存器,Z80 PIO就明白了“哦,想要设定端口A的输入输出模式啊!”而通过接下来写入的255,Z80 PIO就知道“要把端口A设定为输入模式”
1700414039
1700414040 同样地,通过下面的程序可以将端口B设定为输出模式
1700414041
1700414042 LD A,207
1700414043
1700414044 OUT (3),A
1700414045
1700414046 LD A,0
1700414047
1700414048 OUT (3),A
1700414049
1700414050 先把207写入端口B控制寄存器(对应的I/O地址为3号)然后写入0,这个0表示要把端口B设定为输出模式,应该使用什么样的数字设定端口,在Z80 PIO的资料上有说明。用207,255,0这样的数字表示功能设定参数,这也是为了适应计算机的处理方式
1700414051
1700414052 完成了Z80 PIO的设定后,就进入了一段死循环处理,用于把由指拨开关输入的数据输出到LED。为了完成这个功能,需要如下的代码:
1700414053
1700414054 LOOP:   IN A,(0)
1700414055
1700414056 OUT (1),A
1700414057
1700414058 JP LOOP
1700414059
1700414060 IN A,(0)的作用是把数据由端口A数据寄存器(连接在指拨开关上,对应的I/O地址为0号)输入到CPU的寄存器A
1700414061
1700414062 OUT (1),A的作用是把寄存器A的值输出到端口B数据寄存器上(连接在LED上,对应的I/O地址为1号)
1700414063
1700414064 JP LOOP的作用是使程序的流程跳转到LOOP(标签名)标签所标识的指令上。JP是Jump的缩写
1700414065
1700414066 IN A,(0)所在行的开头有一个标签LOOP:,代表着这一行的内存地址。正如刚才所讲的那样,在用汇编语言编程时,如果老想着“这一行对应的内存地址是什么?“就会很不方便,所以就要用LOOP:这样的标签代替内存地址。当把标签作为JP指令的操作数时,标签名的结尾不需要冒号,但在设定标签时,标签名的结尾需要加一个冒号,这一点请注意
1700414067
1700414068
1700414069
1700414070
1700414071 计算机是怎样跑起来的 [:1700412639]
1700414072 计算机是怎样跑起来的 3.4 追踪程序的运行过程
1700414073
1700414074 用汇编语言编写的程序是不能直接运行的,必须先转换成机器语言。机器语言是唯一一种CPU能直接理解的编程语言。从汇编语言到机器语言的转换方法稍后介绍,这里先看一下代码清单3.3,里面列出了事先转换出来的机器语言以及对应的汇编语言。1条汇编语言的指令所对应的机器语言由多个字节构成。而且,同样的汇编语言中的1条指令,有的指令对应1个字节的机器语言,有的指令则对应多个字节的机器语言。汇编语言中的1条指令能转换成多少条机器语言取决于指令的种类及操作数的个数。代码清单3.3中第一个内存地址是00000000(0号地址),下一个地址是00000010(2号地址)中间隔了2个地址,这说明如果从0号地址开始存储一条2字节的机器语言,那么下一条机器语言就从2号地址开始存储
1700414075
1700414076 下面就一边看代码清单3.3,一边跟随着CPU解释、执行机器语言程序吧。在这里,我们假设机器语言的程序是像代码清单3.3那样被存储在内存中的
1700414077
1700414078 一旦重置了CPU,00000000就会被自动存储到PC寄存器中,这意味着接下来CPU将要从00000000号地址读出程序。首先CPU会从00000000号地址读出指令00111110,判断出这是一条由2个字节构成的指令,于是接下来会从下一个地址(即00000001,1号地址,代码清单3.3中并没有标记出该地址本身)读出数据11001111,把这两个数据汇集到一起解释、执行。执行的指令是把数值207写入寄存器A,用汇编语言表示的话就是“LD A,207”,这时,由于刚刚从内存读出了一条2字节的指令(占用两个内存地址),所以PC寄存器的值要增加2,并接着从00000010号地址读出指令,解释并执行。
1700414079
1700414080 接下来的流程与此类似,通过反复执行“读取指令”“解释、执行指令”“更新PC寄存器的值”这3个操作,程序就能运行起来了。一旦执行完最后一行的JP LOOP所对应的机器语言,PC寄存器的值就会被设为标签LOOP:对应的地址00010000,这样就可以循环执行同样的操作。请重点观察PC寄存器是如何控制程序流程的
1700414081
1700414082 代码清单3.3 汇编语言与机器语言的对应关系
1700414083
1700414084 地址      机器语言                标签    操作码     操作数
1700414085
1700414086 00000000  00111110 11001111                   LD         A,207
[ 上一页 ]  [ :1.700414037e+09 ]  [ 下一页 ]