다음을 통해 공유


ARM 어셈블러 진단 메시지

Microsoft ARM 어셈블러, armasmarmasm64는 진단 경고 및 오류가 발생할 때 내보낸다. 이 문서에서는 가장 일반적으로 발생하는 메시지에 대해 설명합니다.

구문

filename(line-number) : [error|warning] Anumber:message

진단 메시지 - 오류

A2193: 이 명령은 예측할 수 없는 동작을 생성합니다.

ARM 아키텍처는 이 명령이 실행될 때 발생하는 작업을 보장할 수 없습니다. 이 명령의 잘 정의된 형식에 대한 자세한 내용은 ARM 아키텍처 참조 설명서를 참조 하세요.

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

A2196: 명령을 16비트로 인코딩할 수 없습니다.

지정된 명령은 16비트 Thumb 명령으로 인코딩할 수 없습니다. 32비트 명령을 지정하거나 코드를 다시 정렬하여 대상 레이블을 16비트 명령 범위로 가져옵니다.

어셈블러는 32비트 분기를 인코딩할 수 있더라도 16비트에서 분기를 인코딩하려고 시도하고 이 오류로 실패할 수 있습니다. 지정자를 사용하여 분기를 .W 32비트로 명시적으로 표시하여 이 문제를 해결할 수 있습니다.

    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: THUMB 지역에서는 UAL 이전 명령 구문이 허용되지 않습니다.

Thumb 코드는 UAL(통합 어셈블러 언어) 구문을 사용해야 합니다. 이전 구문은 더 이상 허용되지 않습니다.

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

A2513: 회전은 짝수여야 합니다.

ARM 모드에서는 상수를 지정하는 대체 구문이 있습니다. 작성하는 #<const>대신 값을 오른쪽으로 <rot>회전하여 얻은 상수 값을 나타내는 쓰기#<byte>,#<rot><byte> 할 수 있습니다. 이 구문을 사용하는 경우 짝수 값을 <rot> 만들어야 합니다.

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

A2557: 쓰기 저장에 잘못된 바이트 수

NEON 구조 로드 및 저장 지침(VLDn, VSTn)에는 기본 레지스터에 쓰기 저장을 지정하는 대체 구문이 있습니다. 주소 다음에 느낌표(!)를 배치하는 대신 기본 레지스터에 추가할 오프셋을 나타내는 즉시 값을 지정할 수 있습니다. 이 구문을 사용하는 경우 명령에 의해 로드되거나 저장된 정확한 바이트 수를 지정해야 합니다.

    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

진단 메시지 - 경고

A4228: 맞춤 값이 AREA 맞춤을 초과합니다. 맞춤이 보장되지 않음

지시문에 ALIGN 지정된 맞춤이 바깥쪽 맞춤보다 큽합니다 AREA. 따라서 어셈블러는 지시문이 ALIGN 적용되도록 보장할 수 없습니다.

이 경고를 해결하려면 지시문 ALIGNAREA 원하는 맞춤보다 크거나 같은 특성을 지정할 수 있습니다.

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

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

A4508: 회전된 이 상수의 사용은 더 이상 사용되지 않습니다.

ARM 모드에서는 상수를 지정하는 대체 구문이 있습니다. 작성하는 #<const>대신 값을 오른쪽으로 <rot>회전하여 얻은 상수 값을 나타내는 쓰기#<byte>,#<rot><byte> 할 수 있습니다. 일부 컨텍스트에서 ARM은 이러한 회전된 상수의 사용을 더 이상 사용하지 않습니다. 이러한 경우 기본 #<const> 구문을 대신 사용합니다.

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

A4509: 이 형태의 조건부 명령은 더 이상 사용되지 않습니다.

이러한 형태의 조건부 명령은 ARMv8 아키텍처에서 ARM에서 더 이상 사용되지 않습니다. 조건부 분기를 사용하도록 코드를 변경하는 것이 좋습니다. 여전히 지원되는 조건부 지침을 확인하려면 ARM 아키텍처 참조 설명서를 참조 하세요.

명령줄 스위치를 -oldit 사용할 때는 이 경고가 내보내지지 않습니다.

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

참고 항목

ARM 어셈블러 명령줄 참조
ARM 어셈블리 지시문