2016-10-31 3 views
4

У меня возникли проблемы с простотой EQU директива в ассемблере (8086).Монтаж 8086 EQU директива

abc EQU xyz 

ли EQU буквально свопы а, когда в программном коде с А, независимо от хуга представляет, значение и т.д.?

i.e Можно ли написать?

varA EQU [bp+4] 

mov ax, varA 

И еще один вопрос EQU глобально доступен, то есть я могу определить фас из процедуры, и в порядке, чтобы использовать его?

+0

В зависимости от используемого ассемблера. Это emu8086? Тогда я не знаю. Но большинство ассемблеров x86 не имеют препроцессора. Таким образом, EQU в таком случае оценивается по определению, а не заменяется. И я уверен, что на 99% это ваше дело. Для препроцессора не забудьте запустить какой-либо препроцессор компилятора C (или даже что-то автономное, но у меня всегда есть gcc, поэтому я бы пошел на C). – Ped7g

+0

Ух, я понял. Есть ли что-то вроде препроцессора в сборке, мне это действительно нужно? – luka032

+0

Только что отредактировал мой ответ, чтобы продемонстрировать, что EQU являются глобальными (EQU объявляется внутри процедуры). –

ответ

4

EQU элементы не являются переменными, они не занимают никакого места в памяти:

  • Когда EQU referes к постоянному значению, становится синонимом этого значения. Это значение не может быть перезаписано, даже если вы его попробуете, оно не изменится.
  • Когда EQU ссылается на другую переменную, он становится синонимом этой переменной, поэтому все, что происходит с синонимом, будет происходить с переменной.

копипаст следующий код в EMU8086 и запуск:

.model small 
.stack 100h 
.data 

xyz DW 2016 ;◄■■■ ABC IS NOT A VARIABLE, IT IS 
abc EQU xyz  ;  JUST A SYNONYM FOR XYZ. 

pqr EQU 10  ;◄■■■ PQR IS NOT A VARIABLE, IT IS 
       ;  JUST A SNYNONYM FOR NUMBER 10. 

varA EQU [bp+2] ;◄■■■ BP POINTS TO GARBAGE. 

.code 

mov ax, @data 
mov ds, ax 

mov abc, 25 ;◄■■■ XYZ BECOMES 25!!!! 

mov pqr, 999 ;◄■■■ NO ERROR, BUT THE VALUE WILL NOT CHANGE. 
mov ax, pqr ;◄■■■ AX IS NOT 999, AX=10. 

mov si, varA ;◄■■■ GARBAGE. 
mov bp, sp 
mov si, varA ;◄■■■ DIFFERENT GARBAGE. 
push ax   ;◄■■■ PUSH 10. 
call my_proc 

mov ax, NUMBER ;◄■■■ YES, EQUS ARE GLOBAL!!! (AX=0B9H). 

mov ax, 4c00h 
int 21h 

;----------------------------------------- 

my_proc proc 
mov bp, sp 
mov si, varA ;◄■■■ WRONG VALUE (ANOTHER GARBAGE). 
mov si, [bp+2] ;◄■■■ PROPER VALUE (10). 

varB EQU [bp+2] 
mov si, varB ;◄■■■ WRONG AGAIN. 

NUMBER EQU 0b9h ;◄■■■ DEFINE EQU INSIDE PROCEDURE. 

ret 
my_proc endp   

В случае [bp+2] это просто, кажется, не работает, вероятно, потому, что компилятор не может получить фиксированное значение.

+2

Произведенный мусор с использованием 'varA EQU [bp + 2]' и 'varB EQU [bp + 2]' наглядно демонстрирует, что EMU8086 даже не принял эти приравнивается в первую очередь. Еще один недостаток в эмуляторе! +1 Приятно видеть, что вы нашли время, чтобы узнать об EQU. – Fifoernik

+1

* mov pqr, 999; ◄ ■■■ НЕТ ОШИБКИ, НО ЗНАЧЕНИЕ НЕ ИЗМЕНИТЬ. * Я не могу поверить своим глазам, что EMU8086 принимает это! Где закончится список причуд от этого эмулятора? –

3

Некоторые ассемблеры имеют разумную поддержку макросов, которая обычно работает внутри как препроцессор или очень близко к ней.

В противном случае, как я уже писал в комментарии, почему бы вам не использовать препроцессор C? (это автономный инструмент, вы можете препроцитировать любой текстовый файл с ним, просто используя #define и другие, чтобы расширить ваш источник asm, остальная часть содержимого не должна выглядеть как источник C, препроцессор не заботится, он обрабатывает файл как [любой] текстовый файл).

Вам это нужно? Я бы не стал. Я сделал огромный код в ASM только из-за моего отсутствия опыта, а макропроцессор/препроцессор не спас меня от этой огромной ошибки (они, вероятно, просто сделают ее менее очевидной и несколько более терпимой в течение более длительного периода времени).

Пока вы делаете в ASM только небольшие кусочки кода по образовательным причинам или производительности/низкоуровневые вещи, макросы/препроцессор будут ИМХО добавлять слой абстракции, затеняя полученные инструкции, поэтому во время отладки вы можете попросить " откуда это взялось? ». Я предпочитаю писать каждую инструкцию ASM вручную, зная, почему я ее там помещаю, я не хочу никаких сюрпризов в коде ASM, уже довольно сложно писать бесплатный код в ASM.

Затем снова большая часть моей работы в конце ASM были 256B интро, так что я действительно должен был знать о каждом байте производится ... :)

+0

Бьюсь об заклад, вы были парнем, который написал эти Apple] [ROM-карты с расширением, у которых было всего 256 байт. Они были настолько плотными для памяти, что я увидел какой-то код, который разветвлен до середины другой инструкции, чтобы получить побочный эффект. Это было смещение '0x38' другой инструкции филиала, следующей за' RTS'. То, что '0x38', является инструкцией' SEC', и нахальный chap, разветвленный там, чтобы получить 'RTS' с набором переноса. –

+0

@WeatherVane Я должен смиренно признаться, что у меня так и не получилось ... самомодифицирующийся код? Проверьте. Использовать сам код также как данные для обработки? Проверьте. Но частично повторно используемый код операции ... не могу вспомнить, как это сделать. Это развлекательный анекдот. :) (и я никогда не делал Apple] [, только ZX Spectrum) – Ped7g

4

EQU просто означает равенство, поэтому abc EQU xyz, хуг должны быть определены ранее ,

В вашем втором примере, он должен был бы быть как

%define varA [bp+4] 

mov ax, varA 

Затем после того, как код собран, объект дампа даст

мов ах, [BP + 4]

тогда вы могли бы сделать что-то вроде

Bubble equ varA 

mov bx, Bubble 

и вы получите

мов BX, [BP + 4]

В общем, все монтажники работают точно так же, хотя синтаксически есть тонкие нюансы, такие как NASM требует %, другие могут не.

Смежные вопросы