Явно введите десятичное число в сборке
Я часто не сразу понимаю, является ли число десятичным или шестнадцатеричным (если шестнадцатеричное число не имеет префикса или букв). Например, из предыдущего вопроса число вроде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 нет.