2015-10-30 4 views
1

Я пытаюсь объединить две строки в другую строку для попытки реализации FizzBuzz в сборке. Мои ценности базы данных выглядеть примерно так:String concatenation NASM

buffer: times 10 db 0 
fizz: db "Fizz"  ; Length of each is 4, so add 4. 
buzz: db "Buzz" 

То, что я пытался сделать что-то вроде mov buffer, [fizz]. Однако, когда я пытаюсь что-то вроде этого, NASM говорит invalid combination of opcode and operands. Я изучаю сборку самостоятельно и только начинаю, поэтому мне жаль, если это может показаться очевидным.

+0

вы не можете просто скопировать данные из одного места памяти в другое, как это. Посмотрите на строковые инструкции. 'movsb', вероятно, является хорошим местом для начала, за которым следуют' movsw' и 'movsd'. Но в основном, укажите источник на fizz, укажите dest в буфере и скопируйте 4 байта. Переместите источник, чтобы указать на гудение, а затем скопируйте еще 4 байта. – enhzflep

+0

В этом случае с двумя строками, имеющими 4 символа, а целевой буфер инициализируется ко всем нулям, вы также можете сделать что-то вроде: «mov eax, [fizz]»/'mov [buffer], eax' /' mov eax, [buzz] '/' mov [buffer + 4], eax' – Michael

ответ

2

В 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] 
+0

Возможно, я ошибаюсь, но когда вы окружаете имя с помощью скобок (например, [buffer]), вы говорите _value_ внутри буфера. Если содержимое буфера больше, чем двойное слово, как вы его нажимаете или всплываете? –

+1

@WilliamWisdom В вашей программе _buffer_ имеет 10 байт. Чтобы «нажимать» все его содержимое (в соответствии с контентом X86), вы должны написать: 'push word [buffer + 8]' push dword [buffer + 4] 'push dword [buffer]' – Fifoernik