请教:在winavr中编译MEGA8时、看反汇编的代码时发现有很多地方用了CLI
请教:在winavr中编译MEGA8时、看反汇编的代码时发现有很多地方用了CLI();是因为要操作16bit的数、但是后面也没有看到有SEI();的代码、那不是要玩完!(关了中断不打开) 有这回事?是不是你眼花啊? 不太可能、我也一直纳闷,但是在反汇编代码中我都找不到SEI()的代码啊! 发LSS文件上来看看? @00000232: wt_disp+00000232: 92EF PUSH R14 Push register on stack
+00000233: 92FF PUSH R15 Push register on stack
+00000234: 931F PUSH R17 Push register on stack
+00000235: 93CF PUSH R28 Push register on stack
+00000236: 93DF PUSH R29 Push register on stack
+00000237: B7CD IN R28,0x3D In from I/O location
+00000238: B7DE IN R29,0x3E In from I/O location
+00000239: 9727 SBIW R28,0x07 Subtract immediate from word
+0000023A: B60F IN R0,0x3F In from I/O location
+0000023B: 94F8 CLI Global Interrupt Disable
+0000023C: BFDE OUT 0x3E,R29 Out to I/O location
+0000023D: BE0F OUT 0x3F,R0 Out to I/O location
+0000023E: BFCD OUT 0x3D,R28 Out to I/O location
263: uint8_t tmp={0};//临时存放查表得来的数据
+0000023F: 01AE MOVW R20,R28 Copy register pair
+00000240: 5F4F SUBI R20,0xFF Subtract immediate
+00000241: 4F5F SBCI R21,0xFF Subtract immediate with carry
+00000242: E097 LDI R25,0x07 Load immediate
+00000243: 01FA MOVW R30,R20 Copy register pair
+00000244: 9211 ST Z+,R1 Store indirect and postincrement
+00000245: 959A DEC R25 Decrement
+00000246: F7E9 BRNE PC-0x02 Branch if not equal
265: ps=(uint8_t*)pgm_read_word(&disp_TAB);//指向显示的内容地址FLASH区
+00000247: 2799 CLR R25 Clear Register
+00000248: 01FC MOVW R30,R24 Copy register pair
+00000249: 0FE8 ADD R30,R24 Add without carry
+0000024A: 1FF9 ADC R31,R25 Add with carry
+0000024B: 5CEC SUBI R30,0xCC Subtract immediate
+0000024C: 4FFF SBCI R31,0xFF Subtract immediate with carry
+0000024D: 91A5 LPM R26,Z+ Load program memory and postincrement
+0000024E: 91B4 LPM R27,Z Load program memory
266: len=pgm_read_byte(&disp1_TAB[(dispid-1)*4]);//获得显示内容的数据长度
+0000024F: 0F88 LSL R24 Logical Shift Left
+00000250: 1F99 ROL R25 Rotate Left Through Carry
+00000251: 0F88 LSL R24 Logical Shift Left
+00000252: 1F99 ROL R25 Rotate Left Through Carry
+00000253: 01FC MOVW R30,R24 Copy register pair
+00000254: 5DEA SUBI R30,0xDA Subtract immediate
+00000255: 4FFF SBCI R31,0xFF Subtract immediate with carry
+00000256: 9134 LPM R19,Z Load program memory
267: tmp=pgm_read_byte(&disp1_TAB[(dispid-1)*4+1]);//获得显示序号
+00000257: 01FC MOVW R30,R24 Copy register pair
+00000258: 5DE9 SUBI R30,0xD9 Subtract immediate
+00000259: 4FFF SBCI R31,0xFF Subtract immediate with carry
+0000025A: 9124 LPM R18,Z Load program memory
+0000025B: 832D STD Y+5,R18 Store indirect with displacement
268: tmp=pgm_read_byte(&disp1_TAB[(dispid-1)*4+3]);//获得显示的符号
+0000025C: 01FC MOVW R30,R24 Copy register pair
+0000025D: 5DE7 SUBI R30,0xD7 Subtract immediate
+0000025E: 4FFF SBCI R31,0xFF Subtract immediate with carry
+0000025F: 9124 LPM R18,Z Load program memory
+00000260: 832E STD Y+6,R18 Store indirect with displacement
269: tmp=pgm_read_byte(&disp1_TAB[(dispid-1)*4+2]);//获得显示的小数点
+00000261: 01FC MOVW R30,R24 Copy register pair
+00000262: 5DE8 SUBI R30,0xD8 Subtract immediate
+00000263: 4FFF SBCI R31,0xFF Subtract immediate with carry
+00000264: 9184 LPM R24,Z Load program memory
+00000265: 838F STD Y+7,R24 Store indirect with displacement
270: for(i=0;i<len;i++)//最大的显示数据长度不超过4个字节
+00000266: E020 LDI R18,0x00 Load immediate
+00000267: 1723 CP R18,R19 Compare
+00000268: F430 BRCC PC+0x07 Branch if carry cleared
+00000269: 01FA MOVW R30,R20 Copy register pair
272: tmp = *(ps++);//在地址中取数
+0000026A: 918D LD R24,X+ Load indirect and postincrement
+0000026B: 9381 ST Z+,R24 Store indirect and postincrement
270: for(i=0;i<len;i++)//最大的显示数据长度不超过4个字节
+0000026C: 5F2F SUBI R18,0xFF Subtract immediate
+0000026D: 1723 CP R18,R19 Compare
+0000026E: F3D8 BRCS PC-0x04 Branch if carry set
275: ps = lcdram_g;//指向显示缓存
+0000026F: E6A3 LDI R26,0x63 Load immediate
+00000270: E0B0 LDI R27,0x00 Load immediate
276: for(i=0;i<5;i++)
+00000271: E020 LDI R18,0x00 Load immediate
+00000272: 01AE MOVW R20,R28 Copy register pair
+00000273: 5F4F SUBI R20,0xFF Subtract immediate
+00000274: 4F5F SBCI R21,0xFF Subtract immediate with carry
278: if(i==4)//序号显示
+00000275: 3024 CPI R18,0x04 Compare with immediate
+00000276: F409 BRNE PC+0x02 Branch if not equal
280: ps= ps-2;//序号显示时要退2个地址(LCD只显示7位数)
+00000277: 9712 SBIW R26,0x02 Subtract immediate from word
282: a = tmp;
+00000278: 01FA MOVW R30,R20 Copy register pair
+00000279: 9131 LD R19,Z+ Load indirect and postincrement
+0000027A: 01AF MOVW R20,R30 Copy register pair
283: b = a;
+0000027B: 2F93 MOV R25,R19 Copy register
284: a &= 0x0f;
+0000027C: 703F ANDI R19,0x0F Logical AND with immediate
285: b = ((b>>4)&0x0f);
+0000027D: 9592 SWAP R25 Swap nibbles
+0000027E: 709F ANDI R25,0x0F Logical AND with immediate
286: a = pgm_read_byte(&digits);
+0000027F: 2FE3 MOV R30,R19 Copy register
+00000280: 27FF CLR R31 Clear Register
+00000281: 5CE4 SUBI R30,0xC4 Subtract immediate
+00000282: 4FFF SBCI R31,0xFF Subtract immediate with carry
+00000283: 9134 LPM R19,Z Load program memory
+00000284: 2F83 MOV R24,R19 Copy register
288: a &= 0x0f;
+00000285: 703F ANDI R19,0x0F Logical AND with immediate
289: c = ((c>>4) & 0x0f);
+00000286: 9582 SWAP R24 Swap nibbles
+00000287: 708F ANDI R24,0x0F Logical AND with immediate
290: *(ps++) = a;
+00000288: 933D ST X+,R19 Store indirect and postincrement
291: *(ps++) = c;
+00000289: 938D ST X+,R24 Store indirect and postincrement
292: b = pgm_read_byte(&digits);
+0000028A: 2FE9 MOV R30,R25 Copy register
+0000028B: 27FF CLR R31 Clear Register
+0000028C: 5CE4 SUBI R30,0xC4 Subtract immediate
+0000028D: 4FFF SBCI R31,0xFF Subtract immediate with carry
+0000028E: 9194 LPM R25,Z Load program memory
+0000028F: 2F89 MOV R24,R25 Copy register
294: b &= 0x0f;
+00000290: 709F ANDI R25,0x0F Logical AND with immediate
295: c = ((c>>4) & 0x0f);
+00000291: 9582 SWAP R24 Swap nibbles
+00000292: 708F ANDI R24,0x0F Logical AND with immediate
296: *(ps++) = b;
+00000293: 939D ST X+,R25 Store indirect and postincrement
297: *(ps++) = c;
+00000294: 938D ST X+,R24 Store indirect and postincrement
276: for(i=0;i<5;i++)
+00000295: 5F2F SUBI R18,0xFF Subtract immediate
+00000296: 3025 CPI R18,0x05 Compare with immediate
+00000297: F2E8 BRCS PC-0x22 Branch if carry set
299: a =b = tmp;//获得符号的LCD段码
+00000298: 813E LDD R19,Y+6 Load indirect with displacement
300: *(ps++) = a&0x0f;
+00000299: 2F83 MOV R24,R19 Copy register
+0000029A: 708F ANDI R24,0x0F Logical AND with immediate
+0000029B: 938D ST X+,R24 Store indirect and postincrement
301: *(ps++) = ((b>>4)&0x0f);
+0000029C: 9532 SWAP R19 Swap nibbles
+0000029D: 703F ANDI R19,0x0F Logical AND with immediate
+0000029E: 933D ST X+,R19 Store indirect and postincrement
302: *(ps++) = 0x00;//LCD显示缓存最后一个字节没有用
+0000029F: 921C ST X,R1 Store indirect
305: a = tmp;
+000002A0: 813F LDD R19,Y+7 Load indirect with displacement
+000002A1: E025 LDI R18,0x05 Load immediate
+000002A2: E6A3 LDI R26,0x63 Load immediate
+000002A3: E0B0 LDI R27,0x00 Load immediate
309: if(a & 0x01)
+000002A4: FF30 SBRS R19,0 Skip if bit in register set
+000002A5: C003 RJMP PC+0x0004 Relative jump
311: *(ps+i*2) |= 0x01;//小数点的位置在LCD字符集最低位
+000002A6: 918C LD R24,X Load indirect
+000002A7: 6081 ORI R24,0x01 Logical OR with immediate
+000002A8: 938C ST X,R24 Store indirect
313: a >>= 1;
+000002A9: 9536 LSR R19 Logical shift right
307: for(i=0;i<6;i++)
+000002AA: 5021 SUBI R18,0x01 Subtract immediate
+000002AB: 9612 ADIW R26,0x02 Add immediate to word
+000002AC: FF27 SBRS R18,7 Skip if bit in register set
+000002AD: CFF6 RJMP PC-0x0009 Relative jump
259: {
+000002AE: E693 LDI R25,0x63 Load immediate
+000002AF: 2EE9 MOV R14,R25 Copy register
+000002B0: E090 LDI R25,0x00 Load immediate
+000002B1: 2EF9 MOV R15,R25 Copy register
259: {
+000002B2: E010 LDI R17,0x00 Load immediate
259: {
+000002B3: 01F7 MOVW R30,R14 Copy register pair
+000002B4: 9181 LD R24,Z+ Load indirect and postincrement
+000002B5: 017F MOVW R14,R30 Copy register pair
+000002B6: 2F68 MOV R22,R24 Copy register
+000002B7: 2F81 MOV R24,R17 Copy register
+000002B8: DF06 RCALL PC-0x00F9 Relative call subroutine
259: {
+000002B9: 5F1F SUBI R17,0xFF Subtract immediate
+000002BA: 3115 CPI R17,0x15 Compare with immediate
+000002BB: F3B8 BRCS PC-0x08 Branch if carry set
+000002BC: 9627 ADIW R28,0x07 Add immediate to word
+000002BD: B60F IN R0,0x3F In from I/O location
+000002BE: 94F8 CLI Global Interrupt Disable
+000002BF: BFDE OUT 0x3E,R29 Out to I/O location
+000002C0: BE0F OUT 0x3F,R0 Out to I/O location
+000002C1: BFCD OUT 0x3D,R28 Out to I/O location
+000002C2: 91DF POP R29 Pop register from stack
+000002C3: 91CF POP R28 Pop register from stack
+000002C4: 911F POP R17 Pop register from stack
+000002C5: 90FF POP R15 Pop register from stack
+000002C6: 90EF POP R14 Pop register from stack
+000002C7: 9508 RET Subroutine return 你搞什么鬼啊?没任何问题。
IN R0,0x3F In from I/O location保存SREG
OUT0x3F,R0 Out to I/O location 恢复原来的SREG,很正常。
胡乱SEI()反而会出错。 不好意思!看错了,不太习惯看地址,晚上回去看到了这个东东! 想要学习 。。。mark 嘿嘿,编译器-般不会错的
页:
[1]