1

为什么我要error: value out of range.输入以下代码?

mov eax,dword ptr "abcdlol$"

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

C代码中的一个例子:int *p="lol";

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

4

3 回答 3

4

它应该是 FASM 语法:

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

您还可以使用lea

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

是使用 ASCIIZ 字符串(以 0 结尾)还是其他一些终止符取决于您要对字符串做什么。似乎您正在使用$作为字符串终止符,这是 DOS 打印字符串函数使用的。检查$您要使用的 OS API 函数(如果有)的字符串终止符是否正确。例如printf需要以零结尾的 (ASCIIZ) 字符串。

请参阅FASM HelloWorld .exe 程序,请参阅 FASM 语法示例。

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

于 2013-03-23T20:56:45.343 回答
1

这应该有效:

mystring  db  "abcdlol", 0
mov eax,mystring
于 2013-03-23T21:14:12.857 回答
0

回归本源:

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

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

或在 64 位中,

mov rax,"abcdlol$"

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

于 2014-01-27T16:36:43.630 回答