ПРИМЕЧАНИЕ: я выкладываю последнюю версию своего кода ниже:
Я вызвался модифицировать унаследованный ассемблер 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.
Близко, но без сигары. Что я делаю неправильно? Пожалуйста, исправьте мой код или приведите лучший пример.