2010-07-11 41 views
30

Được rồi vì vậy tôi có dòng này trong lắp ráp của tôiMOV EAX, DWORD PTR DS: [ESI] có nghĩa là gì và nó hoạt động như thế nào?

MOV EAX, DWORD PTR DS:[ESI] 

nơi ESI là 00402050 (ascii, "123456789012")

Sau khi hướng dẫn này: EAX = 34333231

Điều gì thực sự xảy ra ở đây? Giá trị này được tính như thế nào và tại sao?
Tôi có thể lấy một số tài liệu tham khảo tốt về loại điều này ở đâu?

Trả lời

54

Đăng ký trong dấu ngoặc vuông chẳng hạn như [ESI] là các con trỏ bị bỏ qua. Hướng dẫn bạn trích dẫn di chuyển DWORD (giá trị 32 bit/4 byte) ở vị trí bộ nhớ được chỉ định bởi ESI vào đăng ký EAX. Trong trường hợp của bạn, vị trí bộ nhớ 00402050, được đọc là DWORD, chứa 34333231.

Được viết bằng pseudo-C:

DWORD EAX; /* Declaring the registers as we find them in silico */ 
DWORD ESI; 

ESI = 0x00402050; /* Set up your initial conditions for ESI */ 
EAX = *((DWORD *)ESI); /* mov EAX, DWORD PTR [ESI] */ 
/*^^ ^^^^^^^ */ 
/* | |  |  */ 
/* | |  +----------- From "DWORD PTR" we get "DWORD *" in C.   */ 
/* | |    */ 
/* | +----------------- The C dereferencing operator * replaces [].  */ 
/* |    */ 
/* +------------------- The C assignment operator = replaces mov opcode. */ 

Trong trường hợp của bạn, nó không phải là sự thật rằng 0x00402050 "bằng" chuỗi "1234567890" - chứ không phải nó trỏ vào bộ nhớ chứa chuỗi đó.

Giá trị bạn nhận được, 0x34333231 được bao gồm từ giá trị ASCII cho các chữ số "1234", là bốn byte đầu tiên (tức là, DWORD) đầu tiên của chuỗi. Chúng xuất hiện theo thứ tự đảo ngược bởi vì kiến ​​trúc Intel là "chút cuối cùng" trong biểu diễn byte của một bộ nhớ DWORD.

Trong ví dụ của bạn tại thời điểm này, lệnh mov đang tải các ký tự ASCII như thể chúng là bốn byte của giá trị unsigned long, khi chúng thực sự là một chuỗi ký tự một byte.

+32

Bạn cũng nên đề cập rằng ký hiệu 'DS: [ESI]' có nghĩa là 'ESI' giữ một * offset * từ địa chỉ trong' DS' (thanh ghi phân đoạn dữ liệu), vì vậy lệnh sẽ di chuyển từ kép (giá trị 32 bit)) từ địa chỉ 'DS + ESI' để đăng ký' EAX'. –

+13

Tôi không chắc chắn 100% đồng ý rằng sẽ là sư phạm ở giai đoạn này. Trong chế độ bảo vệ DS là một bộ chọn, không phải là một phân đoạn. Tôi tin rằng OP là trong một chế độ bảo vệ vì Linux, Windows và MacOS tất cả chạy trong chế độ bảo vệ cho phép VM và OP không có vẻ là một lập trình viên hệ thống nhúng. Với tình hình phức tạp thực sự rất đơn giản (DS được ánh xạ tới toàn bộ dải địa chỉ và cơ sở chọn là số không), tại sao cố gắng bóc vỏ hành tây đó? –

+4

@Nikolai, tôi vui vì nó đã được đề cập ở đây cho một số 'đầy đủ'. –

Các vấn đề liên quan