【发布时间】:2021-05-01 13:18:15
【问题描述】:
我正在做作业,因为我不明白这些行应该是什么意思?
mov rax, qword ptr [rbp - 0x28]
mov rax, qword ptr [rax]
mov eax, dword ptr [rax]
mov dword ptr [rbp - 0x10], eax
mov rax, qword ptr [rbp - 0x28]
mov rax, qword ptr [rax]
mov rax, qword ptr [rax + 8]
mov qword ptr [rbp - 8], rax
据我了解,这些行只是将 rbp - 0x28 中的任何内容复制到 rbp - 0x10 中。然后它将 rbp - 0x20 中的任何内容(因为 rax + 8 = rbp - 0x28 + 8 = rbp - 0x20)放入 rbp - 8
稍后我们有这些行:
mov rax, dword ptr [rbp - 8]
mov eax, dword ptr [rax]
mov dword ptr [rbp - 0x10], eax
mov rax, qword ptr [rbp - 8]
mov rax, qword ptr [rax + 8]
mov qword ptr [rbp - 8], rax
我相信它将 rbp - 8 中的任何内容放入 rbp - 0x10 然后将 rbp 中的任何内容(因为 rax + 8 = rbp - 8 + 8 = rbp)放入 rbp - 8 但它似乎真的错了在我的胆量中......
谁能给我解释一下这几行代码,以便我改进?
非常感谢您, 祝你有美好的一天
【问题讨论】:
-
看起来像未优化的调试模式代码,使用 RBP 作为帧指针,因此它的小偏移量是本地变量。其中两个局部变量是指针(或指向指针的指针),可能指向链表结构,考虑到加载值的取消引用量。您是否可能错过了这样一个事实,即
mov rax, [rax+8]是像 p = p->next 这样的负载,而不仅仅是 RAX 上的数学? -
括号
[...]表示内存访问。所以mov rax, qword ptr [rax]解引用了一个指针,然后 那个 值被mov eax, dword ptr [rax]解引用为另一个指针