为什么我要error: value out of range.
输入以下代码?
mov eax,dword ptr "abcdlol$"
我想将 的地址"abcdlol"
放入eax
寄存器,但看起来这不是 FASM 正在复制的值eax
。
C代码中的一个例子:int *p="lol";
如何解决这个问题?这是汇编程序的限制吗?
它应该是 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
用作数字还是指针。
这应该有效:
mystring db "abcdlol", 0
mov eax,mystring
回归本源:
EAX 只能存储 4 个字节。“abcdlol$”是 8 个字节。因此,您应该按照其他发帖人的建议,将其地址放入 EAX,而不是直接放入值。但是,如果您坚持,请使用两个寄存器:
mov eax,"abcd" ;4 bytes
mov ebx,"lol$" ;4 bytes
或在 64 位中,
mov rax,"abcdlol$"
您应该区分传递立即值和传递地址到寄存器之间的区别。