Share via


Mensajes de diagnóstico del ensamblador de ARM

Los ensambladores ARM de Microsoft, armasm y armasm64, emiten advertencias de diagnóstico y errores cuando los encuentran. En este artículo se describen los mensajes más comunes.

Sintaxis

nombre de archivo(número de línea) : [error|advertencia] Unnúmero:mensaje

Mensajes de diagnóstico: errores

A2193: esta instrucción genera un comportamiento impredecible

La arquitectura de ARM no puede garantizar lo que sucede cuando se ejecuta esta instrucción. Para obtener más información sobre las formas bien definidas de esta instrucción, consulte el Manual de referencia de arquitectura de ARM.

    ADD r0, r8, pc         ; A2193: this instruction generates unpredictable behavior

A2196: la instrucción no se puede codificar en 16 bits

La instrucción especificada no se puede codificar como una instrucción Thumb de 16 bits. Especifique una instrucción de 32 bits o reorganice el código para incorporar la etiqueta de destino al intervalo de una instrucción de 16 bits.

El ensamblador puede intentar codificar una rama en 16 bits y producir este error, aunque se pueda codificar una rama de 32 bits. Puede resolver este problema mediante el especificador .W para marcar explícitamente la rama como de 32 bits.

    ADD.N r0, r1, r2      ; A2196: instruction can't be encoded in 16 bits

    B.W label             ; OK
    B.N label             ; A2196: instruction can't be encoded in 16 bits
    SPACE 10000
label

A2202: No se permite la sintaxis de instrucción anterior a UAL en la región THUMB

El código Thumb debe usar la sintaxis de Unified Assembler Language (UAL). La sintaxis anterior ya no se acepta.

    ADDEQS r0, r1         ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
    ADDSEQ r0, r1         ; OK

A2513: La rotación debe ser uniforme

En el modo ARM, hay una sintaxis alternativa para especificar constantes. En lugar de escribir #<const>, puede escribir #<byte>,#<rot>, que representa el valor constante que se obtiene al girar el valor <byte> a la derecha por <rot>. Al usar esta sintaxis, debe convertir el valor de <rot> par.

    MOV r0, #4, #2       ; OK
    MOV r0, #4, #1       ; A2513: Rotation must be even

A2557: Número de bytes que se van a reescribir incorrecto

En las instrucciones de carga y almacenamiento de la estructura NEON (VLDn, VSTn), hay una sintaxis alternativa para especificar la escritura diferida en el registro base. En lugar de colocar un signo de exclamación (!) después de la dirección, puede especificar un valor inmediato que indique el desplazamiento que se va a agregar al registro base. Si usa esta sintaxis, debe especificar el número exacto de bytes que esta instrucción cargó o almacenó.

    VLD1.8 {d0-d3}, [r0]!         ; OK
    VLD1.8 {d0-d3}, [r0], #32     ; OK
    VLD1.8 {d0-d3}, [r0], #100    ; A2557: Incorrect number of bytes to write back

Mensajes de diagnóstico: advertencias

A4228: El valor de alineación supera la alineación AREA; alineación no garantizada

La alineación especificada en una directiva ALIGN es mayor que la alineación de la directiva AREA envolvente. Como resultado, el ensamblador no puede garantizar que se respete la directiva ALIGN.

Para corregir esta advertencia, puede especificar en la directiva AREA un atributo ALIGN igual o mayor que la alineación deseada.

AREA |.myarea1|
ALIGN 8           ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed

AREA |.myarea2|,ALIGN=3
ALIGN 8           ; OK

A4508: El uso de esta constante rotada está en desuso

En el modo ARM, hay una sintaxis alternativa para especificar constantes. En lugar de escribir #<const>, puede escribir #<byte>,#<rot>, que representa el valor constante que se obtiene al girar el valor <byte> a la derecha por <rot>. En algunos contextos, ARM ha dejado de usar estas constantes rotadas. En estos casos, use la sintaxis #<const> básica en su lugar.

    ANDS r0, r0, #1                ; OK
    ANDS r0, r0, #4, #2            ; A4508: Use of this rotated constant is deprecated

A4509: Esta forma de instrucción condicional está en desuso

Esta forma de instrucción condicional ha quedado en desuso por ARM en la arquitectura ARMv8. Se recomienda cambiar el código para usar ramas condicionales. Para ver qué instrucciones condicionales siguen siendo compatibles, consulte el Manual de referencia de arquitectura de ARM.

Esta advertencia no se genera cuando se usa el modificador de línea de comandos -oldit.

    ADDEQ r0, r1, r8              ; A4509: This form of conditional instruction is deprecated

Consulte también

Referencia de la línea de comandos del ensamblador de ARM
Directivas del ensamblador de ARM