Assembly 如何在PIC24F汇编代码中实现循环
下面是以下C代码的反汇编:Assembly 如何在PIC24F汇编代码中实现循环,assembly,pic,instruction-set,pic24,dspic,Assembly,Pic,Instruction Set,Pic24,Dspic,下面是以下C代码的反汇编: 268: while (Counter < 250) 269: { 270: Counter++; 271: } 268:while(计数器
268: while (Counter < 250)
269: {
270: Counter++;
271: }
268:while(计数器<250)
269: {
270:计数器++;
271: }
拆卸:
268: while (Counter < 250)
001B08 370003 BRA 0x1B10
001B10 90406E MOV.B [W14+6], W0
001B12 404FE7 ADD.B W0, #0x7, [W15]
001B14 36FFFA BRA LEU, 0x1B0A
269: {
270: Counter++;
001B0A 90406E MOV.B [W14+6], W0
001B0C E84000 INC.B W0, W0
001B0E 984760 MOV.B W0, [W14+6]
271: }
272:
273: // call foo
274: foo(LAT, 4, Set, &Code);
001B16 203F20 MOV #0x3F2, W0
001B18 40000E ADD W0, W14, W0
001B1A 780180 MOV W0, W3
001B1C B3C012 MOV.B #0x1, W2
001B1E B3C041 MOV.B #0x4, W1
001B20 202C40 MOV #0x2C4, W0
001B22 0709C7 RCALL foo
268:while(计数器<250)
001B08 370003胸罩0x1B10
001B10 90406E移动B[W14+6],W0
001B12 404FE7 ADD.B W0,#0x7[W15]
001B14 36FFFA BRA LEU,0x1B0A
269: {
270:计数器++;
001B0A 90406E移动B[W14+6],W0
001B0C E84000公司B W0,W0
001B0E 984760 MOV.B W0,[W14+6]
271: }
272:
273://呼叫foo
274:foo(LAT、4、Set和Code);
001B16 203F20 MOV#0x3F2,W0
001B18 40000E添加W0、W14、W0
001B1A 780180 MOV W0,W3
001B1C B3C012运动B#0x1,W2
001B1E B3C041运动B#0x4,W1
001B20 202C40 MOV#0x2C4,W0
001B22 0709C7 RCALL foo
无法理解while循环是如何实现的。
假设[W14+6]指存储计数器的位置RAM
注意:为PIC24FV32KA304生成的代码已将代码的顺序更改为:
GOTO A
B: Counter++;
A: if (Counter <= 249) GOTO B
转到A
B:计数器++;
A:如果(计数器我猜在271:}
下面可能还有一些asm行跳回循环。显然没有。无论如何,更新了问题,在271下面添加行。嗯,编译器可能正在优化计数?如果代码只是循环,或者如果编译时没有任何优化,你会得到什么?在哪里行:001BA、001BC和001BE吗?@msbit At 0x01B08指令将分支到0x1B10。0x1B10不是0x01B08之后的下一个地址;001B0A在0x01B08之后。在0x1B10,将进行检查(如果计数器<250),如果为true,则再次分支到0x01B0A。随后再次执行0x1B10,循环继续。
001B08 370003 BRA 0x1B10 // GOTO A
B: Counter++;
001B0A 90406E MOV.B [W14+6], W0 // Copy Counter to W0
001B0C E84000 INC.B W0, W0 // Increment W0
001B0E 984760 MOV.B W0, [W14+6] // Put W0 back in Counter
A: if (Counter <= 249) GOTO B
001B10 90406E MOV.B [W14+6], W0 // Get counter to W0
001B12 404FE7 ADD.B W0, #0x7, [W15] // Add 7 in modulo 256.
// This is the same as subtracting 249
001B14 36FFFA BRA LEU, 0x1B0A // if result <= 0 GOTO B
// else just drop through to code below