PowerPC组装-读取/写入全局变量

时间:2019-01-18 11:55:12

标签: assembly powerpc

注意:我在下面发布了我代码的最新版本:

我已经自愿修改了一些继承的PowerPC 565汇编程序。

我想将值传入/传出Ada代码。

我已经定义了两个全局变量,并且可以(在某种程度上)在汇编器中进行访问。

lis     r29, %hiadj(My_INPUT)     # get the address of MY_INPUT - high
addi    r29, r29, %lo(MY_INPUT)   # " - low

lwz     r25, 0(r29)               # copy high contents to r25
lwz     r26, 4(r29)               # copy low  contents to r26 (should that 4 be 8?)

但是,我在r25和r26中得到的是MY_INPUT的地址。当我查看该内存地址时,会看到我希望看到的内容– MY_INPUT的值。

问题:如何将MY_INPUT的值(64位值)存入寄存器。

奖金:我如何将寄存器的内容移到全局MY_OUTPUT中?

我知道这几天的推荐书不合时宜。因此,尽管这是我的首选问题,但我不会问它:-)


[更新]我正在寻找一个示例,该示例采用一个全局值,然后将其递增并将其存储到另一个全局值。

这就是我所拥有的:

VC_INPUT:System.INTEGER_32;   编译指示导入(Convention =>汇编程序,                 实体=> VC_INPUT,                 External_Name =>“ VC_INPUT”);   pragma volatile(VC_INPUT);

VC_OUTPUT:System.INTEGER_32;   编译指示导入(Convention =>汇编程序,                 实体=> VC_OUTPUT,                 External_Name =>“ VC_OUTPUT”);   pragma volatile(VC_OUTPUT);

.global VC_INPUT
.global VC_OUTPUT

.bss

VC_INPUT:   .space 4    # size in bytes
VC_OUTPUT:  .space 4

# OK, we will take the globalVC_INPUT , add 1 and return it in VC_OUTPUT
lis     r29, %hiadj(VC_INPUT)     # get the address of VC_INPUT - high
addi    r29, r29, %lo(VC_INPUT)   # " - low
lwz     r19, 4(r29)               # get VC_INPUT value    

# OK, we will take the input global, add 1 and return it in VC_OUTPUT 
addi    r19, r19, 1               # increment it by one
lis     r23, %hiadj(VC_OUTPUT)    # get the address of VC_OUTPUT - high
addi    r23, r23, %lo(VC_OUTPUT)  # " - low   
stw     r19, 4(r23)               # write incremented value to VC_OUTPUT

第一点,我不明白为什么我必须偏移4英寸

`lwz     r19, 4(r29)               # get VC_INPUT value`

实际上发生的是,我将VC_INPUT设置为0x12345678,并且代码将VC_OUPUT设置为0x1234567812345679。

关闭,但没有雪茄。我做错了什么?请更正我的代码,或提供一个更好的示例。

0 个答案:

没有答案