TL;DR
Послушайте комментарий Шутки.
Переезд
Когда компилятор компилирует единицу кода, обычно предполагается, что его код начинается с адреса 0, поэтому он генерирует объектные файлы с адресами, близкими к 0 (если только PIC).
Когда компоновщик связывает объектные файлы, он обычно размещает каждый раздел кода один за другим, поэтому он должен «сдвигать» адреса разделов, следующих за первым.
Когда программа загружена, ее начальный адрес может быть выбранным случайным образом, поэтому загруженный должен "сдвинуться" все адреса еще раз.
Это называется перемещением, оно может быть выполнено различными способами и подразумевает, что сохраненные адреса в объектном/двоичном файле обычно равны нулю или относительно нуля.
Загрузка адреса PowerPC
Как это часто бывает на компьютерах RISC, загрузка константы ширины регистра (как адреса) занимает два инструкций.
Одна для старших битов и одна для младших.
В PowerPC это достигается с помощью пары
lis r1, HIGH16 ;Move HIGH16<<16 into r1
ori r1, LOW16 ;r1 = HIGH16<<16 | LOW16
Если адрес используется для загрузки каких-либо данных, вторая инструкция может быть «вплавлена» в загрузку, используя смещение
lis r1, HIGH16 ;Move HIGH16<<16 into r1
lwz r2, LOW16(r1) ;r2 = mem[HIGH16<<16 + LOW16]
Соглашение о вызовах PowerPC (часть)
При вызове функции, использующей числа с плавающей запятой, входные данные параметры в регистры f1-f8.
Возвращаемые значения находятся в f1.
f0 является изменяемым регистром.
Объединяем все это
Не существует инструкций, которые загружают числа с плавающей запятой немедленно, поэтому они должны быть расположены в памяти. Я не знаю, какой формат с плавающей запятой использует PowerPC, я предполагаю, что IEEE754.
В этом если число 5 представлено как +1.01x22, то как одиночное точность равна
S Exp (127+2) Significand (Implicit 1)
+---+-----------+-------------------------+
| 1 | 1000 0001 | 010 0000 0000 0000 0000 |
+---+-----------+-------------------------+
or 40a00000h.
Вы можете поэкспериментировать с плавающей запятой здесь.
; f1 = input
;This load a float at address 0 (not yet relocated) into f0
;Such float is the literal 5.
;The zeros are actually the upper and lower part of the literal address
;(that is not relocated)
lis r9, 0
lfs f0, 0(r9)
;f1 = input
;f0 = 5
fadd f1,f1,f0
;f1 = input + 5
;f0 = 5
blr
person
Margaret Bloom
schedule
01.04.2016
objdump
, убедитесь, что вы передали опцию-r
, чтобы увидеть записи о перемещении. Я предполагаю, что константа5
была помещена в память, и доступ к ней осуществляется косвенно черезr9
. Два нуля, вероятно, имеют записи о перемещении по адресу константы. - person Jester   schedule 01.04.2016