ARM 어셈블러 진단 메시지
Microsoft ARM 어셈블러, armasm 및 armasm64는 진단 경고 및 오류가 발생할 때 내보낸다. 이 문서에서는 가장 일반적으로 발생하는 메시지에 대해 설명합니다.
구문
filename (line-number) : [error|warning] A number : 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
적용되도록 보장할 수 없습니다.
이 경고를 해결하려면 지시문 ALIGN
에 AREA
원하는 맞춤보다 크거나 같은 특성을 지정할 수 있습니다.
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