注意:我在下面发布了我代码的最新版本:
我已经自愿修改了一些继承的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。
关闭,但没有雪茄。我做错了什么?请更正我的代码,或提供一个更好的示例。