Assembly 字符串连接NASM

Assembly 字符串连接NASM,assembly,x86,nasm,Assembly,X86,Nasm,我试图将两个字符串连接到另一个字符串中,以尝试在汇编中实现FizzBuzz。我的数据库值如下所示: buffer: times 10 db 0 fizz: db "Fizz" ; Length of each is 4, so add 4. buzz: db "Buzz" 我一直试图做的是类似于mov buffer,[fizz]。然而,每当我尝试这样的操作时,NASM都会说操作码和操作数的组合无效。我自己在学习汇编,刚刚开始,如果这看起来很明显,我很抱歉。在NASM中,标

我试图将两个字符串连接到另一个字符串中,以尝试在汇编中实现FizzBuzz。我的数据库值如下所示:

buffer:  times 10 db 0
fizz:   db "Fizz"       ; Length of each is 4, so add 4.
buzz:   db "Buzz"
我一直试图做的是类似于
mov buffer,[fizz]
。然而,每当我尝试这样的操作时,NASM都会说操作码和操作数的组合无效。我自己在学习汇编,刚刚开始,如果这看起来很明显,我很抱歉。

在NASM中,标识符缓冲区仅表示变量缓冲区的地址,符号缓冲区被视为立即值。
当您编写
mov buffer时,[fizz]
实际上要求将内存内容移动到立即数,这是不可能的

这样做的一种方法是使用中间寄存器

mov eax, [fizz]
mov [buffer], eax
mov eax, [buzz]
mov [buffer+4], eax
如果你不能备用寄存器,那么使用

push dword [fizz]
pop  dword [buffer]
push dword [buzz]
pop  dword [buffer+4]

您不能像这样将数据从一个内存位置复制到另一个内存位置。请看一下字符串说明
movsb
可能是一个很好的起点,其次是
movsw
movsd
。但基本上,将源代码指向fizz,将dest指向buffer,然后复制4个字节。重新定位源以指向buzz,然后复制另外4个字节。在这种情况下,两个字符串都有4个字符,并且目标缓冲区被初始化为全零,您还可以执行如下操作:
mov eax,[fizz]
mov[buffer],eax/
mov eax,[buzz]
/
mov[buffer+4],eax
我可能误解了这一点,但当您用括号(例如,[buffer])括起一个名称时,您是在说buffer中的值。如果缓冲区的内容大于一个双字,如何推送或弹出它?程序缓冲区中的@williamwist有10个字节。要
push
它的全部内容(关于X86的尾端),您可以编写:
push word[buffer+8]
push dword[buffer+4]`push dword[buffer]`