Misalkan kita memiliki potongan kode C berikut untuk avr-8bit:
int v1=1;
int v2=2;
v2=v2+v1;
Saya mengharapkan pembongkaran berikut
ldi r18, 1;
ldi r19, 2;
add r19, r18;
tapi setelah saya berlari:
avr-gcc -mmcu=atmega2560 Test.c -o Test.elf
dan
avr-objdump -S Test.elf > Test.lss
Saya mendapatkan pembongkaran berikut
ldi r24, 0x01 ; 1
ldi r25, 0x00 ; 0
std Y+2, r25 ; 0x02
std Y+1, r24 ; 0x01
ldi r24, 0x02 ; 2
ldi r25, 0x00 ; 0
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
ldd r18, Y+3 ; 0x03
ldd r19, Y+4 ; 0x04
ldd r24, Y+1 ; 0x01
ldd r25, Y+2 ; 0x02
add r24, r18
adc r25, r19
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
Adakah yang bisa membantu saya memahami hasil disassembler?
Sunting: Menggunakan char majelis menjadi:
ldi r24, 0x01
std Y+1, r24
ldi r24, 0x02
std Y+2, r24
ldd r25, Y+2
ldd r24, Y+1
add r24, r25
std Y+2, r24
Kapan ada instruksi std?
-O3
dapat menghasilkan kode yang rusak? [rujukan?] (dan tidak, kode C yang memanggil Perilaku Tidak Terdefinisi dan kemudian istirahat dengan beberapa pengaturan optimasi tidak masuk hitungan)Ketika saya menemukan beberapa contoh kode, saya akan membuat komentar saya sebagai jawaban - yang lain sudah menjelaskan masalahnya.
Banyak kode tertanam yang saya gunakan dengan mendefinisikan tipe tambahan yang spesifik untuk ukurannya, seperti "uint8, uint16, uint32" untuk int unsigned, misalnya. Dengan begitu Anda selalu tahu persis variabel apa yang Anda hadapi. Khususnya tertanam, ditandatangani, mengambang, "int" kecil dari ukuran / penandatanganan yang tidak ditentukan, semuanya akan dikenakan biaya siklus CPU terbaik dan menyebabkan bug serius paling buruk.
Inilah #define kami saat ini:
sumber
Kode C Anda menggunakan variabel integer 16bit (int). Kompiler tidak dapat membaca pikiran Anda, sehingga kompilasi persis apa yang ada di file sumber. Jadi, jika Anda ingin variabel 8bit, Anda harus menggunakan tipe masing-masing.
Alhasil Anda tetap akan bisa menyimpan nilai-nilai di memori (meski lebih simpel). Saya tidak begitu baik dalam C, tetapi IMHO, ada beberapa opsi untuk menetapkan variabel ke beberapa register, jika Anda ingin beberapa variabel berada di register bukan RAM. Sesuatu seperti:
Perhatikan bahwa tidak semua register tersedia untuk trik semacam itu.
Jadi kesimpulannya? Tuliskan program Anda dalam pertemuan. Mereka akan selalu lebih kecil, lebih cepat dan mudah dibaca / didukung.
sumber