Lắp ráp nội tuyến
Mô tả hợp đồng của chuỗi lệnh của khối asm, toán hạng in/out và clobber.
Wave Foundation
khối asm
asm là cú pháp cấp thấp để chèn trực tiếp các hướng dẫn của kiến trúc đích.
fun read_value() -> i64 {
var result: i64 = 0;
asm {
"mov rax, 123"
out("rax") result
}
return result;
}
Các chuỗi ký tự trong một khối được truyền dưới dạng danh sách lệnh tập hợp.
đầu vào và đầu ra
var result: i64 = 0;
asm {
"mov rax, rdi"
in("rdi") 123
out("rax") result
}
in("reg") expressionnối giá trị Wave vào toán hạng đầu vào.out("reg") targetghi giá trị đầu ra vào mục tiêu Wave có thể gán.- Tên đăng ký có thể được viết dưới dạng chuỗi hoặc mã định danh.
Toán hạng đầu vào có thể bao gồm các biến, số nguyên/chuỗi ký tự, &identifier, deref identifier và số âm.
clobber
Nếu một khối thay đổi trạng thái thanh ghi hoặc bộ nhớ không phải là đầu ra rõ ràng, thì khối đó sẽ được ghi vào clobber(...).
asm {
"nop"
clobber("rax", "rcx", "memory")
}
Kiểm tra khi sử dụng
- Cú pháp hướng dẫn phải phù hợp với kiến trúc đích và hợp đồng lắp ráp nội tuyến LLVM.
- Không được tự ý hủy các thanh ghi phải được bảo quản theo quy ước gọi.
- Đối với các khối đọc hoặc ghi bộ nhớ, hãy khai báo clobber, bao gồm
memory. - Nếu có thể, hãy tách biệt asm dành riêng cho kiến trúc đằng sau một hàm nhỏ.
Hành vi và tính di động của tập hợp nội tuyến không được đảm bảo chỉ bằng loại ngôn ngữ.