ercircle 发表于 2026-1-24 17:47:25

keil C251编译又现BUG_20260124

REMOVEUNUSED, NOOVERLAY 皆失效
编译器把代码都干没了!


sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P2 = 0xa0;
bit f;

voidmain(void){
      P2M0 = 0xff;
      P2M1 = 0x00;
      P2 = 0x0F;
      while(1){
                P2 = ~P2;
      }
      while(1){
                if(f){
                }
      }
}
案例2:


总结:
不要保留不可达的代码段,以防编译器心情不好给你全删了。



jwd 发表于 2026-1-24 19:41:00

还有这操作啊

ercircle 发表于 2026-1-24 20:59:48

jwd 发表于 2026-1-24 19:41
还有这操作啊

点个灯差点道心干碎了{:tuosai:}

C_wolf 发表于 2026-1-24 21:47:15

ercircle 发表于 2026-1-24 20:59
点个灯差点道心干碎了

施主道心破碎修为尽失,不如渡入佛门参禅礼佛,日后定能功德大成。{:huaixiao:}

21cnsound 发表于 2026-1-25 18:39:28

命令行将C转成ASM是正常的:


$NOMACRO
$MODSRC
$MODEL(1)
$CASE

;
; 'main.SRC' generated from 'main.c'
; COMPILER INVOKED BY:
;      D:\C251_V560\C251.EXE main.c SRC
;
                NAME main

      EXTRN         CODE : NEAR (?C?STARTUP)

            ?PR?MAIN?MAINSEGMENTCODE
               ?BI?MAINSEGMENTBIT

      RSEG       ?BI?MAIN
               f:DBIT1


;--- special function registers and bits:
            P2DATA0A0H
            P2M1DATA095H
            P2M0DATA096H
             ACCDATA0E0H
             PSWDATA0D0H
             DPLDATA082H
             DPHDATA083H
               BDATA0F0H
            SPDATA081H
            PSW1DATA0D1H
               ZBIT   0D1H.1
            EABIT   0A8H.7
            OVBIT   0D0H.2
               PBIT   0D0H.0
            F0BIT   0D0H.5
             RS1BIT   0D0H.4
             RS0BIT   0D0H.3
            ACBIT   0D0H.6
;--- end of special function registers and bits.

      PUBLIC      main
      PUBLIC      f

; line 1: sfr P2M1 = 0x95;
; line 2: sfr P2M0 = 0x96;
; line 3: sfr P2 = 0xa0;
; line 4: bit f;
; line 5:
; line 6: voidmain(void){

      RSEG       ?PR?MAIN?MAIN
      main PROC
; line 7:         P2M0 = 0xff;
      MOV      P2M0,#0FFH
; line 8:         P2M1 = 0x00;
      MOV      P2M1,#00H
; line 9:         P2 = 0x0F;
      MOV      P2,#0FH
; line 10:         while(1){
; line 11:               P2 = ~P2;
      XRL      P2,#0FFH
; line 12:         }
      SJMP   ?C0003
; line 13:         while(1){
; line 14:               if(f){
; line 15:               }
; line 16:         }
; line 17: }

      END

21cnsound 发表于 2026-1-25 18:57:45

试了Keil C51默认的8级优化是没有问题的

ercircle 发表于 2026-1-25 19:25:46

21cnsound 发表于 2026-1-25 18:39
命令行将C转成ASM是正常的:




说起ASM,周末有位老哥发现 LX51,将大于31中断函数代码放入开启了汇编的C文件中不会报错

这样LX51既可以用REMOVEUNUSED又可以用大中断号。

21cnsound 发表于 2026-1-26 08:27:41

ercircle 发表于 2026-1-25 19:25
说起ASM,周末有位老哥发现 LX51,将大于31中断函数代码放入开启了汇编的C文件中不会报错

这样LX51既可以 ...

开启了汇编的C文件中,是在c中嵌入汇编代码还是?

ercircle 发表于 2026-1-26 08:57:42

21cnsound 发表于 2026-1-26 08:27
开启了汇编的C文件中,是在c中嵌入汇编代码还是?

只需要打开这两


21cnsound 发表于 2026-1-26 09:53:30

ercircle 发表于 2026-1-26 08:57
只需要打开这两

这两个勾选了,应该就是C转SRC/ASM,然后再对SRC/ASM汇编。
页: [1]
查看完整版本: keil C251编译又现BUG_20260124