【问题标题】:error: value out of range in FASM x86 assembly错误:FASM x86 程序集中的值超出范围
【发布时间】:2013-03-23 20:53:01
【问题描述】:

为什么我在下面的代码中得到error: value out of range.

mov eax,dword ptr "abcdlol$"

我想将"abcdlol" 的地址放入eax 寄存器,但看起来这不是FASM 复制到eax 的值。

C 代码示例:int *p="lol";

如何解决这个问题?这是汇编程序的限制吗?

【问题讨论】:

  • 汇编语言非常原始,几乎和单个指令一样原始。 mov eax,dword ptr "abcdlol$"(暂时假设它是正确且有意义的)和int *p="lol"; 要求至少做两件事:为数据分配空间并将数据写入那里并将该数据的地址放入寄存器或变量中。没有一条指令或汇编语言指令可以做到这一切。您必须将事情进一步分解为数据定义/声明和代码。

标签: assembly x86 fasm


【解决方案1】:

它应该是FASM语法:

mov eax,my_string 我的字符串数据库“abcdlol$”

你也可以使用lea:

lea eax,[my_string] 我的字符串数据库“abcdlol$”

是否使用 ASCIIZ 字符串(以 0 结尾)或其他一些终止符取决于您要对字符串执行的操作。看来您正在使用$ 作为字符串终止符,DOS 打印字符串函数使用它。检查$ 是否是您将要使用的 OS API 函数(如果有)的正确字符串终止符。例如,printf 需要以零结尾 (ASCIIZ) 的字符串。

参见FASM HelloWorld .exe program 参见FASM 语法示例。

dword ptr 等仅在寻址内存时才需要。 mov eax,abcdlol 只是一个 mov eax,immed32。处理器不担心您是将存储在eax 中的值用作数字还是指针。

【讨论】:

  • abcdlol 在您的示例中是一个标签吗?我真的很想把字符串的地址放入eax。
  • 是的,abcdlol是一个标签,否则不能引用。
【解决方案2】:

这应该可行:

mystring  db  "abcdlol", 0
mov eax,mystring

【讨论】:

    【解决方案3】:

    回到基础:

    EAX 只能存储 4 个字节。 “abcdlol$”是 8 个字节。因此,您应该按照其他发帖人的建议,将其地址放入 EAX,而不是直接放入值。但如果您坚持,请使用两个寄存器:

    mov eax,"abcd" ;4 bytes
    mov ebx,"lol$" ;4 bytes
    

    或在 64 位中,

    mov rax,"abcdlol$"
    

    您应该区分传递立即数和传递地址到寄存器之间的区别。

    【讨论】:

      猜你喜欢
      • 2022-11-26
      • 2013-10-04
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 2015-05-27
      • 2011-08-15
      相关资源
      最近更新 更多