2012-01-24 32 views

Odpowiedz

4

Jest użyteczne porównanie między gazem i NASM tutaj: http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html

patrz w szczególności ta część, która myślę, że adresy Twoje pytanie:


Listing 2 wprowadza również pojęcie licznik lokalizacji (linia 6). NASM udostępnia specjalną zmienną (zmienne $ i $$) do manipulowania licznikiem lokalizacji. W GAS nie ma sposobu na manipulowanie licznikiem położenia i trzeba użyć etykiet do obliczenia kolejnej lokalizacji (danych, instrukcji itp.). Na przykład, aby obliczyć długość łańcucha, należy użyć następującego idiom w NASM:

prompt_str db 'Enter your name: ' 
STR_SIZE equ $ - prompt_str  ; $ is the location counter 

$ daje bieżącą wartość licznika lokalizacji i odejmując wartość etykiety (wszystkie nazwy zmiennych są etykietami) z tego licznika lokalizacji podaje liczbę bajtów obecnych między deklaracją etykiety a bieżącą lokalizacją. Dyrektywa equ służy do ustawiania wartości zmiennej STR_SIZE na wyrażenie następujące po niej. Podobna idiom w gazie wygląda następująco:

prompt_str: 
    .ascii "Enter Your Name: " 

pstr_end: 
    .set STR_SIZE, pstr_end - prompt_str 

Etykieta koniec (pstr_end) daje kolejny adres lokalizacji i odejmując początkowy adres etykieta podaje rozmiar. Zwróć też uwagę na użycie .set w celu zainicjowania wartości zmiennej STR_SIZE na wyrażenie następujące po przecinku. Odpowiednia .equ może również być używana. Nie ma alternatywy dla dyrektywy zestawu GAS w NASM.


18

Fragment info as (GNU BINUTILS 2.21.90):

5.4 The Special Dot Symbol 
========================== 

The special symbol `.' refers to the current address that `as' is 
assembling into. Thus, the expression `melvin: .long .' defines 
`melvin' to contain its own address. Assigning a value to `.' is 
treated the same as a `.org' directive. Thus, the expression `.=.+4' 
is the same as saying `.space 4'. 
+0

Dzięki, będę spróbować – orustam