相关疑难解决方法(0)

在C++内联asm中使用基指针寄存器

我希望能够%rbp在内联asm中使用基指针寄存器().这样的玩具示例是这样的:

void Foo(int &x)
{
    asm volatile ("pushq %%rbp;"         // 'prologue'
                  "movq %%rsp, %%rbp;"   // 'prologue'
                  "subq $12, %%rsp;"     // make room

                  "movl $5, -12(%%rbp);" // some asm instruction

                  "movq %%rbp, %%rsp;"  // 'epilogue'
                  "popq %%rbp;"         // 'epilogue'
                  : : : );
    x = 5;
}

int main() 
{
    int x;
    Foo(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望,因为我使用通常的序幕/结尾函数调用方法来推送和弹出旧的%rbp,这样就可以了.但是,当我尝试在内x联asm之后访问时,它会出现故障.

GCC生成的汇编代码(略微剥离)是:

_Foo:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rdi, -8(%rbp)

    # INLINEASM
    pushq %rbp;          // prologue
    movq %rsp, …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly red-zone

13
推荐指数
1
解决办法
4119
查看次数

gcc的asm是否相当于递归的gfortran默认设置?

我只是在使用递归函数C++,Fortran并且我意识到一个简单的递归函数Fortran几乎是它的等效C++函数的两倍.现在,在进入这个之前,我知道这里有类似的问题,具体来说:

  1. 为什么添加汇编注释导致生成的代码发生如此根本的变化?
  2. 工作的asm volatile("" ::: "memory")
  3. 相当于gfortran中的asm volatile

不过,我有点更加具体和困惑的Fortran编译器似乎是在做什么,你可以实现asm volatilegcc.为了给你一些上下文,让我们考虑以下递归Fibonacci number实现:

Fortran代码:

module test
implicit none
private
public fib

contains

! Fibonacci function
integer recursive function fib(n) result(r)
    integer, intent(in) :: n
    if (n < 2) then
        r = n
    else
        r = fib(n-1) + fib(n-2)
    end if
end function  ! end of Fibonacci function
end module

program fibonacci
use test, only: fib
implicit …
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly gcc fortran

8
推荐指数
1
解决办法
321
查看次数

我如何告诉 gcc 我的内联汇编破坏了堆栈的一部分?

考虑这样的内联汇编:

uint64_t flags;
asm ("pushf\n\tpop %0" : "=rm"(flags) : : /* ??? */);
Run Code Online (Sandbox Code Playgroud)

尽管可能存在某种内在函数来获取 RFLAGS 的内容,但我如何向编译器表明我的内联汇编破坏了堆栈顶部的一个四字内存?

c gcc x86-64 inline-assembly red-zone

7
推荐指数
1
解决办法
529
查看次数

如何将汇编代码与C程序中的确切行关联?

以下是通过装配网站找到的示例.这是C代码:

 int main()
 {
     int a = 5;
     int b = a + 6;
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

这是相关的汇编代码:

    (gdb) disassemble
    Dump of assembler code for function main:
    0x0000000100000f50 <main+0>:    push   %rbp
    0x0000000100000f51 <main+1>:    mov    %rsp,%rbp
    0x0000000100000f54 <main+4>:    mov    $0x0,%eax
    0x0000000100000f59 <main+9>:    movl   $0x0,-0x4(%rbp)
    0x0000000100000f60 <main+16>:   movl   $0x5,-0x8(%rbp)
    0x0000000100000f67 <main+23>:   mov    -0x8(%rbp),%ecx
    0x0000000100000f6a <main+26>:   add    $0x6,%ecx
    0x0000000100000f70 <main+32>:   mov    %ecx,-0xc(%rbp)
    0x0000000100000f73 <main+35>:   pop    %rbp
    0x0000000100000f74 <main+36>:   retq   
    End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我可以放心地假设这行汇编代码:

  0x0000000100000f6a <main+26>:   add    $0x6,%ecx
Run Code Online (Sandbox Code Playgroud)

与此C行相关:

     int b = a …
Run Code Online (Sandbox Code Playgroud)

c debugging assembly gdb

5
推荐指数
2
解决办法
1731
查看次数

请解释我这个C片段

我在gcc酷刑测试套件中找到了这个小小的C宝石,我或多或少都明白了,除了标有我评论的行...

void __attribute__((noinline,noclone))
foo(int *p, float *q) { __asm__ volatile ("" : : : "memory"); } /// ??? 1

int main()
{
  if (sizeof (int) == sizeof (float))
    {
      int i;
      float f;
      int *p;
      /* Prevent i and f from being rewritten into SSA form. */
      foo (&i, &f);
      i = 0;
      f = 1.0;
      p = (int *)&f;
      __builtin_memcpy (&i, p, 4);     /// ??? 2
      if (*(float *)&i != 1.0)
        __builtin_abort ();
    }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么,问题1:

这是什么 …

c gcc

2
推荐指数
1
解决办法
256
查看次数

标签 统计

assembly ×3

c ×3

gcc ×3

c++ ×2

red-zone ×2

debugging ×1

fortran ×1

gdb ×1

inline-assembly ×1

optimization ×1

x86 ×1

x86-64 ×1