汇编在.code(MASM)中定义变量

时间:2016-09-22 01:39:57

标签: variables assembly masm

有没有办法在.code部分创建变量,而不是.data?我感到有限,因为我无法动态制作变量。

2 个答案:

答案 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