你可以使用特定的地址在x86中存储变量吗?

时间:2016-11-07 03:16:07

标签: assembly x86 intel

我目前正在学习汇编语言,我正在处理的项目要求我们将c文件转换为asm文件。我试图从c文件实现for循环,我想知道我是否能够将计数器变量存储在特定的地址。例如,如果计数器从0开始,我可以这样做:

mov dword [ebp-0x4], 0
for_loop:
cmp dword [ebp-0x4], ecx
jge break
...
...
inc dword [ebp-0x4]
jmp for_loop

3 个答案:

答案 0 :(得分:1)

您可以使用CX寄存器存储循环计数器。

答案 1 :(得分:0)

您的代码是正确的。但访问特定的内存地址取决于此地址位置。如果这个地址存在于你的程序存储空间中,那就没问题,否则你会遇到分段错误。

有关x86,Intel 64指令及其操作数的更多信息,请参阅a gif showing chrome's console

答案 2 :(得分:0)

如果您首先将ebp设置为合理的,[ebp-4]为您的计数器保留,则会有效。

所以:

1)在您的.data.bss细分中,您有类似的内容:
counter: dd ?而你lea ebp,[counter+4]

2)或者使用ebp作为堆栈帧指针(C编译代码中的常用用法),就像在函数开始时执行push ebp mov ebp,esp一样。

然后您应该为本地([ebp - something])变量保留空间,通常mov ebp,esp后跟sub esp,<size of local vars>

如果没有esp调整,下一个push <something>将覆盖[ebp-4]内存。

顺便说一句,出于性能原因,通常很好地将内部循环中使用的值保留在寄存器中。但是如果你没有使用寄存器,并且只使用计数器进行循环,那么你的方法是有效的。