2010-10-04 40 views

Trả lời

21

movq (giả sử bạn đang nói về x86) là một động thái của một quadword (64 giá trị bit). Hướng dẫn cụ thể này:

movq (%rsp), %rsp 

trông rất giống mã sẽ đi qua các khung ngăn xếp. Lệnh đặc biệt này lấy được từ bốn chấm được trỏ đến bởi con trỏ ngăn xếp hiện tại và tải nó vào con trỏ ngăn xếp, ghi đè lên nó.

Bằng một ví dụ, chuỗi mã này (dựa trên mã thực, và trong Intel đúng hơn là AT & định dạng T) liên tục sẽ được tải con trỏ ngăn xếp từ nội dung của nó cho đến khi giá trị 16 byte ngoài nó là 0.

576 cmpq [rsp+0x10],0x0 
582 jz  594 
588 movq rsp,[rsp] 
592 jmp  576 
594 ... 

Có thể nó có thể không phải là mã đi bộ trên khung xếp chồng nhưng nó không bình thường vì nó sẽ phụ thuộc vào con trỏ ngăn xếp cho thứ mà nó thường không được sử dụng.

khác thường khi di chuyển lên khung ngăn xếp thường liên quan đến con trỏ ngăn xếp và con trỏ cơ sở nhưng thường chỉ tăng lên một cấp (tức là, trả về từ một hàm).

Đối với loại mã được hiển thị ở trên nơi bạn muốn di chuyển lên nhiều cấp, có thể nhanh hơn chỉ cần sử dụng con trỏ ngăn xếp cho đến khi bạn đến nơi bạn cần, sau đó bật con trỏ cơ sở ra. đẩy con trỏ cơ sở hiện tại trước khi thay đổi nó, để một pop đơn giản sẽ phục hồi giá trị cũ).

+0

Điều này chắc chắn là 64 bit, vì thanh ghi RSP chỉ tồn tại trong 64 bit (trên kiến ​​trúc IA32 và tôi không nhớ lại kiến ​​trúc khác sử dụng RSP). Phân tích mục đích của nó có vẻ hợp lý. – Zooba

9

Đây là giá trị chuyển động 64 bit. 64bit của nó vì "q" trong movq là quad và quad là 64bit.

Có thể có ví dụ khác như movl trong đó l là 32 bit.

nhưng trong trường hợp của movq (% RSP),% RSP sử dụng cú pháp ATT ..

Các movq (% RSP),% RSP -> movq được gọi là opcode, (% RSP) được gọi là nguồn hoặc src và% rsp được gọi là đích hoặc dst.

những gì nó làm là nó trông lên trong thanh ghi% rsp nhận giá trị của nó và đi vào bộ nhớ [khung "()" có nghĩa là đi vào giá trị bộ nhớ] của giá trị đó và sau đó gán nó vào% rsp.

Trong khi cả hai đều có cùng đăng ký, sự khác biệt là giá trị của% rsp thay đổi.

EG: cho phép nói% RSP có giá trị 22. Nhưng ký ức về% RSP là 30.

Sử dụng hướng dẫn movq này (% RSP),% RSP

giá trị mới của% RSP là 30 Một lần nữa vì (% rsp) nhận giá trị của% rsp giả định 22 và sau đó (% rsp) đi tới giá trị bộ nhớ 30 và sau đó gán nó cho% rsp trên đích, đó là% rsp chính nó.

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