2011-02-03 14 views
6

Co oznacza znak "$" i identyfikator?

x86 assembly, AT & Składnia T.

+0

To dokładne pytanie jest jednym z ćwiczeń do [Programowanie od podstaw] (http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html). – user240515

Odpowiedz

11

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.

2

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 .