我试图在运行时以x86汇编语言获取寄存器的大小(以字节为单位),但我不知道它是否可能。在x86汇编语言中,是否可以在运行时获取寄存器的大小?例如,是否可以获得寄存器或变量的大小(例如ebx
),并将其移动到另一个寄存器(例如eax
)?
当我尝试运行指令mov bx, sizeof bx
时,MASM汇编程序产生了以下错误:1>p4.asm(57): error A2009: syntax error in expression
。
答案 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汇编语言,则通用寄存器(包括eax
和ebx
)始终是32位字。有一些指令可以访问每个寄存器的低16位,以及这些16位的每个字节,但必须明确使用它们并自己跟踪每个寄存器中数据的预期大小。需要注意的是:如果您正在进行x86_64编程,则寄存器会扩展为64位,名称会从eax
更改为rax
或r0
。
组装中也没有变量这样的东西;当您引用存储器地址时,操作码位中会编码,告诉进程存储器访问是字节,字,双字还是更大。如果您使用像MASM这样的汇编程序,那么您可以“声明”变量以具有一定的大小,然后汇编程序将跟踪您的基本类型检查,但处理器本身无法知道“大小”变量