Как представить шестнадцатеричное значение, такое как FFFFFFBB в программировании встроенной сборки x86?

Я изучаю встроенное программирование сборки x86. Я хотел написать mov ecx, FFFFFFBB, однако компилятор не узнает его. Как следует использовать такие шестнадцатеричные числа в встроенном ассемблерном коде?

Ответ 1

Это зависит от вкуса вашего ассемблера.

  • AT & T: movl $0xFFFFFFBB, %ecx
  • Intel: mov ecx, 0FFFFFFBBh

Синтаксис FYI, AT & T используется ассемблерами, такими как GNU Assembler, тогда как NASM и большинство других используют Intel one.

Ответ 2

См. теги wiki для ссылки на ассемблерные руководства и многое другое.


Различные ассемблеры x86 поддерживают один или оба этих синтаксиса для шестнадцатеричных констант:

  • 0xDEADBEEF: NASM (и совместимый), GNU as, FASM, встроенный asm (но не MASM) MSVC
  • 0DEADBEEFh: NASM (и совместимый), FASM, MASM, TASM.

Ассемблеры DOS/Windows-only часто поддерживают синтаксис ...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-последовательности внутри backquotes, а не двойные кавычки.


Другие платформы:

ARM-ассемблер: 0xDEADBEEF работает.

Я думаю, 0x... типичен. 0... h - это в основном вещь DOS.

Ответ 3

Шестнадцатеричные числа обычно всегда представлены с ведущим 0x, поэтому вы используете 0xFFFFFFBB.

Ответ 4

Это зависит от вашего ассемблера, но общая нотация для шестнадцатеричных литералов 0FFFFFFBBh.

Ответ 5

0FFFFFFFFh

Макроассемблер Microsoft (R) версии 6.14.8444

Авторское право (C) Microsoft Corp 1981-1997. Все права защищены.