В C вы можете иметь несколько вещей в одной строке, например:
int a; int b = 1; a = b;
Не могли бы вы сделать это на сборке?
Я пробовал искать это на многих сайтах и просил помощи на некоторых серверах Discord, но безуспешно.
Зачем вам это нужно?
@teapot418 Мне просто интересно.
«Не могли бы вы сделать это на ассамблее?» Ассемблер, такой как FASM, допускает использование нескольких операндов в мнемонике инструкции (push ax bx cx
), а ассемблер, такой как EuroAssembler, допускает несколько инструкций в одной строке. Созданный мной ассемблер даже допускает оба этих варианта синтаксиса вместе.
Конечно, несколько кодов операций, если вы пишете машинный код вручную. db 0xff, 0xc0, 0xff, 0xc9
— это код операции + байты ModRM, которые кодируют inc eax
/dec ecx
.
Несколько исходных инструкций asm, нет. В отличие от ассемблера GNU, здесь нет другого символа-разделителя операторов, кроме новой строки.
В ГАЗе можете написать inc eax; dec ecx
, если хотите. Символ комментария x86 GAS — #
, разделитель операторов — ;
— это совсем другой ассемблер, чем NASM.
Однако @ecm указывает на одну хитрость: вы можете определить макрос NASM, который помещает каждый аргумент в отдельную строку, и использовать его следующим образом:
foo inc eax, {mov ebx, eax}, push rax
См. руководство для получения информации о директивах макроса для перебора параметров макроса для макроса, который принимает произвольное их количество:
%macro foo 1-* ; require 1 or more params
%rep %0 ; repeat for number of params
%1 ; expand the first param on a line by itself
%rotate 1 ; rotate the params so the second one is now first
%endrep
%endmacro
Большой! Это очень помогает.
В NASM вы можете создать многострочный макрос, который принимает в качестве параметров несколько инструкций, например
mmacro inc ax, {mov bx, ax}, push ax
. Кроме этого NASM не поддерживает несколько инструкций в строке.