【问题标题】:Assembly code for a switch statement using AVR-GCC使用 AVR-GCC 的 switch 语句的汇编代码
【发布时间】:2013-01-14 23:39:02
【问题描述】:

嘿,我无法理解编译器为以下 switch statemet 省略的汇编代码。它与我从使用 gcc 等时看到的通常的汇编代码不同。

switch(instr) { 
case OP_NOP: 
    break;

case OP_BIPUSH: 
    stack_push(arg0.z.bh); pc_inc = 2; break;
} 

上述C代码的汇编代码:

switch(instr){ 
+00001482: 8529 LDD R18,Y+9 Load indirect with displacement 
+00001483: 2F82 MOV R24,R18 Copy register 
+00001484: E090 LDI R25,0x00 Load immediate 
+00001485: 01FC MOVW R30,R24 Copy register pair 
+00001486: 9732 SBIW R30,0x02 Subtract immediate from word 
+00001487: 3BED CPI R30,0xBD Compare with immediate 
+00001488: 05F1 CPC R31,R1 Compare with carry 
+00001489: F008 BRCS PC+0x02 Branch if carry set 
+0000148A: C39D RJMP PC+0x039E Relative jump 
+0000148B: 57E0 SUBI R30,0x70 Subtract immediate 
+0000148C: 4FFF SBCI R31,0xFF Subtract immediate with carry 
+0000148D: 0FEE LSL R30 Logical Shift Left 
+0000148E: 1FFF ROL R31 Rotate Left Through Carry 
+0000148F: 9005 LPM R0,Z+ Load program memory and postincrement 
+00001490: 91F4 LPM R31,Z Load program memory 
+00001491: 2DE0 MOV R30,R0 Copy register 
+00001492: 9409 IJMP Indirect jump to (Z) 
2003: stack_push(arg0.z.bh); pc_inc = 2; 
+00001493: 2D85 MOV R24,R5 Copy register 
+00001494: 2799 CLR R25 Clear Register 
+00001495: FD87 SBRC R24,7 Skip if bit in register cleared 
+00001496: 9590 LAT R25 Load and Toggle 
+00001497: C338 RJMP PC+0x0339 Relative jump 

我假设代码以防万一:NOP 正在被编译器优化掉。

但我只是了解代码如何为案例设置查找表?

任何帮助都会很棒,谢谢。

【问题讨论】:

    标签: assembly switch-statement avr avr-gcc


    【解决方案1】:

    在您的示例中只检查一种情况,因此它只检查instr 是否等于OP_BIPUSH。如果是,则继续执行其余操作,否则从函数调用返回。

    在调用开始时,Y 寄存器(实际上是两个通用寄存器,我忘记了)指向栈顶。参数instr 位于堆栈中的 9 个位置,并被加载到 r24 中。 r25 为 0,因此该对包含 instr 的值。

    我们只需要针对一件事进行测试,因此减去 2 并与 0xBD 进行比较。 (r1 是零寄存器。它总是包含 0。)

    如果结果相等,则跳过下一条指令并继续执行其余指令。如果它们不相等,则执行下一条指令,该指令从函数调用中返回并跳转。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2021-10-01
      相关资源
      最近更新 更多