- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图让汇编程序给我一个它选择的寄存器,然后使用该寄存器进行内联汇编。我正在使用下面的程序及其段错误。该程序是用 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/
我是一名优秀的程序员,十分优秀!