zoy*_*han -2 c assembly gcc inline-assembly
我在这做错了什么?
int val = 15;
asm ("movl %1, %%eax"::"r"(val):"%eax" );
__asm__ volatile ("int $0x80");
Run Code Online (Sandbox Code Playgroud)
我想在eax中移动15然后调用中断
"错误":'asm':操作数超出范围
每个asm构造都是独立的,并且设置在一个中的值/寄存器与另一个没有连接.为了使这项工作,你需要一个单一的asm.此外,没有必要将值实际移动到eax中 - 这就是"a"输入约束的作用.所以你要:
int val=15
asm volatile("int $0x80" : : "a"(val));
Run Code Online (Sandbox Code Playgroud)
要不就
asm volatile("int $0x80"::"a"(15));
Run Code Online (Sandbox Code Playgroud)
编辑
各种约束字母的含义在gcc文档中,但基本上,对于x86,它们是:
'r' -- any general register
'm' -- in memory addressable by an EA operand (base reg + index * scale + displacement)
'a' -- al/ax/eax/rax register (depending on the size of the operand)
'b' -- bl/bx/ebx/rbx register
'c' -- cl/cx/ecx/rcx register
'd' -- dl/dx/edx/rdx register
'A' -- edx:eax register pair (holding a 64-bit value)
'D' -- di/edi/rdi
'S' -- si/esi/rdi
'f' -- any 8087 fp register
't' -- ST(0) -- top of 8087 stack
'u' -- ST(1) -- second on 8087 stack
'y' -- any MMX register
'x' -- any XMM register
Run Code Online (Sandbox Code Playgroud)
如果要在特定寄存器中放置多个内容,则需要多个输入,每个输入都有适当的约束.例如:
int read(int fd, void *buf, int size) {
int rv;
asm ("int $0x80" : "=a"(rv) : "a"(3), "b"(fd), "c"(buf), "d"(size) : "memory");
return rv;
}
Run Code Online (Sandbox Code Playgroud)
直接进行"读取"系统调用.输入约束将各种参数放在eax/ebx/ecx/edx寄存器中,返回值最终在eax寄存器中.
对于与特定寄存器不对应的约束,您将%n在asm字符串中使用,并且它将被编译器选择的寄存器替换,但对于与特定寄存器对应的约束,不需要直接提及它.
| 归档时间: |
|
| 查看次数: |
3073 次 |
| 最近记录: |