¿Cómo representar el valor hexadecimal como FFFFFFBB en la progtwigción de ensamblado en línea x86?

Estoy aprendiendo sobre la progtwigción de ensamblaje en línea x86. Quería escribir mov ecx, FFFFFFBB , pero el comstackdor no lo reconoce. ¿Cómo deberían escribirse números hexadecimales como ese en el código ensamblador en línea?

Depende del sabor de tu ensamblador.

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

Para su información, la syntax de AT & T es utilizada por ensambladores como GNU Assembler , mientras que NASM y la mayoría usan la de Intel.

Consulte la wiki de la etiqueta x86 para ver los enlaces a los manuales de ensamblador y muchas otras cosas.


Diferentes ensambladores x86 admiten una o ambas de estas syntax para constantes hexadecimales:

  • 0xDEADBEEF : NASM (y compatible), GNU as , FASM , MSVC inline asm (pero no MASM)
  • 0DEADBEEFh : NASM (y compatible), FASM, MASM , TASM.

Los ensambladores de DOS / Windows a menudo solo admiten la syntax ...h .
Los ensambladores portátiles generalmente admiten la syntax 0x... o ambas.

Tenga en cuenta el 0 inicial: las constantes numéricas siempre tienen que comenzar con un dígito para distinguirlas de los nombres de símbolos.

También tenga en cuenta que los ensambladores, como los comstackdores C, pueden evaluar expresiones en tiempo de ensamblaje, por lo que puede escribir foo & 0xF (si foo es una constante de ensamblador, definida con foo equ 0xABC o algo así). Incluso puede agregar / restar de tags (que son constantes de tiempo de enlace, no de tiempo de ensamblaje), por lo que cosas como mov eax, OFFSET label - 20 todavía se ensambla en un mov r32, imm32 .


De la sección del manual de NASM en constantes :

Algunos ejemplos (todos producen exactamente el mismo código):

  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 

La mayoría de los ensambladores también permiten literales de caracteres , como '0' para cero ASCII. O incluso '0123' para cuatro dígitos ASCII empaquetados en un entero de 32 bits. Algunas admiten secuencias de escape ( \n' ), algunas (como YASM) no. NASM solo admite secuencias de escape dentro de comillas inversas, no comillas dobles.


Otras plataformas:

ARM assembler : 0xDEADBEEF funciona.

Creo que 0x … es típico. el 0 … h es principalmente una cosa de DOS.

Los números hexadecimales generalmente siempre se representan con un 0x 0xFFFFFFBB , por lo que usaría 0xFFFFFFBB .

Depende de su ensamblador, pero una notación común para literales hexadecimales es 0FFFFFFBBh .

0FFFFFFFFh

Microsoft (R) Macro Assembler versión 6.14.8444

Copyright (C) Microsoft Corp 1981-1997. Todos los derechos reservados.

    Intereting Posts