有没有办法在.code部分创建变量,而不是.data?我感到有限,因为我无法动态制作变量。
答案 0 :(得分:2)
这听起来像你要问的是,你能在运行时动态分配空间吗?答案是肯定的,最常见的方法之一是;
int Func ()
{
int Distance;
Distance = 132;
}
在汇编中,这看起来像
push rbp
mov rbp, rsp
sub rsp, 8 Now RSP points to what is essentially Distance
mov dword [rbp-8], 132
另一个值可以存储在@ [rbp-4]中,因为dwords只需要4个字节。
还有其他几种分配空间的方法,可能会修改你的问题以更具体地说明你需要什么,然后我或其他人可以给你一个基于此的例子。
答案 1 :(得分:2)
我不知道其他汇编程序,但在tasm中,我使用这个宏,就像这个,将某个变量的地址保存在堆栈上,
@pushsz macro msg2psh, empty
local next_instr
ifnb <empty>
%out too many arguments in macro '@pushsz'
.err
endif
call next_instr ; pushes the address of the message as the return address
db msg2psh,0
next_instr:
endm
你可以像这样使用它:
push 0
@pushsz "hello world"
@pushsz "some text"
push 0
call MessageBoxA
正如您所看到的,字符串与指令一起编码,当然您不仅可以使用字符串,还可以使用其他类型,但请注意,此技术会修改堆栈,(请参阅上面的stdcall示例),所以您应该在使用后将其弹出或恢复堆栈。
要考虑的另一件事是内存的读/写访问,如果内存不可写并且您在其中保存了某些内容,则会发生异常。给定的宏假定数据是只读的,这是另一个例子:
@pushsz "My Stringzero here"
pop eax ; eax contains the address of the string
我认为将其转换为MASM宏语法并不难,抱歉不是masm用户,我在这里得到了这种技术https://vxheaven.org/29a/29a-2/29a-2.3_3