ASM究竟做了什么?

时间:2018-02-20 12:54:09

标签: assembly x86-64 reverse-engineering

我一直关注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]
这会将e的值移动到eax中,例如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是指向指针的指针吗?

1 个答案:

答案 0 :(得分:1)

汇编在C的意义上没有数据类型。装配中没有指针。只有寄存器和立即操作数。该指令规定了该指令如何解释寄存器或立即数的值。

  

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

访问

排序。只有在指导的背景下才能为您服务。

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

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

lea eax, [rsi + rdi]中,rsi + rdi的值被解释为内存地址。但是对于你来说这个指令只是计算rsi + rdi所以它真的对你来说意味着什么,指针和偏移的总和,或两个整数的总和。但这只是你理解算法的意义。

要回答您的问题[OP]表示“在地址OP的内存中找到的值”。

lea eax, [rsi + rdi]表示“在eax中加载地址rsi + rdi内存中找到的值的有效地址”,这只是rsi + rdi