Đây là cách của tôi để xác định một hàm trong assembly, điều này không cần phải có một tệp lắp ráp riêng biệt hoặc bạn không cần phải thoát khỏi mỗi dòng mới. Bạn chỉ có thể sao chép nội dung của các tập tin lắp ráp vào chuỗi chữ. Lưu ý:raw multiline string literal là tính năng C++ 11 (bạn cũng đã gắn thẻ C++). Điều này hữu ích, nếu bạn muốn biên dịch mọi thứ trong một đơn .c
-/.cpp
-file.
extern"C" int rand_byte(void);
asm (R"(
.globl rand_byte
rand_byte:
call rand
and eax, 255
ret
)");
Bạn chỉ có thể sử dụng câu lệnh lắp ráp cơ bản mà không có tham số bổ sung ở phạm vi toàn cầu. Khi sử dụng GCC hoặc Clang và bộ xử lý cánh tay, bạn có thể sử dụng [[gnu::naked]]
/__attribute__((naked))
.
[[gnu::naked]]
int rand_byte(void) {
asm volatile (R"(
push {lr}
bl rand
and r0, #255
pop {pc}
)");
};
Cách thứ nhất luôn cho phép xác định các chức năng khỏa thân. Điều này cũng giúp tạo thêm mã di động.
extern"C" int _cdecl rand_byte(void);
#if defined __x86__
// NOTE: the names are decorated with a '_' on windows 32-bit
// You can use extern"C" int _cdecl rand_byte() asm("rand_byte");
// to make the asm symbol name always be rand_byte, without an _
asm volatile (R"(
.globl _rand_byte
_rand_byte:
call rand
and eax, 255
ret
)");
#elif defined __x86_64__
asm volatile (R"(
.globl rand_byte
rand_byte:
call rand
and rax, 255 # eax works here, too. x86-32 and -64 could share the same source.
ret
)");
#elif defined __arm__
asm (R"(
.global rand_byte
rand_byte:
push {lr}
bl rand
and r0, #255
pop {pc}
)");
#else
#error There is no code for your platform yet...
#endif
Hãy thử và làm cho điều này cụ thể hơn - nó khá rộng và mơ hồ khi nó đứng - nếu không nó có thể sẽ bị đóng là "không phải là một câu hỏi thực". Cũng nhớ lại lời khuyên trước đó trong các câu hỏi trước đây của bạn về việc sử dụng 'gcc -S ...' để tạo mẫu asm, v.v. –
gcc trong cùng một mạng có '__attribute __ ((naked))' nhưng không cho x86: ( –