.set label, . Против ярлык: GNU AS
В ассемблере GNU текущий адрес представлен .
Это позволяет установить константу / символ и использовать ее, как если бы она была меткой, например:
.set offset, .
.long 0x10
.globl _start
_start:
# %eax should be 0x10
movl offset, %eax
# %ebx should be address of offset
movl $offset, %ebx
# Value at the address of offset should contain 0x20
movl $0x20, offset
Приведенный выше код ведет себя точно так же, как если бы offset
была метка вместо символа.
Есть ли случай, когда вышеизложенное не соответствует действительности, или является label:
на самом деле просто сокращение для .set label, .
?
0 ответов
Очень интересный вопрос. Я никогда раньше не видел, чтобы кто-то делал это. Короче да, они немного разные. Вот пара случаев:
Местные лейблы
Это работает:
// Local label:
movq $2, %rax
1:
decq %rax
// Branch to preceding local label 1
jg 1b
Но это не так:
// Test the same thing with set:
movq $2, %rax
.set 1, .
decq %rax
// Branch to preceding local label 1
jg 1b
gcc излучает: Error: expected symbol name
потому что имена символов не могут начинаться с цифр. Дополнительные сведения об именах символов см. В документации binutils.
Множественные определения
Когда у вас есть два или более определений, использующих одно и то же имя символа, метки ведут себя по-разному. В документации говорится, что первая метка переопределяет все другие метки, но на практике ваш компилятор даже не позволит вам это сделать, даже если.set
псевдооперация используется позже. С другой стороны,.set
позволит вам назначать один и тот же символ несколько раз, но когда используется метка с тем же именем, значение символа больше не может быть изменено после этого. Этикетка делает символ "только для чтения".
Когда используешь .set
несколько раз это всегда самое последнее значение или, если оно еще не было установлено, следующее доступное значение.
Допустим, нам нужно куда-то вставить следующую строку:
remote: jmp retval
jmp remote
//// If inserted here, the program returns -1
// Return -1
.set retval, .
movq $-1, %rax
jmp exit
//// If inserted here, the program returns -1
// Return 1 (also works as a label since we don't try to set it again after this)
.set retval, .
movq $1, %rax
jmp exit
//// If inserted here, the program returns 1
exit:
Если вы хотите убедиться, что вы не используете повторно определенный ранее символ, используйте .eqv
или .equiv
.
Говоря о сокращении: операторы присваивания
В =
а также ==
операторы также могут использоваться для установки значений символов. См. Раздел " Установка символов".
// This...
a=.
// ... is equivalent to
.set a, .
// ... or this (since .set and .equ are synonymous)...
.equ a, .
// And this...
a==.
// ... is equivalent to...
.eqv a, .
Для примера использования этого ab см. Этот код гольф-задачи.