Tôi đang đọc "Hệ thống máy tính: Phối cảnh lập trình viên", chương 3 giải thích hướng dẫn mov
và giải thích cho một cuốn sách gây nhầm lẫn cho tôi.hướng dẫn và đăng ký mov - nhầm lẫn!
cho một chức năng (trang 142 1 của edition) mã
int exchange(int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
hội của cơ quan chức năng của
movl 8(%ebp), %eax //Get xp
movl 12(%ebp), %edx //Get y
movl (%eax), %ecx //Get x at *xp
movl %edx, (%eax) //Store y at *xp
movl %ecx, %eax //Set x as return value
gì confuses me, là những gì đang xảy ra phải được lưu trữ, và nơi
Đây là cách tôi hiểu điều này:
movl 8(%ebp), %eax //Get xp
Chuyển động CPU +8 byte lên ngăn xếp (từ con trỏ khung %ebp
), lấy giá trị được lưu trữ tại vị trí đó và lưu trữ giá trị này tại thanh ghi %eax
(để nhấn mạnh - lưu trữ giá trị, không phải địa chỉ)
Tôi đúng? Cảm ơn!
RẤT đúng ...... – ruslik
Vì vậy, nói cách khác, bởi vì 'cửa hàng% ebp' con trỏ, chúng ta sử dụng dấu ngoặc xung quanh tên gọi của nó, để xác định rằng chúng tôi đang nhận được giá trị được lưu trữ + 8bytes đi từ '% ebp'. Trong trường hợp này, '8 (% ebp)' chứa con trỏ '* xp'. Sau đó, trong dòng 'movl (% eax),% ecx' chúng ta là dereferencing' xp' giống như cách chúng ta đã làm trong dòng đầu tiên của mã assembly – newprint
Bây giờ, mọi thứ đều thẳng ra. Dấu ngoặc đơn là nguồn gốc của sự nhầm lẫn! Cảm ơn ! – newprint