我目前正在学习汇编语言,我正在处理的项目要求我们将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
答案 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]
内存。