基本的GCC内联汇编问题

时间:2010-10-01 13:25:44

标签: gcc inline-assembly

我想在ESP寄存器中移动变量“userstack”的值,然后绝对跳转到变量“location”中包含的内存地址。 这就是我所拥有的:

// These are the two variables that contains memory addresses
 uint32_t location = current_running->LOCATION;
 uint32_t userstack = current_running->user_stack;

 // And then something like this
 __asm__ volatile ("movl userstack, %esp");
 __asm__ volatile ("ljmp $0x0000, location");

然而,当我尝试编译时,我得到错误: “错误:后缀或操作数对ljmp无效”和“未定义引用`userstack'”。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

查看manual

我认为你需要这样的东西:

asm volatile ("movl %0, %esp" : "g" (userstack));
asm volatile ("ljmp $0x0000, %0" : "g" (location));

基本上GCC需要知道用户的位置和位置(寄存器,存储器操作数,浮点数,寄存器的受限子集等)以及由“g”指定的内容和位置,在这种情况下意味着一般操作数。