Как представить шестнадцатеричное значение, такое как 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 (и совместимый), GNU as, 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. Все права защищены.

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