小编Hap*_*rry的帖子

“当内部堆栈帧未修改时,无需在函数末尾取消分配堆栈”,但在这种情况下它正在被修改

这是一个简单的函数

#include <stdio.h>

int foo() {
    int a = 3;
    int b = 4;
    int c = 5;
    return a * b * c;
}

int main() {
    int a = foo();
}
Run Code Online (Sandbox Code Playgroud)

foo() 的程序集看起来像

foo:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 3
        mov     DWORD PTR [rbp-8], 4
        mov     DWORD PTR [rbp-12], 5
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-8]
        imul    eax, DWORD PTR [rbp-12]
        pop     rbp
        ret
Run Code Online (Sandbox Code Playgroud)

从 中可以看出rbp - N,内部堆栈框架正在被修改。那么,为什么没有 …

assembly x86-64 stack-frame stack-memory red-zone

3
推荐指数
1
解决办法
117
查看次数

您如何理解 x86-64 汇编的“REX.W + B8+ rd io”形式?

我最初试图生成立即移动到 64 位寄存器的字节。我想要的具体操作是

mov rdi, 0x1337
Run Code Online (Sandbox Code Playgroud)

使用https://www.felixcloutier.com/x86/mov,我看到的唯一非符号扩展指令是

REX.W + B8+ rd io
Run Code Online (Sandbox Code Playgroud)

这让我很困惑,所以我创建了一个小型汇编程序来查看汇编器会生成什么

          global    _start

          section   .text
_start:   
          mov       rdi, 0x1337 
          syscall                           
          mov       rax, 60                 
          xor       rdi, rdi                
          syscall                           
Run Code Online (Sandbox Code Playgroud)

我必须关闭优化,以便迁移到 64 位寄存器。所以我编译nasm -felf64 -O0 main.asm && ld main.o并生成了一个a.out. 我看着objdump -M intel -d ./a.out这行

48 bf 37 13 00 00 00    movabs rdi,0x1337  
Run Code Online (Sandbox Code Playgroud)

那条线看起来一点也不像

REX.W + B8+ rd io
Run Code Online (Sandbox Code Playgroud)

大部头书?另外,经过一些研究,我发现该命令应该是 10 个字节。你如何从 得到它REX.W + B8+ rd io

assembly x86-64 nasm machine-code instruction-encoding

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

递增和取消引用迭代器如何比递增单独变量并将其索引到数组中更快?

为什么是以下情况:

for (auto & x : vec) { /* do stuff with x */ } 
Run Code Online (Sandbox Code Playgroud)

比...快

for (int i = 0; i < v.size(); ++i) { /* do stuff with v[i] */ }
Run Code Online (Sandbox Code Playgroud)

正如我的标题所说,我被告知增加和取消引用迭代器比增加单独的变量并将其索引到数组中更快,但不明白为什么?

究竟发生了什么让它变得更快?

我试图走过去看看发生了什么,这就是我想到的

// pseudo instructions
// iterator

increment iterator
    e.g., if the object is 3 integers you would increment the iterator
    by 12
dereference this iterator

// pseudo instructions
// array

increment array index
    add 1 to index counter
multiply by size of object 
    e.g., if …
Run Code Online (Sandbox Code Playgroud)

c++ foreach iterator x86-64

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

程序如何知道在堆栈上为局部变量分配多少空间?

在这个简单的函数中,为局部变量分配了空间。然后,变量被初始化并被printf调用以输出它们。

000000000040056a <func>:
  40056a:       55                      push   rbp                     ; function prologue
  40056b:       48 89 e5                mov    rbp,rsp                 ; function prologue
  40056e:       48 83 ec 10             sub    rsp,0x10                ; deallocating space for local variables
  400572:       8b 4d fc                mov    ecx,DWORD PTR [rbp-0x4] ; variable initialization
  400575:       8b 55 f8                mov    edx,DWORD PTR [rbp-0x8] ; variable initialization
  400578:       8b 45 f4                mov    eax,DWORD PTR [rbp-0xc] ; variable initialization
  40057b:       89 c6                   mov    esi,eax                 ; string stuff
  40057d:       bf 34 06 40 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 stack-frame

0
推荐指数
1
解决办法
843
查看次数