1

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

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

4

2 回答 2

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"
于 2013-03-21T00:20:20.320 回答
3

如果您正在编程 x86 汇编,通用寄存器(包括eaxebx)始终是 32 位字。有指令可以访问每个寄存器的低 16 位,以及分别访问这 16 位的每个字节,但您必须明确使用它们并自己跟踪每个寄存器中预期数据大小的大小。一个警告:如果您正在执行 x86_64 编程,那么寄存器将扩展为 64 位,并且名称从 example 更改eaxraxor r0

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

于 2013-03-21T00:18:07.917 回答