Как использовать .if, .else, .elseif для x86 ассемблера - PullRequest
0 голосов
/ 24 октября 2019

У меня возникли некоторые проблемы с операторами .if, .else и т. Д. Для Assembly.

Мой код должен перевернуть массив чисел на месте, и он должен работать для разных типов данных. У меня есть заявление, чтобы проверить тип данных. Если он имеет тип BYTE, он будет идти в первом операторе if, если это WORD, он будет проходить через следующий, если это DWORD, он будет переходить к третьему. Моя проблема в том, что компилятор выдает ошибки для блоков кода, которые не будут выполнены. В текущем коде у меня есть массив, установленный в байтах, и как таковой он выдает ошибки для последних 2 блоков операторов if. Не могли бы вы дать мне несколько советов, как это исправить.

numbers BYTE 10h, 20h, 30h, 40h, 50h, 60h, 70h, 80h, 90h

L1:

.if (ebx == 1) 
    mov al, numbers[esi]
    xchg al, numbers[edi]
    mov numbers[esi], al 
.elseif (ebx == 2) 
    mov ax, numbers[esi]
    xchg ax, numbers[edi]
    mov numbers[esi], ax 
.else 
    mov eax, numbers[esi]
    xchg eax, numbers[edi]
    mov numbers[esi], eax
.endif
add esi, (type_of_numbers)
sub edi, (type_of_numbers)

Loop L1

Ответы [ 2 ]

1 голос
/ 24 октября 2019

При необходимости добавьте переопределения размера (номера байтов PTR [esi], WORD PTR ..., DWORD PTR ...). - Майкл

0 голосов
/ 25 октября 2019

.if / .elseif - это время выполнения проверки , а не время сборки, как C #if / #else. Вот почему все блоки должны собираться правильно, даже если они не соответствуют типу numbers.

Это выглядит очень неэффективно;Вы наверняка знаете тип numbers во время сборки, например TYPE numbers, и хотите использовать доступы, соответствующие ширине этого типа?

MASM имеет время сборки IF и ELSE(обратите внимание на отсутствие .) для условной сборки на основе констант . Это позволило бы вам собрать только тот блок, который соответствует объявлению numbers, и, следовательно, не нуждался бы в переопределениях размера.

Как вы сравниваете типы переменных в сборке? и смотрите такжеhttps://msdn.microsoft.com/en-us/library/4bd8b239.aspx re: if директивы в MASM.

Так что я думаю вы бы сделали что-то вроде

IF       TYPE numbers == 1
   ... byte swap
ELSEIF   TYPE numbers == 2 
   ... word swap
ELSE
   ... dword swap
ENDIF

Я неНа 100% уверен, что вы можете использовать TYPE symbol в директиве IF / ELSEIF.


(Конечно, если вы заботитесь об эффективности, вы бы не использовали xchg [mem], reg, потому что это атомный обмен с полнымбарьер памяти: к сожалению, это префикс lock.)

...