2011-02-03 39 views
6

'$' theo sau là từ định danh có nghĩa là gì?

lắp ráp x86, AT & Cú pháp T.

+0

Câu hỏi chính xác này là một trong các bài tập cho [Lập trình từ Ground Up] (http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html). – user240515

Trả lời

11

Trong cú pháp AT & T $ có nghĩa là xử lý những gì dưới dạng một hằng số ngay lập tức thay vì địa chỉ bộ nhớ. Nói cách khác,

movl $_start, %eax 

tải địa chỉ của biểu tượng _start vào% eax;

movl _start, %eax 

đọc 4 byte từ bộ nhớ tại địa chỉ _start thành% eax. Nếu bạn xem xét việc tháo gỡ cả hai:

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 

bạn có thể thấy sự khác biệt duy nhất là mã vạch. Các tiện ích, nếu phần nào tự phục vụ được đặt tên, Intel® 64 and IA-32 Architectures Software Developer's Manual (bạn muốn khối lượng 2, đó là hướng dẫn thiết lập tham khảo) nói rằng opcodes B8 thông qua BF mã hóa "tải ngay lập tức 16/32-bit liên tục vào đăng ký" (đây là mã mệnh để được được tải vào một đoạn mã 32 bit, vì vậy nó là một tải 32-bit, cho một tải 16-bit, bạn sẽ có một "tiền tố ghi đè kích cỡ operand" byte, 66) và mã hóa A1 opcode "tải 32-bit số lượng tại xác định bù đắp 32 bit từ DS (hoặc bất kỳ phân đoạn nào khác, với byte tiền tố thích hợp) vào EAX. " Với mô hình bộ nhớ "phẳng" điển hình, đó là sự tương đương về mặt đạo đức "tải lượng 32 bit ở địa chỉ tuyệt đối 32 bit", nhưng bạn có thể thấy x86 nổi tiếng như thế nào ở mức độ máy móc phức tạp.

Trong trường hợp bạn đang tự hỏi, đây là những gì nó sẽ trông như thế nào nếu chúng tôi sử dụng EBX thay vì:

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 

Load-ngay vẫn có thể được thực hiện với một hướng dẫn một byte không kể các toán hạng (đó là BB thay vì B9, như bạn có thể mong đợi, bởi vì thứ tự đăng ký nội bộ là AX, CX, DX, BX, SP, BP, SI, DI - nghiêm túc) nhưng tải-từ-tuyệt đối-địa chỉ bây giờ có hai -byte hướng dẫn, 8B 1D; byte thứ hai là những gì Intel gọi là một "ModRM" byte, trong đó xác định cả hai EBX và rằng một địa chỉ 4-byte tuyệt đối sau.

2

Nói chung nó có nghĩa là giá trị "ngay lập tức", tức là một số, trái ngược với giá trị sổ đăng ký khác, một thứ được truy xuất từ ​​bộ nhớ, v.v. Trong trường hợp này, nó di chuyển số được liên kết với ký hiệu _start vào thanh ghi eax .