这是一个简单的函数
#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,内部堆栈框架正在被修改。那么,为什么没有 …
我最初试图生成立即移动到 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?
为什么是以下情况:
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) 在这个简单的函数中,为局部变量分配了空间。然后,变量被初始化并被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-64 ×4
assembly ×3
stack-frame ×2
c++ ×1
foreach ×1
iterator ×1
machine-code ×1
nasm ×1
red-zone ×1
stack-memory ×1
x86 ×1