Понимает ли сборка числа, которые не являются шестнадцатеричными? - PullRequest
0 голосов
/ 03 сентября 2018

Если мой вопрос звучит бессмысленно, простите меня.

Но я в замешательстве, скажем, я определяю постоянную buffer_size В коде, который я изучаю, есть строка, которая гласит: buffer_size equ 16, что, по моему мнению, означает buffer_size 16 большой. Но в других примерах кода, которые я рассматриваю, числа имеют символ h рядом с ними, что, как мне сказали, говорит ассемблеру считать число шестнадцатеричным.

Если число не имеет h рядом с ним, делает ли оно его десятичным?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Будьте осторожны, понимайте, что языки ассемблера, как правило, не стандартизированы так, как многие языки более высокого уровня, поэтому вопрос довольно расплывчатый, вы даже не указали набор инструкций. Тег masm32 подразумевает x86 (этот тег был добавлен для вас).

Похоже, вы хотели x86 и конкретное подмножество семейства masm для ассемблеров.

Сборка обычно определяется ассемблером, инструментом, а не набором команд. Поэтому, когда вы хотите узнать, как работает язык ассемблера или его правила, вы должны взглянуть на самого ассемблера. Его документация, если таковая имеется, или если она достаточно хороша, если нет, вам придется экспериментировать.

У меня нет под рукой masm32, мне нужна некоторая боль, но у меня есть другой легко доступный ассемблер, и вы можете экспериментально ответить на свой вопрос. (как уже отмечалось в другом ответе, да без h в маске по умолчанию используется десятичное число)

mov al,10h
mov al,0x10
mov al,10

который разбирает на

00000000  B010              mov al,0x10
00000002  B010              mov al,0x10
00000004  B00A              mov al,0xa

В этом случае не указано означает, что по умолчанию используется десятичная дробь, чего вы должны ожидать, по крайней мере, для инструкций от masm.

Синтаксис без инструкций, который также является частью языка ассемблера, может иметь правила синтаксиса, отличные от инструкционной части языка. Можно было бы надеяться, что инструмент использует одни и те же правила для чисел, но вы никогда не знаете.

Аналогично, могут существовать инструкции, которые используют немедленное значение в качестве смещения для регистра, а не значение, загружаемое в регистр, можно надеяться, что эти непосредственные значения / значения также следуют тем же правилам.

Лучше всего экспериментировать и быть уверенным, а не надеяться, что руководство или веб-страница полны и правильны.

К вашему заглавному вопросу, который опять-таки очень расплывчатый, да, есть ассемблеры, которые понимают восьмеричные, десятичные и шестнадцатеричные (и, возможно, другие основания, такие как основание 2), не обязательно все в одном инструменте, и не ограничиваются x86, так как Титул вопроса не имеет. И то, что они по умолчанию и какой синтаксис требуется, чтобы указать базу, является специфическим для каждого инструмента. Точка, являющаяся языком ассемблера, не похожа на другие языки программирования, не может обобщать язык ассемблера Для кого-то было бы просто создать новый ассемблер для какой-то цели, которая не соответствует обобщению, но была бы совершенно полезным инструментом.

0 голосов
/ 03 сентября 2018

Да, MASM (и почти все другие современные ассемблеры 1 ) похожи на C / C ++: числовые литералы по умолчанию десятичные .

Вы можете использовать другие базы с суффиксами. См. Как представить шестнадцатеричное значение, такое как FFFFFFBB, в программировании встроенной сборки x86? для синтаксиса. Некоторые ассемблеры, такие как NASM, допускают 0x123, а также 123h, но MASM only допускает суффиксы.

10h в MASM точно такой же, как 0x10 в C, и в точности эквивалентен 16.

Собранный машинный код не зависит от исходного представления числа. (mov eax, 10h составляет 5 байтов: код операции, а затем 32-разрядное двоичное число с прямым порядком байтов, такое же, как mov eax, 16.)

То же самое относится и к foo: db 0FFh: код, который добавляет что-то к этому, не «добавляет шестнадцатеричные числа», это просто обычное двоичное число. (Распространенная ошибка новичка (в терминологии или понимании обычно непонятно, что именно) - путать представление исходного кода с тем, что делает машина, когда запускает вывод на ассемблере.


Сноска 1: Древние сборщики могут отличаться. Для некоторых не x86-платформ может быть несколько ассемблеров, которые по умолчанию не имеют десятичного значения.

Встроенный в устаревший DOS DEBUG.EXE обрабатывает все числовые литералы как шестнадцатеричные, поэтому mov ax, 10 = mov ax, 8+8. (Если он даже оценивает константные выражения, но если нет, то вы понимаете, о чем я.)

DEBUG.EXE даже не поддерживает метки, так что в принципе это ужасно по современным стандартам; не используйте это. В наши дни существуют бесплатные ассемблеры с открытым исходным кодом, такие как NASM, а также отладчики, в том числе, по крайней мере, один встроенный в BOCHS, так что не нужно страдать от старых инструментов.

В любом случае, этот отступление от DEBUG.EXE на самом деле не имеет отношения к вашему вопросу о MASM; Я только упоминаю это как единственный известный мне пример ассемблера, который по умолчанию не является десятичным. Они существуют, но в наши дни это ненормально.

...