我一直关注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是指向指针的指针吗?
答案 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