Share via


Pesan diagnostik Perakitan ARM

Perakitan Microsoft ARM, armasm, dan armasm64, memancarkan peringatan dan kesalahan diagnostik ketika mereka menemukannya. Artikel ini menjelaskan pesan yang paling umum ditemui.

Sintaks

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

Pesan diagnostik - Kesalahan

A2193: instruksi ini menghasilkan perilaku yang tidak dapat diprediksi

Arsitektur ARM tidak dapat menjamin apa yang terjadi ketika instruksi ini dijalankan. Untuk detail tentang bentuk instruksi ini yang terdefinisi dengan baik, lihat Panduan Referensi Arsitektur ARM.

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

A2196: instruksi tidak dapat dikodekan dalam 16 bit

Instruksi yang ditentukan tidak dapat dikodekan sebagai instruksi Thumb 16-bit. Tentukan instruksi 32-bit, atau susun ulang kode untuk membawa label target ke dalam rentang instruksi 16-bit.

Perakit dapat mencoba mengodekan cabang dalam 16 bit dan gagal dengan kesalahan ini, meskipun cabang 32-bit dapat dikodekan. Anda dapat menyelesaikan masalah ini dengan menggunakan penentu .W untuk secara eksplisit menandai cabang sebagai 32-bit.

    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: Sintaks instruksi pra-UAL tidak diizinkan di wilayah THUMB

Kode jempol harus menggunakan sintaks Unified Assembler Language (UAL). Sintaks lama tidak lagi diterima

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

A2513: Rotasi harus genap

Dalam mode ARM, ada sintaks alternatif untuk menentukan konstanta. Alih-alih menulis #<const>, Anda dapat menulis #<byte>,#<rot>, yang mewakili nilai konstanta yang diperoleh dengan memutar nilai <byte> tepat dengan <rot>. Saat Anda menggunakan sintaks ini, Anda harus membuat nilainya merata <rot> .

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

A2557: Jumlah byte yang salah untuk ditulis kembali

Pada struktur NEON memuat dan menyimpan instruksi (VLDn, VSTn), ada sintaks alternatif untuk menentukan tulis balik ke register dasar. Alih-alih meletakkan tanda seru (!) setelah alamat, Anda dapat menentukan nilai langsung yang menunjukkan offset yang akan ditambahkan ke register dasar. Jika Anda menggunakan sintaks ini, Anda harus menentukan jumlah byte yang tepat yang dimuat atau disimpan oleh instruksi.

    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

Pesan diagnostik - Peringatan

A4228: Nilai perataan melebihi perataan AREA; perataan tidak dijamin

Perataan yang ditentukan dalam direktif ALIGN lebih besar dari perataan AREApenutup . Akibatnya, perakitan tidak dapat menjamin bahwa arahan ALIGN akan dihormati.

Untuk memperbaiki peringatan ini, Anda dapat menentukan pada AREA direktif ALIGN atribut yang sama dengan atau lebih besar dari perataan yang diinginkan.

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

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

A4508: Penggunaan konstanta yang diputar ini tidak digunakan lagi

Dalam mode ARM, ada sintaks alternatif untuk menentukan konstanta. Alih-alih menulis #<const>, Anda dapat menulis #<byte>,#<rot>, yang mewakili nilai konstanta yang diperoleh dengan memutar nilai <byte> tepat dengan <rot>. Dalam beberapa konteks, ARM telah menghentikan penggunaan konstanta yang diputar ini. Dalam kasus ini, gunakan sintaks dasar #<const> sebagai gantinya.

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

A4509: Bentuk instruksi bersyukur ini tidak digunakan lagi

Bentuk instruksi kondisi ini telah ditolak oleh ARM dalam arsitektur ARMv8. Kami menyarankan agar Anda mengubah kode untuk menggunakan cabang bersyarah. Untuk melihat instruksi bersyarat mana yang masih didukung, lihat Panduan Referensi Arsitektur ARM.

Peringatan ini tidak dipancarkan saat sakelar -oldit baris perintah digunakan.

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

Baca juga

Referensi Baris Perintah Perakitan ARM
Arahan Perakitan ARM