为什么我在以下代码中获得error: value out of range.
?
mov eax,dword ptr "abcdlol$"
我想将"abcdlol"
的地址放入eax
注册,但看起来并不是FASM正在复制到eax
的这个值。
C代码示例:int *p="lol";
如何解决这个问题?这是汇编程序的限制吗?
答案 0 :(得分:4)
它应该是FASM语法:
mov eax,my_string my_string db "abcdlol$"
您还可以使用lea
:
lea eax,[my_string] my_string db "abcdlol$"
是否使用ASCIIZ字符串(以0结尾)或其他终结符取决于您将对字符串执行的操作。您似乎使用$
作为字符串终止符,由DOS打印字符串函数使用。检查$
是否是您要使用的OS API函数的正确字符串终止符(如果有)。例如,printf
需要零终止(ASCIIZ)字符串。
请参阅FASM HelloWorld .exe program,查看FASM语法示例。
仅在寻址存储器时才需要 dword ptr
等。 mov eax,abcdlol
只是mov eax,immed32
。处理器不会担心您是否要将eax
中存储的值用作数字或指针。
答案 1 :(得分:1)
这应该有效:
mystring db "abcdlol", 0
mov eax,mystring
答案 2 :(得分:0)
回到基础:
EAX只能存储4个字节。 “abcdlol $”是8个字节。因此,不应直接放置值,而应按照其他海报的建议将其地址放入EAX中。但如果你坚持,请使用两个寄存器:
mov eax,"abcd" ;4 bytes
mov ebx,"lol$" ;4 bytes
或64位,
mov rax,"abcdlol$"
您应该告诉传递立即值和将地址传递给寄存器之间的区别。