基本装配查询

逆向工程 艾达 部件 英特尔
2021-07-07 23:16:25

我写了一个程序,它将在汇编中添加两个数字。当我对 进行系统调用时scanf(),指令如下所示:

mov rcx, num1

注意:我num1在本bss节中定义为:

num1 resb 10

而且,当我尝试移动这个值来rax说明指令看起来像:

mov rax, [num1]

据我所知,方括号内的任何内容都必须仅在rm32. 所以,更像是去内存位置而不是读取内存中的内容。

这个支架在这里有什么帮助?

当我们可以拥有直接值时,为什么还需要内存位置?

我的下一个指令是:

sub rax, '00'

rax包含一个地址num1我们不应该对值num1而不是地址进行数学运算吗?

1个回答

首先,您对 x86/amd64 程序集使用 Intel 语法。因此,在此语法中,方括号 ( [.]) 代表对其包含的地址的取消引用。

如果您了解 C 编程,[var](在汇编中)与 '*var' 完全相似。

事实上,您在这里需要处理的唯一小困难是num1您定义的 已经是一个地址(我现在谈论的是 nasm 语法而不是 Intel asm 语法)。

因此,move rcx, num1意味着您将地址复制num1rcx

并且,move rax, [num1]意味着您将内容复制num1rax.

您可以参考这个SO question这可能会解释您的问题。