Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在PIC24F汇编代码中实现循环_Assembly_Pic_Instruction Set_Pic24_Dspic - Fatal编程技术网

Assembly 如何在PIC24F汇编代码中实现循环

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(计数器

下面是以下C代码的反汇编:

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