c变量存储在eax寄存器中

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':操作数超出范围

Chr*_*odd 6

每个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字符串中使用,并且它将被编译器选择的寄存器替换,但对于与特定寄存器对应的约束,不需要直接提及它.