Возможно ли в x86_64 Linux NASM иметь несколько кодов операций в одной строке?

В C вы можете иметь несколько вещей в одной строке, например:

int a; int b = 1; a = b;

Не могли бы вы сделать это на сборке?

Я пробовал искать это на многих сайтах и ​​просил помощи на некоторых серверах Discord, но безуспешно.

В NASM вы можете создать многострочный макрос, который принимает в качестве параметров несколько инструкций, например mmacro inc ax, {mov bx, ax}, push ax. Кроме этого NASM не поддерживает несколько инструкций в строке.

ecm 18.06.2024 14:18

Зачем вам это нужно?

teapot418 18.06.2024 14:32

@teapot418 Мне просто интересно.

NameGoesThere 18.06.2024 15:49

«Не могли бы вы сделать это на ассамблее?» Ассемблер, такой как FASM, допускает использование нескольких операндов в мнемонике инструкции (push ax bx cx), а ассемблер, такой как EuroAssembler, допускает несколько инструкций в одной строке. Созданный мной ассемблер даже допускает оба этих варианта синтаксиса вместе.

Sep Roland 23.06.2024 20:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конечно, несколько кодов операций, если вы пишете машинный код вручную. 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

Большой! Это очень помогает.

NameGoesThere 19.06.2024 01:54

Другие вопросы по теме