gpt4 book ai didi

c - 数组大小 - 段错误 - C

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:58 25 4
gpt4 key购买 nike

下面是一段代码:

int foo[262144]  __attribute__ ((aligned (8192)));

void
test49()
{
__asm__("movl $0x0, %ecx");
__asm__("movl %0,%%eax"::"r"(&foo));

#ifdef FOREVER
while(1)
{
#else
for(int i=0; i < iters; i++)
{
#endif
__asm__("test_begin: addl $0x1,%ecx;");
__asm__("mov 0x00(%eax),%ebx;\

我遇到了一个段错误。

    __asm__("mov 0x00(%eax),%ebx;\

如果我将数组大小从 256KB 更改为 7MB6MB;我没有收到任何错误。不会是我没有空间的问题吧?

我试图检查转储。它没有给我太多线索。

在这里

./microbenchmark 49
Performing Test49
[1] 12011 segmentation fault (core dumped) ./microbenchmark 49

这是回溯。

gdb microbenchmark core
GNU gdb (GDB) SUSE (7.5.1-2.1.1)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /MB/test-l2-256/test-hit/microbenchmark...done.
[New LWP 12011]
Missing separate debuginfo for /lib/libc.so.6
Try: zypper install -C "debuginfo(build-id)=7e0834d74d3e93c3210d2405cde86dc995fe476c"
Missing separate debuginfo for /lib/ld-linux.so.2
Try: zypper install -C "debuginfo(build-id)=6a687db0baedc0db516006a7eedaee8f57f955c8"
Core was generated by `./microbenchmark 49'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048603 in test49 () at microbenchmark.c:77
77 __asm__("mov (%eax),%ebx;\
(gdb) bt
#0 0x08048603 in test49 () at microbenchmark.c:77
#1 0x08048538 in main (argc=2, argv=0xfff68fb4) at microbenchmark.c:33

知道问题出在哪里吗?

谢谢。

最佳答案

内联汇编是危险的。你应该注意这些事情:

  1. 让 gcc 知道你在搞什么。例如,您正在更改 ecx,而 gcc 可能会假定 ecx 具有某些值。您是内联汇编的“破坏”部分(例如 __asm__("movl $0x0, %ecx"::"ecx")

  2. 不要假设寄存器在内联 assembly 线之间不会改变。即使中间没有 C 行,gcc 也可能会在那里插入汇编代码。使用带有多个汇编命令的单个内联汇编 block 。

  3. 如果您需要在程序集 block 之间传递数据,请使用 C 变量。您可以将其定义为 register 以使其快速。你甚至可以在 gcc 中选择你想要的寄存器(我忘记了具体的语法)。

关于c - 数组大小 - 段错误 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045561/

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