【问题标题】:ASM what do [] do exactly?ASM [] 究竟做了什么?
【发布时间】:2018-07-30 20:16:14
【问题描述】:

我一直在关注this tutorial,但我被卡住了。他大约在 6:30 开始解释。
所以在那一集中有一个 for 循环,看起来像 this。正如他所说,我在解释过程中迷路了。但是我重看了几遍,有一点我不明白。所以这是代码,我在看寄存器时做了一些笔记。
mov rax, [rbp+arg]
所以在这条线 rax = 0x7ffe63c2d498 和 arg = 0x7ffe63c2d380 之后。我解码了这两个,但什么也没出现,所以我假设它们是指针。
add rax, 8
mov rdx, [rax]
在此行 rdx = 0x7ffe63c2e09d 之后。我假设这又是一个指针。
mov eax, [rbp+i]
这会移动 eax 中 i 的值,例如 0x01
cdqe
add rax, rdx
在这里,您将 i 的值添加到字符串的指针中。
movzx eax, byte ptr [rax]
在这里,您将 rax 指向的字符移动到 eax。
movsx eax, al
add [rbp+sum], eax
add [rbp+i], 1
在这里你总结和i++。

我的问题是:[] 不应该将地址指向的值移动到寄存器中吗?因此,它将 arg 指向的值移动到 rax 中,然后将 rax 指向的值移动到 rdx 中。但这两个都是指针。怎么会?那么arg是指向指针的指针吗?

【问题讨论】:

  • 是的,您可以清楚地看到并且也应该知道,argv 的类型为 char*[],编译器决定将其复制到再次通过指针访问的堆栈中。
  • 汇编程序没有C 所具有的数据类型。汇编程序中没有指针。只有寄存器和立即操作数。该指令规定了该指令如何解释寄存器或立即数的值。
  • 啊,所以 arg 是指向 argv 数组的指针?然后将 char* argv[1] 指针复制到 rdx 中?然后它搜索到 char* 的索引并获取字符?
  • @bolov 但您仍然可以将它们视为指针吗?它们指向一个使用 []? 访问的值
  • arg 是相对于rbp 的偏移量,它访问堆栈上的argv 的副本。

标签: assembly x86-64 reverse-engineering


【解决方案1】:

Assembly 没有 C 语言所具有的数据类型。汇编中没有指针。只有寄存器和立即操作数。该指令规定了该指令如何解释寄存器或立即数的值。

但您仍然可以将它们视为指针吗?它们指向一个值 用 [] 访问?

有点。仅在指令的上下文中,并且仅适用于您。

例如mov eax rdi。这里rdi 的值被解释为一个数字。对于试图理解算法的你来说,它可能意味着一个计数器、一个总和、一个偏移量或一个指针。然而,对于指令,它只是一个数字。

但在mov eax [rdi] 中,这里的rdi 被解释为内存中的地址。

lea eax, [rsi + rdi] 中,rsi + rdi 的值被解释为内存地址。但是对你来说,这条指令只计算rsi + rdi,所以它对你来说真的可能意味着任何东西,指针和偏移量的总和,或者两个整数的总和。但这只是你赋予他们理解算法的意义。

回答您的问题[OP] 的意思是“在地址OP 的内存中找到的值”。

lea eax, [rsi + rdi] 表示“将内存中地址rsi + rdi处的值的有效地址加载到eax中”,即rsi + rdi

【讨论】:

  • 好的,我有点理解,但我还有一些问题。所以在mov eax [rdi] 中,rdi 被解释为内存地址,它指向的值被移动到eax 中?在最后一段中还有一些不清楚的地方。 lea eax, [rsi + rdi] 是否与 add rsi, rdi lea eax rsilea eax [rsi] 相同?因为你说它只计算rsi + rdi。不是也把它当成一个地址,把它指向的值复制到eax吗?
  • @GregorTrplan lea 是一个例外。 lea 计算地址,然后将地址写入另一个操作数。没有访问内存。
  • 我试图阅读这个问题,但它有点让我头疼。正如我所说,为什么不使用 add 和 mov 指令而不是 lea?
  • @GregorTrplan 在我链接的问题中得到了很好的回答。阅读投票第二多的答案。
猜你喜欢
  • 2012-07-23
  • 2016-09-10
  • 2023-03-15
  • 2012-10-17
  • 2021-06-04
  • 1970-01-01
  • 2019-10-06
  • 2021-01-01
  • 2011-11-09
相关资源
最近更新 更多