2009-09-03 45 views
6

Mã asc GCC sau được lấy từ thư viện coco của LuaJit. Ai đó có thể cung cấp một dòng bởi dòng giải thích về những gì nó làm gì?Giải thích mã Asm

static inline void coco_switch(coco_ctx from, coco_ctx to) 
{ 
    __asm__ __volatile__ (
    "movl $1f, (%0)\n\t" 
    "movl %%esp, 4(%0)\n\t" 
    "movl %%ebp, 8(%0)\n\t" 
    "movl 8(%1), %%ebp\n\t" 
    "movl 4(%1), %%esp\n\t" 
    "jmp *(%1)\n" "1:\n" 
    : "+S" (from), "+D" (to) : : "eax", "ebx", "ecx", "edx", "memory", "cc"); 
} 

Cảm ơn

Trả lời

10

ASM của tôi là một chút mờ về các chi tiết, nhưng tôi nghĩ rằng tôi có thể cung cấp cho bạn một ý tưởng chung.

ESP: Con trỏ ngăn xếp, EBP: Con trỏ cơ sở.

movl $1f, (%0) 

Di chuyển giá trị 0x1f vào tham số 0 (từ).

movl %%esp, 4(%0) 

Chuyển nội dung của thanh ghi ESP thành (từ + 4).

movl %%ebp, 8(%0) 

Di chuyển nội dung đăng ký EBP vào (từ + 8).

movl 8(%1), %%ebp 

Chuyển nội dung từ (đến + 8) vào thanh ghi EBP.

movl 4(%1), %%esp 

Di chuyển nội dung (đến + 4) vào thanh ghi ESP.

jmp *(%1) 

Chuyển đến địa chỉ chứa trong (đến).

"1:" là nhãn nhảy.

"+ S" khai báo tham số "nguồn" (đọc), "+ D" tham số đích (ghi). Danh sách các thanh ghi ở cuối câu lệnh là danh sách "clobber", một danh sách các thanh ghi có thể được sửa đổi bởi mã ASM, do đó trình biên dịch có thể thực hiện các bước để duy trì tính nhất quán (ví dụ, không dựa vào ví dụ ECX. như trước).

Tôi đoán coco_ctx có nghĩa là "ngữ cảnh coco". Vì vậy: Chức năng lưu khung ngăn xếp hiện tại trong cấu trúc "từ" và đặt khung ngăn xếp thành những gì được lưu trong cấu trúc "đến". Về cơ bản, nó nhảy từ hàm hiện tại sang một hàm khác.

+2

Đó là hoàn toàn đúng. Nó không chỉ nhảy từ chức năng này sang chức năng khác, mặc dù: nó nhảy từ toàn bộ ngăn xếp cuộc gọi này sang ngăn xếp khác; nó hoàn toàn chuyển đổi ngữ cảnh thực thi. (Ngoài ra, gosh nhưng GCC cú pháp lắp ráp nội tuyến là kỳ lạ.) – Crashworks

+2

Đó là cú pháp AT & T (http://wiki.osdev.org/Opcode_syntax) được bao bọc trong cú pháp C-call-like (http://wiki.osdev.org)/Inline_Assembly). Bạn sẽ không tin nhưng tôi thực sự thích nó hơn cú pháp "chuẩn" của Intel. ;-) – DevSolar

+0

Công tắc ngữ cảnh cũng hoạt động với C++ hay tôi phải viết một số khác biệt cho thiscall? – jameszhao00

2

DevSolar có câu trả lời đúng - Tôi sẽ chỉ cần thêm mà bạn có thể tìm hiểu thêm một chút về những gì EBP và ESP là dành cho here.