在运行时以汇编语言获取变量的大小

时间:2013-03-21 00:11:36

标签: assembly x86

我试图在运行时以x86汇编语言获取寄存器的大小(以字节为单位),但我不知道它是否可能。在x86汇编语言中,是否可以在运行时获取寄存器的大小?例如,是否可以获得寄存器或变量的大小(例如ebx),并将其移动到另一个寄存器(例如eax)?

当我尝试运行指令mov bx, sizeof bx时,MASM汇编程序产生了以下错误:1>p4.asm(57): error A2009: syntax error in expression

2 个答案:

答案 0 :(得分:4)

是的,只是做

mov eax, 4 ; eax = size of ebx in bytes

CPU寄存器的大小不灵活,它们是固定的。

对于变量,只需在变量后添加一个标签并使用差异,如下所示:

mystring db "blah blah blah",10,0
mystringend label $ ; or simply "mystringend:"
...
mov eax, mystringend - mystring ; or "offset mystringend - offset mystring"

答案 1 :(得分:2)

如果您正在编写x86汇编语言,则通用寄存器(包括eaxebx)始终是32位字。有一些指令可以访问每个寄存器的低16位,以及这些16位的每个字节,但必须明确使用它们并自己跟踪每个寄存器中数据的预期大小。需要注意的是:如果您正在进行x86_64编程,则寄存器会扩展为64位,名称会从eax更改为raxr0

组装中也没有变量这样的东西;当您引用存储器地址时,操作码位中会编码,告诉进程存储器访问是字节,字,双字还是更大。如果您使用像MASM这样的汇编程序,那么您可以“声明”变量以具有一定的大小,然后汇编程序将跟踪您的基本类型检查,但处理器本身无法知道“大小”变量