Как представить шестнадцатеричное значение, такое как FFFFFFBB, в программировании сборки x86?
Я изучаю программирование встроенной сборки x86.
Я хотел написать mov ecx, FFFFFFBB
Однако компилятор не распознает это. Как должны быть записаны шестнадцатеричные числа в коде встроенного ассемблера?
4 ответа
Это зависит от вкуса вашего ассемблера.
- AT & T:
movl $0xFFFFFFBB, %ecx
- Intel:
mov ecx, 0FFFFFFBBh
Синтаксис FYI, AT&T используется ассемблерами, такими как GNU Assembler, тогда как NASM и большинство других используют синтаксис Intel.
Смотрите вики-теги x86 для ссылок на руководства по ассемблеру и многое другое.
Различные ассемблеры x86 поддерживают один или оба этих синтаксиса для шестнадцатеричных констант:
0xDEADBEEF
: NASM (и совместимый), GNUas
, FASM, MSVC inline asm (но не MASM)0DEADBEEFh
: NASM (и совместимый), FASM, MASM, TASM.
Ассемблеры только для DOS/Windows часто поддерживают только ...h
синтаксис.
Портативные сборщики обычно поддерживают 0x...
синтаксис или оба.
Обратите внимание на ведущие 0
: Числовые константы всегда должны начинаться с цифры, чтобы отличать их от имен символов.
Также обратите внимание, что ассемблеры, такие как компиляторы C, могут оценивать выражения во время сборки, поэтому вы можете написать foo & 0xF
(если foo
константа ассемблера, определенная с foo equ 0xABC
или что-то). Вы можете даже добавлять / вычитать из меток (которые являются константами времени ссылки, а не времени сборки), так что mov eax, OFFSET label - 20
все еще собирается в mov r32, imm32
,
Из раздела руководства NASM по константам:
Некоторые примеры (все производят точно такой же код):
mov ax,200 ; decimal mov ax,0200 ; still decimal mov ax,0200d ; explicitly decimal mov ax,0d200 ; also decimal mov ax,0c8h ; hex mov ax,$0c8 ; hex again: the 0 is required mov ax,0xc8 ; hex yet again mov ax,0hc8 ; still hex mov ax,310q ; octal mov ax,310o ; octal again mov ax,0o310 ; octal yet again mov ax,0q310 ; octal yet again mov ax,11001000b ; binary mov ax,1100_1000b ; same binary constant mov ax,1100_1000y ; same binary constant once more mov ax,0b1100_1000 ; same binary constant yet again mov ax,0y1100_1000 ; same binary constant yet again
Большинство ассемблеров также допускают символьные литералы, такие как '0'
для ASCII ноль. Или даже '0123'
для четырех цифр ASCII, упакованных в 32-битное целое число. Некоторые поддерживают escape-последовательности (\n'
), некоторые (например, YASM) нет. NASM поддерживает только escape-последовательности внутри обратных кавычек, а не двойные кавычки.
Другие платформы:
ARM ассемблер: 0xDEADBEEF
работает.
Я думаю 0x... это типично. 0...h это в основном DOS.
Это зависит от вашего ассемблера, но обычные обозначения для шестнадцатеричных литералов 0FFFFFFBBh
,
Шестнадцатеричные числа обычно всегда обозначаются лидирующими 0x
так что вы бы использовали 0xFFFFFFBB
,
0FFFFFFFFh
Microsoft (R) Macro Assembler Версия 6.14.8444
Авторское право (C) Microsoft Corp 1981-1997. Все права защищены.