Co oznacza znak "$" i identyfikator?
x86 assembly, AT & Składnia T.
Co oznacza znak "$" i identyfikator?
x86 assembly, AT & Składnia T.
W AT & T składnia $
oznacza traktować to, co następuje jako stała natychmiastowa, a nie adres pamięci. Innymi słowy,
movl $_start, %eax
ładuje adres symbolu _start
w% eax;
movl _start, %eax
odczytuje 4 bajtów z pamięci na adres _start
w% eax. Jeśli spojrzeć na demontażu zarówno:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_386_32 _start
5: a1 00 00 00 00 mov 0x0,%eax
6: R_386_32 _start
widać, że jedyną różnicą jest opcode. Poręczna, jeśli w pewnym stopniu sama się nazywa, Intel® 64 and IA-32 Architectures Software Developer's Manual (potrzebujesz woluminu 2, który jest referencją do zestawu instrukcji) mówi, że kody opcyjne B8 do BF kodują "natychmiastową 16/32-bitową stałą obciążenia w rejestrze" (kod ten jest przeznaczony do ładowany do 32-bitowego segmentu kodu, więc jest to ładunek 32-bitowy, dla 16-bitowego obciążenia, masz bajt prefiksu "bajt prefiksu wielkości argumentu, 66), a kod operacji A1 koduje" załaduj 32-bitową ilość na określone przesunięcie 32-bitowe z DS (lub dowolnego innego segmentu, z odpowiednim bajtem prefiksu) do EAX. " Z typowym "płaskim" modelem pamięci, jest to moralny odpowiednik "załaduj 32-bitową ilość w określonym 32-bitowym adresie bezwzględnym", ale możesz zobaczyć, jak reputacja X86 jest tak absurdalnie skomplikowana na poziomie maszyny.
W przypadku, gdy zastanawiasz się, to co to będzie wyglądać, jeśli użyliśmy EBX zamiast:
a: bb 00 00 00 00 mov $0x0,%ebx
b: R_386_32 _start
f: 8b 1d 00 00 00 00 mov 0x0,%ebx
11: R_386_32 _start
obciążenia natychmiastowe jeszcze można zrobić z instrukcją jeden bajt nie licząc argumentu (to BB zamiast B9, jak można się spodziewać, ponieważ wewnętrzna kolejność rejestrów to AX, CX, DX, BX, SP, BP, SI, DI - na poważnie), ale adres load-from-absolute ma teraz dwa -strukturę bajtową, 8B 1D; drugi bajt jest tym, co Intel nazywa bajtem "ModRM", który określa zarówno EBX, jak i bezwzględny adres 4-bajtowy.
Ogólnie oznacza wartość "natychmiastową", tj. Liczbę, w przeciwieństwie do innej wartości rejestru, coś pobranego z pamięci itp. Tak więc w tym przypadku przenosi on numer przypisany do symbolu _start
do rejestru eaxa .
To dokładne pytanie jest jednym z ćwiczeń do [Programowanie od podstaw] (http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html). – user240515