我正在使用C语言编写MSP430作为真实微控制器的仿真。我陷入了寻址模式(https://en.wikipedia.org/wiki/TI_MSP430#MSP430_CPU),特别是:
使用R2(SR)和R3(CG)寻址模式,特殊情况解码
答案 0 :(得分:2)
因此,对于源,如果as位为01且源寄存器位为0,那么是用于参考的pc
ADDR符号。相当于x(PC)。操作数在地址PC + x的内存中。
如果广告位为1且目标为0,则
ADDR符号。相当于x(PC)。操作数在地址PC + x的内存中。
x将是该指令之后的另一个字,因此cpu将获取下一个字,将其添加到pc,这是源
如果as位为11且源为寄存器0,则源为立即值,该值位于指令后的下一个字中。
如果as位为01且源为2,恰好是SR寄存器以供参考,则地址为x指令后的下一个字(& ADDR)
如果ad位为1且目标寄存器为2,那么它也是& ADDR
如果as位为10,则源位为2,则源为常数值4,并且在指令4之后我们不必在flash中刻录一个字。
将目标设为常数4是没有意义的,因此不是真正的组合。
重复表格的其余部分。
您可以同时使用这两种寻址模式
mov #0x5A80,&0x0120
产生
c000: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80
c004: 20 01
是
0x40b2 0x5a80 0x0120
0100000010110010
0100 opcode mov
0000 source
1 ad
0 b/w
11 as
0010 destination
所以我们有一个11的源,0的源是#x,1是1的广告,目的地是2,所以目的地是& ADDR。这是一个重要的实验,因为当你有2个x值时,一个三字的指令基本上哪一个与源和目的地一起
0x40b2 0x5a80 0x0120
所以作为目的地的地址0x5a80是跟随指令的第一个x,然后是源0x0120后立即出现。
如果它只是一个立即和一个寄存器那么
c006: 31 40 ff 03 mov #1023, r1 ;#0x03ff
0x4031 0x03FF
0100000000110001
0100 mov
0000 source
0 ad
0 b/w
11 as
0001 dest
从11开始,0的源是#immediate,X在这种情况下是0x03FF,后面的字。目的地是0的广告
Register direct. The operand is the contents of Rn
这种情况下的目的地是r1
所以第一组Rn,x(Rn),@ Rn和@Rn +是正常情况,你问的下面那些是特殊情况,如果你得到一个适合特殊情况的组合那么你这样做,否则你做正常情况,如上面的mov immediate to r1示例。 r1的目的地是正常的Rn案例。
答案 1 :(得分:1)
As = 01,Ad = 1,R0( ADDR ):这与 x(Rn)完全相同,即操作数在地址为R0 + x的存储器。
当编译器不知道代码将位于哪个绝对地址时,它用于存储在使用它的代码附近的数据,但是它知道数据是例如指令后面的二十个字。
As = 11,R0( #x ):这与 @ R0 + 完全相同,用于需要数据字的指令来自指令流。例如,这个汇编程序指令:
MOV #1234, R5
实际编码并实现为:
MOV @PC+, R5
.dw 1234
CPU读取MOV指令字后,PC指向数据字。读取第一个MOV操作数时,CPU读取数据字,然后再次递增PC。
As = 01,Ad = 1,R2(& ADDR ):这与x(Rn)完全相同,但R2寄存器读为零,所以你是什么最终得到的是x的值。
使用always-zero寄存器允许对绝对地址进行编码,而无需为此设置特殊寻址模式(仅限特殊寄存器)。
常量-1/0/1/2/4/8:在大多数寻址模式下使用SR和CG寄存器是没有意义的,因此这些编码用于生成特殊值而无需单独的数据字,以节省空间:
encoding: what actually happens:
MOV @SR, R5 MOV #4, R5
MOV @SR+, R5 MOV #8, R5
MOV CG, R5 MOV #0, R5
MOV x(CG), R5 MOV #1, R5 (no word for x)
MOV @CG, R5 MOV #2, R5
MOV @CG+, R5 MOV #-1, R5