【问题标题】:Get the size of a variable in assembly language at runtime在运行时获取汇编语言中变量的大小
【发布时间】:2013-03-21 00:11:35
【问题描述】:

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

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

【问题讨论】:

  • 这个搜索查询没有给我任何有用的结果,所以我希望这个问题不会因为缺乏研究而被否决:google.com/…
  • 当我尝试运行指令mov bx, sizeof bx 时,MASM 汇编器产生以下错误:1>p4.asm(57): error A2009: syntax error in expression
  • 你应该问真正的问题,即你想要达到什么目的。 为什么你需要“寄存器大小”?这个操作没有意义。
  • @IgorSkochinsky 我想以字节为单位获取变量的大小比以字节为单位的寄存器大小更有用 - 我只是想知道是否可以获得寄存器以及变量的大小。

标签: assembly x86


【解决方案1】:

是的,就是这样做

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"

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多