2012-02-08 6 views
17

Tôi cố gắng để hiểu làm thế nào các ngôn ngữ lắp ráp làm việc cho một kiến ​​trúc lớp vi máy tính, và tôi tiếp tục phải đối mặt với cú pháp khác nhau trong các ví dụ:

sub $48, %esp 
mov %eax, 32(%esp) 

làm các mã có ý nghĩa gì? Toán hạng 32 bổ sung cho thanh ghi đặc biệt là gì?

Trả lời

19

Đó không phải cú pháp Intel, AT&T syntax, còn được gọi là GAS syntax.

tiền tố $ là dành cho immidiates (hằng số) và tiền tố % dành cho thanh ghi (chúng được * bắt buộc **).

* Trừ khi tùy chọn noprefix được chỉ định, hãy xem here & here.

+0

Cảm ơn rất nhiều, tôi không biết được nơi để tìm kiếm – juliensaad

+1

này% 'tiền tố' không cần thiết nếu sử dụng 'noprefix' chỉ http : //stackoverflow.com/questions/549347/how-to-use-address-constants-in-gcc-x86-inline-assembly –

+0

@ LưuVĩnhPhúc: Thú vị, tôi đã nhìn thấy chỉ thị đó trước đây, có thể gây ra tài liệu cực kỳ kém chất lượng của nó :(https://sourceware.org/binutils/docs/as/i386_002dVariations.html – Necrolis

1

Như @Necrolis đã nói, được viết bằng cú pháp AT & T. Nó có nghĩa là:

subtract 48 from the register esp (the stack pointer). 
store the contents of eax to the four bytes starting at (esp + 32). 
0

Đây là cú pháp T & T cho x86. Trong AT & T % thường biểu thị một thanh ghi trong khi $ được dành riêng cho các liên lạc ngay lập tức. Nếu bạn bỏ qua số $, trình biên dịch sẽ giải thích 48 là một địa chỉ.

1

Có, "32 (% esp)" cho biết mức chênh lệch là 32 từ% esp.

+0

GAS gọi nó là "Tham khảo bộ nhớ", được ghi lại tại: https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html khái niệm x86 tóm tắt rực rỡ tại: https://en.wikipedia.org/wiki/X86 #Addressing_modes –

0

Đó là cùng

sub esp, 48 
mov [esp+32], eax 

trong cú pháp Intel

+1

Xin chào - Tôi không chắc điều này thực sự trả lời câu hỏi ... $ và% là gì? –

+0

@TarynEast chúng là tiền tố dành cho các đơn vị bất tử và đăng ký như Necrolis đã nói –

+1

Bài đăng của bạn xuất hiện trong hàng đợi đánh giá "chất lượng thấp" ... vì không có đủ lời giải thích trong đó. Đề xuất của tôi dựa trên đó ... Hãy chỉnh sửa nó để nói những gì bạn đã nói ở trên;) –