2017-01-29 22 views
1

Почему .equ директива не работает в газе таким образом:EQU директива в сборе ГАЗ

.equ Mark64, 8(%rsi) 

в то время как он работает в этом (примечание: .text раздел, где Mark32 находится, устанавливается в г/ш в этот случай):

Mark32 EQU DWORD PTR [ESI + 4] 

Как я могу сделать Mark64 работу в ГАС (.set также не работает)?

Заранее благодарен!

+2

Используйте предварительно обработанную сборку и '# define'. Альтернативно, только определите смещение, например '.equ Mark64, 8', тогда вы можете сделать« movl Mark64 (% rsp),% eax' например. – Jester

+0

@ у вас есть? Это не работает, потому что '.equ' определяет символ, а не замену текста, а' 8 (% rsp) 'не является допустимым значением для символа. – Jester

+0

@fuz, да, я пробовал. запятая здесь является типичной ошибкой. все еще не работает –

ответ

-1

раздел данных:

MarksTable: 
    .quad Mark64_1 
    .quad Mark64_2 
    .quad Mark64_3 

где Mark64_x только метка в секции кода.

А потом я просто разместил мой MarksTable в Reg:

movq MarksTable, %rsi 

В конце концов, я мог бы получить доступ к Mark64_2, например, из rsi так:

callq *0x8(%rsi) 
+0

'movq MarksTable,% rsi' - это загрузка первого элемента. Используйте 'lea MarksTable (% rip),% rsi' или' mov $ MarksTable,% esi'. Или лучше, 'call * 8 + MarksTable (% rip)'. –

0

В некоторых языках сборки (например, MASM) equ - это текстовая подстановка.

Но в GAS .equ является числовой константой, например foo = 3 в MASM. Для текстовых замещений используйте препроцессор C #define Mark64 8(%rsi). Назовите свой файл foo.S, поэтому gcc запускает его через CPP перед сборкой.

equ в NASM также определяет постоянную времени сборки и использует %define для текстовых замещений.


И КСТАТИ, определяя Mark64 к 8(%rsi) кажется плохой/запутанной идеи. Люди не ожидают того, что похоже на имя символа, на самом деле содержат ссылку на регистр. Тем не менее определение числовой магической константы 8 для значимого имени может быть хорошим.