gpt4 book ai didi

gcc - 我如何要求汇编程序 "give me a full size register"?

转载 作者:行者123 更新时间:2023-12-04 21:58:47 24 4
gpt4 key购买 nike

我试图让汇编程序给我一个它选择的寄存器,然后使用该寄存器进行内联汇编。我正在使用下面的程序及其段错误。该程序是用 g++ -O1 -g2 -m64 wipe.cpp -o wipe.exe 编译的。

当我查看 lldb 下的崩溃时,我相信我得到的是 32 位寄存器而不是 64 位寄存器。我正在尝试使用 lea 计算地址(基数 + 偏移量),并将结果存储在汇编程序选择的寄存器中:

"lea (%0, %1), %2\n"

上面,我想说的是“使用一个寄存器,我将它称为 %2”。

当我执行反汇编时,我看到:

   0x100000b29:  leal   (%rbx,%rsi), %edi
-> 0x100000b2c: movb $0x0, (%edi)

因此看起来正在生成的代码使用 64 位值(rbx 和 rsi)进行计算和寻址,但将其保存到 32 位寄存器 (edi)(由汇编程序选择)。

以下是崩溃时的值:

(lldb) type format add --format hex register
(lldb) p $edi
(unsigned int) $3 = 1063330
(lldb) p $rbx
(unsigned long) $4 = 4296030616
(lldb) p $rsi
(unsigned long) $5 = 10

下面是关于输入操作数的快速说明。如果我删除 "r"(2),那么在调用 lea 时引用 %2 时会出现编译器错误: 内嵌 asm 字符串中的无效操作数

我如何告诉汇编程序“给我一个全尺寸寄存器”然后在我的程序中引用它?


int main(int argc, char* argv[])
{
string s("Hello world");
cout << s << endl;

char* ptr = &s[0];
size_t size = s.length();

if(ptr && size)
{
__asm__ __volatile__
(
"%=:\n" /* generate a unique label for TOP */

"subq $1, %1\n" /* 0-based index */
"lea (%0, %1), %2\n" /* calcualte ptr[idx] */
"movb $0, (%2)\n" /* 0 -> ptr[size - 1] .. ptr[0] */
"jnz %=b\n" /* Back to TOP if non-zero */

: /* no output */
: "r" (ptr), "r" (size), "r" (2)
: "0", "1", "2", "cc"
);
}

return 0;
}

很抱歉这些内联汇编问题。我希望这是最后一次。由于这样的痛点(以及我的内存力衰退),我对在 GCC 中使用内联汇编并不感到兴奋。但考虑到 GCC 对 C 中限定词 volatile 的解释,这是我知道的唯一合法方式来做我想做的事。

如果有兴趣,GCC 会将 C 的 volatile 限定符解释为 hardware backed memory , 其他任何事情都是滥用,它会导致非法程序。所以以下对于 GCC 是合法的:

volatile void* g_tame_the_optimizer = NULL;
...

unsigned char* ptr = ...
size_t size = ...;

for(size_t i = 0; i < size; i++)
ptr[i] = 0x00;

g_tame_the_optimizer = ptr;

有趣的是,微软对 volatile 使用了更习惯的解释(大多数程序员所期望的——即任何东西都可以改变内存,而不仅仅是内存映射硬件),上面的代码是可以接受的。

最佳答案

gcc 内联 asm 是一个复杂的野兽。 "r"(2) 表示分配一个 int 大小的寄存器并用值 2 加载它。如果你只需要一个任意的临时寄存器,你可以声明一个 64 位的早期破坏虚拟输出,比如在输出部分的 "=&r"(dummy),使用 void *dummy 较早声明。您可以咨询gcc manual了解更多详情。

至于最终的代码片段,您似乎想要一个内存屏障,正如链接电子邮件中所说的那样。查看manual for example .

关于gcc - 我如何要求汇编程序 "give me a full size register"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27891936/

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