gpt4 book ai didi

c++ - x86 逻辑地址语法错误

转载 作者:行者123 更新时间:2023-11-28 03:01:17 24 4
gpt4 key购买 nike

编译器:gcc 4.7.1, 32bit, ubuntu

这是一个例子:

    int main(void)
{
unsigned int mem = 0;

__asm volatile
(
"mov ebx, esp\n\t"
"mov %0, [ds : ebx]\n\t"
: "=m"(mem)
);

printf("mem = 0x%08x\n", mem);

return 0;
}

gcc -masm=intel -o app main.c

汇编器消息:寄存器使用无效!

据我所知,ds 和 ss 指向同一个段。我不知道为什么我不能使用 [ds : ebx] 逻辑地址进行寻址。

最佳答案

您的代码有两个问题:

:间接内存引用应该是:

mov %0, ds : [ebx]

也就是说,ds 不在括号内。

:一条指令不能同时在内存中有起点和终点,你必须使用寄存器。最简单的方法是指示 =g 基本上意味着 whatever,但在你的情况下这是不可能的,因为 esp 不能直接移动到内存。您必须使用 =r

:(?) 你正在破坏 ebx 寄存器,所以你应该这样声明它,否则不要那样使用它。这不会阻止编译,但会使您的代码行为不稳定。

简而言之:

  unsigned int mem = 0;
__asm volatile
(
"mov ebx, esp\n\t"
"mov %0, ds : [ebx]\n\t"
: "=r"(mem) :: "ebx"
);

或者最好不要强制使用 ebx,而是让编译器决定:

  unsigned int mem = 0, temp;
__asm volatile
(
"mov %1, esp\n\t"
"mov %0, ds : [%1]\n\t"
: "=r"(mem) : "r"(temp)
);

顺便说一句,您不需要在此代码中使用 volatile 关键字。这用于避免汇编程序被优化掉,即使不需要输出也是如此。如果您为副作用编写代码,请添加 volatile,但如果您编写代码以获得输出,则不要添加 volatile。这样,如果优化编译器确定不需要输出,它将删除整个 block 。

关于c++ - x86 逻辑地址语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com