lo-lo25 发表于 2006-3-30 16:50:31

请教:在winavr中编译MEGA8时、看反汇编的代码时发现有很多地方用了CLI

请教:在winavr中编译MEGA8时、看反汇编的代码时发现有很多地方用了CLI();是因为要操作16bit的数、但是后面也没有看到有SEI();的代码、那不是要玩完!(关了中断不打开)

HJJourAVR 发表于 2006-3-30 16:58:35

有这回事?是不是你眼花啊?

lo-lo25 发表于 2006-3-30 17:10:57

不太可能、我也一直纳闷,但是在反汇编代码中我都找不到SEI()的代码啊!

HJJourAVR 发表于 2006-3-30 17:14:48

发LSS文件上来看看?

lo-lo25 发表于 2006-3-30 17:37:13

@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

HJJourAVR 发表于 2006-3-30 17:47:35

你搞什么鬼啊?没任何问题。

IN   R0,0x3F   In from I/O location保存SREG

OUT0x3F,R0   Out to I/O location   恢复原来的SREG,很正常。

胡乱SEI()反而会出错。

lo-lo25 发表于 2006-3-31 08:32:32

不好意思!看错了,不太习惯看地址,晚上回去看到了这个东东!

dezhga 发表于 2014-9-29 17:01:48

想要学习 。。。mark

avr9299 发表于 2014-10-15 20:01:42

嘿嘿,编译器-般不会错的
页: [1]
查看完整版本: 请教:在winavr中编译MEGA8时、看反汇编的代码时发现有很多地方用了CLI