Tôi quan tâm, tại sao trình biên dịch vi điều khiển Cortex M3 (stm32f103) đôi khi tạo ra một lệnh NOP sau nhánh. Và tại sao đôi khi nó không.
Ví dụ:
0x08000496 2400 MOVS r4,#0x00
0x08000498 4625 MOV r5,r4
0x0800049A E006 B 0x080004AA
64: res=res+a[i];
65: }
0x0800049C F85A0034 LDR r0,[r10,r4,LSL #3] // No NOP after B
0x080004A0 EB100808 ADDS r8,r0,r8
0x080004A4 1C64 ADDS r4,r4,#1
0x080004A6 F1450500 ADC r5,r5,#0x00
0x080004AA 1BA0 SUBS r0,r4,r6
0x080004AC EB750007 SBCS r0,r5,r7
0x080004B0 DBF4 BLT 0x0800049C
66: int64_t avg=res/x;
0x080004B2 BF00 NOP // <------------------- NOP after BLT
69: int v=countbits1(5);
0x080004B4 2005 MOVS r0,#0x05
0x080004B6 F7FFFFA2 BL.W countbits1 (0x080003FE)
0x080004BA 9001 STR r0,[sp,#0x04] // No NOP after BL.W
72: unsigned int b=countLeadingZeros(5);
73:
0x080004BC 2005 MOVS r0,#0x05
Dự đoán ban đầu của tôi là hướng dẫn dài cần căn chỉnh từ nhưng BL.W sau khi NOP thực sự không có nó. Nếu NOP này có liên quan đến đường ống bằng cách nào đó hơn tại sao có các nhánh không có nop sau chúng?
Tôi bối rối.
CẬP NHẬT:
Hóa ra chi nhánh có thể không liên quan. Tôi đã cố gắng di chuyển khai báo biến cục bộ không sử dụng int64_t avg - và NOP di chuyển cùng với nó. Vì vậy, tôi tin rằng pjc50 bình luận là đúng và NOP này chỉ để cho trình gỡ lỗi đặt một điểm dừng trên dòng này.