2014-09-05 2 views
0

Я работаю над созданием компилятора Джека Креншоу. Я переводил свои инструкции Motorola 680x0 в синтаксис x86 GAS.Переменное назначение в сборке GAS

При назначении переменных желаемая семантика заключается в создании ссылки на переменную с помощью относительной адресации на ПК (по крайней мере, это то, что делает Crenshaw). Переменная может быть доступна в синтаксисе Motorola по:

MOVE х (ПК), D0

где х имя переменной.

Вот что фактическая процедура выглядит для назначения (в Pascal):

procedure Assignment; 
var Name: char; 
begin 
    Name := GetName; 
    Match('='); 
    Expression; 
    EmitLn('LEA ' + Name + '(PC),A0'); 
    EmitLn('MOVE D0,(A0)') 
end; 

Попытка имитировать тот же синтаксис в результатах сборки ГАЗ в ошибке экспрессии барахло. Надеюсь, этот вопрос не слишком наивен, но я искал несколько дней и не вижу очевидного решения.

Как это сделать с синтаксисом GAS для процессора x86 в Linux (i386)? Я ищу простейшие средства для выполнения задания переменной. Я использую as и ld для моего ассемблера и компилятора, соответственно.

Вот ссылка, где я в настоящее время, глава 3 в Креншоу:

http://compilers.iecc.com/crenshaw/tutor3.txt

+1

ли вам это нужно использовать PC-относительной адресации? Если нет, это похоже на «movl% eax», «+ Name» (без чтения книги Креншоу). – Michael

ответ

3

x86-32 не PC-относительной адресации, но x86-64 делает. В любом случае, на x86 вам не нужно проходить регистрацию, вы можете использовать символ непосредственно в MOV. Таким образом, самый простой способ написать это будет: MOV source_register, variable_name. Если вы хотите, чтобы имитировать исходный код более внимательно, вы можете использовать LEA так:

LEA variable-name, temp_register 
MOV source_register, (temp_register) 
+0

Я думаю, что для этого подхода требуется, чтобы переменная была объявлена ​​первой. Похоже, что Crenshaw ничего не заявляет. Извините, я забыл упомянуть об этом в оригинальном вопросе. –

+0

Это не обязательно должно быть объявлено * первым *, но оно должно быть в конечном итоге определено где-то с распределением памяти. – Jester

+0

На самом деле, это полезно, может ли объявление быть встроенным, или оно должно быть в разделах .data или .bss? –

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