2013-04-20 11 views
9

Zajmuję się niektórymi samouczkami dotyczącymi http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html, aby zapoznać się z x86/x64. Kod ten poradnik kompiluje i działa bez czkawki przy użyciu dostarczonego kodu, który wykorzystuje AT & składni T:Dlaczego przełączanie z AT & T na składnię Intel powoduje, że ten samouczek zostaje uszkodzony za pomocą GAS?

.global main 
.text 
main:        # This is called by C library's startup code 
    mov  $message, %rdi   # First integer (or pointer) parameter in %edi 
    call puts     # puts("Hello, World") 
    ret        # Return to C library code 
message: 
    .asciz "Hello, World"   # asciz puts a 0x00 byte at the end 

Jednakże gdy przekonwertować ten kod do składni Intela, pojawia się komunikat „Usterka” Segmentacja błąd.

.intel_syntax noprefix 
.global main 
.text 
main:        # This is called by C library's startup code 
    mov  rdi, message   # First integer (or pointer) parameter in %edi 
    call puts     # puts("Hello, World") 
    ret        # Return to C library code 
message: 
    .asciz "Hello, World"   # asciz puts a 0x00 byte at the end 

Nie znam x86, więc być może czegoś brakuje. Jakieś pomysły?

+0

Czy porównania wyjść binarnych? –

+0

@ JensBjörnhager, nie porównałem wyjść binarnych. Jestem nowicjuszem w montażu i wiem jeszcze mniej binarnie. Czy jest coś konkretnego, co mogę osiągnąć dzięki porównaniu plików binarnych bez bycia guru niskiego poziomu? – Alex

+0

Prawdopodobnie wspomniano o "mov rdi, offset message"? –

Odpowiedz

12

w co & T składni, mov $message, %rdi The $ oznacza natychmiastowe, czyli adres wiadomości.

W składni Intela gazowego, mov rdi, message oznacza adresowanie bezwzględne, czyli zawartośćna wiadomości. Aby uzyskać rzeczywisty adres wiadomości, musisz podać słowo kluczowe: : mov rdi, offset message.

Disassebly z dwóch plików binarnych pokazuje różnicę:

AT & T:

0000000000000000 <main>: 
0: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 

Intel:

0000000000000000 <main>: 
0: 48 8b 3c 25 00 00 00 mov 0x0,%rdi 
+0

Dzięki, Jens! To właśnie dla mnie wiele wyjaśniło. – Alex

Powiązane problemy