Tôi mới tham gia hội thảo trong C và tôi không biết cách khắc phục lỗi này. Tôi đang tạo một hàm có nghĩa là viết một tệp. Những gì tôi có là:Tại sao asm có những ràng buộc không thể khi tôi đặt tên cho sổ đăng ký?
ssize_t mywrite(int fd, const void *buf, size_t count) {
// return write(fd, buf, count);
ssize_t var;
__asm__("movl $4,%%eax\n\t" // Write
"movl %1,%%ebx\n\t"
"movl %2,%%ecx\n\t"
"movl %3,%%edx\n\t"
"int $0x80\n\t" // System call
"movl %%eax,%0"
:"=r"(var)
:"r"(fd),"r"(buf),"r"(count)
:"%eax","%ebx","%ecx","%edx"
);
return var;
}
Asm của tôi có nghĩa vụ phải làm tương tự như viết (fd, buf, count); Khi tôi biên dịch nó, tôi nhận được toán hạng "asm" có những ràng buộc không thể ". Tuy nhiên, nếu không đặt tên các biến và nhận các giá trị trực tiếp từ ngăn xếp, tôi sẽ không nhận được lỗi. Đây là mã số
__asm__("movl $4,%%eax\n\t"
"movl 8(%%ebp),%%ebx\n\t"
"movl 12(%%ebp),%%ecx\n\t"
"movl 16(%%ebp),%%edx\n\t"
"int $0x80\n\t"
"movl %%eax,%0"
:"=r"(var)
:
:"%eax","%ebx","%ecx","%edx"
);
Tôi có thể sử dụng mã thứ hai, tuy nhiên, tôi cần nó được biên dịch với tối ưu hóa 2. Sau đó,% ebp sẽ không trỏ đến nơi tôi cần. Tôi đã thử sử dụng "a", "b", "c" và "d" thay vì "r", nhưng không thành công. Bất cứ ai cũng có thể giúp đỡ? Cảm ơn: D
Bạn có đang biên dịch ở chế độ 64 bit không? – fuz