在之前的章节中,我们测试了一些程序代码,代码中很常见的一些比如D0,D1,D2....A0,A1,A2......之类的代码。这些代码中的字符是告诉汇编程序,这里是指向一个寄存器。寄存器是处理器的内部也有一些存储的空间,不同类型处理器根据其设计结构和设计目的的不同,各自有着不同类型的寄存器。在寄存器中,因为与CPU联系密切,数据的移动,加减操作,读取写入要比任何其他的存储设备(比如高速缓存,内存,硬盘等) 效率更高,速度更快(但是由于是集成在处理器内部,造价更高,存储空间也更小)。
68000有8个数据寄存器:
d0, d1, d2, d3, d4, d5, d6, d7
数据寄存器寄存了将要写入的数据,或读取后的数据。它就像缓冲器,持有从内存复制的数据,以准备给处理器使用。每个寄存器都有四个字节大小的空间,比如:
d0??????? 00 00 00 00
68000同时拥有8个地址寄存器:
a0, a1, a2, a3, a4, a5, a6, a7
和数据寄存器不同,地址寄存器不能进行单字节长度的读取操作,只能进行双字节或四字节的操作。
我们需要注意,有部份的指令只能操作数据寄存器,而不能操作地址寄存器。
地址寄存器是用来存储地址的,我们可以对地址寄存器进行读写操作。
我们在很多代码中,我们可能会看到比如:
move.l #$10,a0
move.l #$20,(a0)
这样的代码,当A0加了括号变成了(A0)的时候,这条指令不会把$20这个立即数放到A0寄存器,而是会把$20这个立即数放到A0寄存器所指向的地址中。
我们来测试一下这两句代码:
*-----------------------------------------------------------
* Title :
* Written by :
* Date :
* Description:
*-----------------------------------------------------------
ORG $1000
START: ; first instruction of program
* Put program code here
move.l #$10,a0
move.l #$20,(a0)
SIMHALT ; halt simulator
* Put variables and constants here
END START ; last line of source
?要观察该程序运行结果,我们同时需要打开内存窗口:
并观察内存窗口中的地址$10的值为FF FF FF FF:
我们步进一次,观察A0
可以看到,第一句代码是直接改变了A0寄存器。
我们再步进一次,同时观察内存窗口的地址$10
可以看到,第二句代码是改变了A0寄存器数据所指向的地址的值。
所以,当我们看到带括号的代码,比如(a0),($6c+A0)之类的代码,该代码是告诉汇编程序,这里指向的是一个内存地址。
地址寄存器的另一个方便的功能是自增/自减功能。该功能的作用是,执行完该指令后,该寄存器的值会根据操作长度来对寄存器的值进行增加或减少。
move.l #$20,(a0)+
把之前测试代码中的括号右边增加一个"+"符号,就是自增功能
move.l #$20,-(a0)
而自减功能,是要在括号左边增加一个"-"符号。自减和自增的不同之处还有就是,自减操作是在指令操作源操作数之前进行"自减"。
我们可以测试并观察以下代码来更直观地了解自增和自减功能:
*-----------------------------------------------------------
* Title :
* Written by :
* Date :
* Description:
*-----------------------------------------------------------
ORG $1000
START: ; first instruction of program
* Put program code here
move.l #$10,a0 *a0=$10
move.l #$01,(a0)+ *(a0)=$00000001, a0=a0+4
move.w #$02,(a0)+ *(a0)=$0002, a0=a0+2
move.b #$03,(a0)+ *(a0)=$03, a0=a0+1
move.l #$20,a0 *a0=$20
move.l #$03,-(a0) *a0=a0-4, (a0)=$00000003
move.w #$02,-(a0) *a0=a0-2, (a0)=$0002
move.b #$01,-(a0) *a0=a0-1, (a0)=$01
SIMHALT ; halt simulator
* Put variables and constants here
END START ; last line of source