Tak, twoje założenia są prawidłowe. Istnieją różne rodzaje relokacji, to, co asembler emituje do instrukcji, zależy od typu. Zasadniczo jest to offset do dodania. Możesz użyć objdump -dr
, aby zobaczyć relokacje. Dla lepszego zobrazowania mam zmieniony kod trochę:
.data
.int 0
TEXT: .asciiz "Foo"
.text
.global main
main:
li $t0, 1
beq $t0, 1, equal #B
bne $t0, 42, foo #C
equal:
la $a0, TEXT
jal printf #A
wyjściu objdump:
00000000 <main>:
0: 24080001 li t0,1
4: 24010001 li at,1
8: 11010004 beq t0,at,1c <equal>
c: 00000000 nop
10: 2401002a li at,42
14: 1501ffff bne t0,at,14 <main+0x14>
14: R_MIPS_PC16 foo
18: 00000000 nop
0000001c <equal>:
1c: 3c040000 lui a0,0x0
1c: R_MIPS_HI16 .data
20: 0c000000 jal 0 <main>
20: R_MIPS_26 printf
24: 24840004 addiu a0,a0,4
24: R_MIPS_LO16 .data
Jak powiedział, nie ma relokacji dla beq
ponieważ to względny adres w tym pliku wynikowego.
Dodana (linia oznaczona C
) odwołuje się do zewnętrznego symbolu, więc mimo tego, że adres jest względny, potrzebny jest wpis relokacji. Będzie to typ R_MIPS_PC16
, aby wygenerować 16-bitowe przesunięcie słowa ze znakiem do symbolu foo
. Ponieważ kodowanie instrukcji wymaga odsunięcia od następnego słowa, a nie bieżącego PC
, którego używa relokacja, 1
musi zostać odjęte, a to jest zakodowane jako uzupełnienie 2 w instrukcji.
la
pseudoinstruction jest tłumaczony przez montera w lui
/addiu
pary (ten ostatni w gnieździe opóźnienia w jal
). W przypadku przeniesienia lui
do sekcji .data
zostanie wypełnione 16 najlepszych bitów. Ponieważ symbol TEXT
znajduje się pod adresem 4
w sekcji .data
, górne 16 bitów przesunięcia to 0
. Oznacza to, że instrukcja zawiera przesunięcie 0
. Podobnie w przypadku 16 bitów o niskiej wartości, z wyjątkiem instrukcji, która zawiera przesunięcie 4
.
Wreszcie, jal printf
używa jeszcze innego rodzaju relokacji, która jest dostosowana do kodowania wymaganego przez instrukcję. Przesunięcie wynosi zero, ponieważ skok jest bezpośrednio do przywoływanego symbolu. Zauważ, że objdump stara się być pomocny przez dekodowanie, ale nie przetwarza relokacji, więc jej wynik jest oczywiście nonsensem.
Nie jestem pewien, co masz na myśli mówiąc "Ponieważ symbol TEKST znajduje się pod adresem 4 w sekcji .data, górne 16 bitów przesunięcia wynosi 0". Jak wyglądałaby tablica symboli? – Carlj901
Uwaga Dodałem liczbę całkowitą na początku sekcji danych, dlatego "TEKST" ma adres 4. – Jester
Ah, rozumiem to teraz. Jakie informacje zawiera tabela symboli dla tego pliku? – Carlj901