Явно введите десятичное число в сборке

Я часто не сразу понимаю, является ли число десятичным или шестнадцатеричным (если шестнадцатеричное число не имеет префикса или букв). Например, из предыдущего вопроса число вроде0000000000400078 и не уверен, что это такое.

Есть ли способ явно указать десятичное число с префиксом в x86_64? Например:

 mov     %rsp,       %rbp
 movb    $0x16,      -1(%rbp)
 movb    $0d22       -2(%rbp) # <-- something like this
 movb    $0b10110,   -3(%rbp)

Я знаю что делаю movb $22, -2(%rbx) работает, но есть ли способ явно указать префикс / суффикс, чтобы мы знали, что это десятичное число?

1 ответ

Решение

Нет, не на ГАЗ. https://sourceware.org/binutils/docs/as/Integers.html - десятичное целое число начинается с ненулевой цифры, за которой следует ноль или более цифр (0123456789).

Шестнадцатеричные числа на экране в отладчиках или выводе objdump иногда пропускают 0x, подобно 0000000000400078который шестнадцатеричный. Вы должны знать из контекста, что адреса почти всегда печатаются в шестнадцатеричном формате.

В исходном коде asm правила просты, недвусмысленны и не зависят от контекста. В исходном коде GAS, если вы не видите явного переопределения базы, оно является десятичным. Это относится к$123 немедленно, 123(%reg) смещения, .set xyz, 123 операнды директивы ассемблера, .long 123 псевдо-инструкции для вывода байтов / двойных слов в вывод, а также любой другой контекст, в котором GAS позволяет вам писать числовой литерал.

Это также относится ко всем ISA, которые поддерживает GAS - обратите внимание, что эта часть руководства GAS не относится к одной конкретной ISA. И, конечно же, для x86-64 это применимо как к.intel_syntax noprefix режим и в режиме AT&T.


Различные ассемблеры могут поддерживать разные способы записи чисел в разных основаниях, по крайней мере, для недесятичных оснований; этот ответ предназначен для GAS, ассемблера GNU.

Есть несколько ассемблеров, особенно неприятная устаревшая DOS. debug.exe, где каждый числовой литерал считается шестнадцатеричным. debug.exe вообще не поддерживает десятичные числа. Как любит указывать @old_timer, синтаксис сборки определяется ассемблером, а не ISA.

Большинство ассемблеров x86 (NASM, MASM, GAS, Go-asm) по умолчанию используют десятичные числа, если нет явного модификатора. Некоторые из них могут иметь явно десятичный синтаксис, который вы можете использовать, если хотите, но в GAS нет.

Другие вопросы по тегам