Сборка PowerPC - чтение / запись в / из глобальных переменных - PullRequest
0 голосов
/ 18 января 2019

ПРИМЕЧАНИЕ: я выкладываю последнюю версию своего кода ниже:

Я вызвался модифицировать унаследованный ассемблер PowerPC 565.

Я хочу передать значения в / из кода Ады.

Я определил две глобальные переменные и могу - вроде - доступ к ним на ассемблере.

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; импорт прагмы (Конвенция => Ассемблер, Entity => VC_INPUT, External_Name => "VC_INPUT"); изменчивая прагма (VC_INPUT);

VC_OUTPUT: System.INTEGER_32; импорт прагмы (Конвенция => Ассемблер, Entity => VC_OUTPUT, External_Name => "VC_OUTPUT"); изменчивая прагма (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.

Близко, но без сигары. Что я делаю неправильно? Пожалуйста, исправьте мой код или приведите лучший пример.

...