CX51 用户手册----INTPROMOTE 伪指令

本文介绍了CX51编译器中的INTPROMOTE伪指令,该指令影响编译器如何处理小整数类型。内容包括INTPROMOTE的作用、使用场景及相关知识库文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:

1、本翻译仅供个人学习使用,本人没有提供技术支持的义务,也不承担由此引发的任何后果。

2、请勿用于商业用途。

3、英文来自:http://www.keil.com/support/man/docs/c51/。

4、欢迎大家共同与我交流探讨(290207203@qq.com)。

INTPROMOTE Compiler Directive

Abbreviation

IP

Arguments

None.

Default

INTPROMOTE

µVision

Options — C51 — Enable ANSI integer promotion rules.

Description

The INTPROMOTE directive enables ANSI integer promotion rules. Expressions used in if statements are promoted from smaller types to integer expressions before comparison. This allows Microsoft C and Borland C programs to be ported to the C51 Compiler with fewer modifications.

Since the 8051 is an 8-bit processor use of the INTPROMOTE directive may generate less efficient code in some applications.

See Also

ENUMINTNOINTPROMOTE

Example
C51 SAMPLE.C INTPROMOTE
#pragma intpromote
C51 SAMPLE.C NOINTPROMOTE

The following example:

stmt lvl  source
1        char c;
2        unsigned char  c1,c2;
3        int  i;
4
5        main ()  {
6  1       if (c == 0xff) c = 0;    /* never true! */
7  1       if (c == -1) c = 1;      /* works */
8  1       i = c + 5;
9  1       if (c1 < c2 +4) c1 = 0;
10 1     }

demonstrates code generated using both the INTPROMOTE and NOINTPROMOTE control directives.

Code Generated
with INTPROMOTE
        ; FUNCTION main (BEGIN)
                ; SOURCE LINE # 6
0000 AF00         MOV  R7,c
0002 EF           MOV  A,R7
0003 33           RLC  A
0004 95E0         SUBB A,ACC
0006 FE           MOV  R6,A
0007 EF           MOV  A,R7
0008 F4           CPL  A
0009 4E           ORL  A,R6
000A 7002         JNZ  ?C0001
000C F500         MOV  c,A
000E         ?C0001:

                ; SOURCE LINE # 7
000E E500         MOV  A,c
0010 B4FF03       CJNE A,#0FFH,?C0002
0013 750001       MOV  c,#01H
0016         ?C0002:

                ; SOURCE LINE # 8
0016 AF00         MOV  R7,c
0018 EF           MOV  A,R7
0019 33           RLC  A
001A 95E0         SUBB A,ACC
001C FE           MOV  R6,A
001D EF           MOV  A,R7
001E 2405         ADD  A,#05H
0020 F500         MOV  i+01H,A
0022 E4           CLR  A
0023 3E           ADDC A,R6
0024 F500         MOV  i,A

                ; SOURCE LINE # 9
0026 E500         MOV  A,c2
0028 2404         ADD  A,#04H
002A FF           MOV  R7,A
002B E4           CLR  A
002C 33           RLC  A
002D FE           MOV  R6,A
002E C3           CLR  C
002F E500         MOV  A,c1
0031 9F           SUBB A,R7
0032 EE           MOV  A,R6
0033 6480         XRL  A,#080H
0035 F8           MOV  R0,A
0036 7480         MOV  A,#080H
0038 98           SUBB A,R0
0039 5003         JNC  ?C0004
003B E4           CLR  A
003C F500         MOV  c1,A

                ; SOURCE LINE # 10
003E            ?C0004:
003E 22           RET
        ; FUNCTION main (END)

Code Size: 63 Bytes
Code Generated
with NOINTPROMOTE
        ; FUNCTION main (BEGIN)
                ; SOURCE LINE # 6
0000 AF00          MOV  R7,c
0002 EF            MOV  A,R7
0003 33            RLC  A
0004 95E0          SUBB A,ACC
0006 FE            MOV  R6,A
0007 EF            MOV  A,R7
0008 F4            CPL  A
0009 4E            ORL  A,R6
000A 7002          JNZ  ?C0001
000C F500          MOV  c,A
000E          ?C0001:

                ; SOURCE LINE # 7
000E E500          MOV  A,c
0010 B4FF03        CJNE A,#0FFH,?C0002
0013 750001        MOV  c,#01H
0016         ?C0002:

                ; SOURCE LINE # 8
0016 E500          MOV  A,c
0018 2405          ADD  A,#05H
001A FF            MOV  R7,A
001B 33            RLC  A
001C 95E0          SUBB A,ACC
001E F500          MOV  i,A
0020 8F00          MOV  i+01H,R7





                ; SOURCE LINE # 9
0022 E500          MOV  A,c2
0024 2404          ADD  A,#04H
0026 FF            MOV  R7,A
0027 E500          MOV  A,c1
0029 C3            CLR  C
002A 9F            SUBB A,R7
002B 5003          JNC  ?C0004
002D E4            CLR  A
002E F500          MOV  c1,A









                ; SOURCE LINE # 10
0030          ?C0004:
0030 22            RET
        ; FUNCTION main (END)

Code Size: 49 Bytes

 Related Knowledgebase Articles



INTPROMOTE 编译器伪指令

缩写

IP

参数

无。

缺省

INTPROMOTE

µVision

Options — C51 — Enable ANSI integer promotion rules.

描述

INTPROMOTE伪指令使能ANSI 整型提升规则。在编译之前,if语句中声明的表达式从更小的类型提升到整型表达式。这样,只需要少量的修改,就可以把 Microsoft C 和 Borland C 程序移植到 C51 编译器。

因为8051是一个8位处理器,在一些应用程序中,使用INTPROMOTE 伪指令可能生成不是很高效的代码。

参考

ENUMINTNOINTPROMOTE

示例
C51 SAMPLE.C INTPROMOTE
#pragma intpromote
C51 SAMPLE.C NOINTPROMOTE

下面的示例:

stmt lvl  source
1        char c;
2        unsigned char  c1,c2;
3        int  i;
4
5        main ()  {
6  1       if (c == 0xff) c = 0;    /* never true! */
7  1       if (c == -1) c = 1;      /* works */
8  1       i = c + 5;
9  1       if (c1 < c2 +4) c1 = 0;
10 1     }

展示使用INTPROMOTE 和 NOINTPROMOTE 伪指令生成的代码。

使用INTPROMOTE生成的代码
        ; FUNCTION main (BEGIN)
                ; SOURCE LINE # 6
0000 AF00         MOV  R7,c
0002 EF           MOV  A,R7
0003 33           RLC  A
0004 95E0         SUBB A,ACC
0006 FE           MOV  R6,A
0007 EF           MOV  A,R7
0008 F4           CPL  A
0009 4E           ORL  A,R6
000A 7002         JNZ  ?C0001
000C F500         MOV  c,A
000E         ?C0001:

                ; SOURCE LINE # 7
000E E500         MOV  A,c
0010 B4FF03       CJNE A,#0FFH,?C0002
0013 750001       MOV  c,#01H
0016         ?C0002:

                ; SOURCE LINE # 8
0016 AF00         MOV  R7,c
0018 EF           MOV  A,R7
0019 33           RLC  A
001A 95E0         SUBB A,ACC
001C FE           MOV  R6,A
001D EF           MOV  A,R7
001E 2405         ADD  A,#05H
0020 F500         MOV  i+01H,A
0022 E4           CLR  A
0023 3E           ADDC A,R6
0024 F500         MOV  i,A

                ; SOURCE LINE # 9
0026 E500         MOV  A,c2
0028 2404         ADD  A,#04H
002A FF           MOV  R7,A
002B E4           CLR  A
002C 33           RLC  A
002D FE           MOV  R6,A
002E C3           CLR  C
002F E500         MOV  A,c1
0031 9F           SUBB A,R7
0032 EE           MOV  A,R6
0033 6480         XRL  A,#080H
0035 F8           MOV  R0,A
0036 7480         MOV  A,#080H
0038 98           SUBB A,R0
0039 5003         JNC  ?C0004
003B E4           CLR  A
003C F500         MOV  c1,A

                ; SOURCE LINE # 10
003E            ?C0004:
003E 22           RET
        ; FUNCTION main (END)

Code Size: 63 Bytes
使用NOINTPROMOTE生成的代码
        ; FUNCTION main (BEGIN)
                ; SOURCE LINE # 6
0000 AF00          MOV  R7,c
0002 EF            MOV  A,R7
0003 33            RLC  A
0004 95E0          SUBB A,ACC
0006 FE            MOV  R6,A
0007 EF            MOV  A,R7
0008 F4            CPL  A
0009 4E            ORL  A,R6
000A 7002          JNZ  ?C0001
000C F500          MOV  c,A
000E          ?C0001:

                ; SOURCE LINE # 7
000E E500          MOV  A,c
0010 B4FF03        CJNE A,#0FFH,?C0002
0013 750001        MOV  c,#01H
0016         ?C0002:

                ; SOURCE LINE # 8
0016 E500          MOV  A,c
0018 2405          ADD  A,#05H
001A FF            MOV  R7,A
001B 33            RLC  A
001C 95E0          SUBB A,ACC
001E F500          MOV  i,A
0020 8F00          MOV  i+01H,R7





                ; SOURCE LINE # 9
0022 E500          MOV  A,c2
0024 2404          ADD  A,#04H
0026 FF            MOV  R7,A
0027 E500          MOV  A,c1
0029 C3            CLR  C
002A 9F            SUBB A,R7
002B 5003          JNC  ?C0004
002D E4            CLR  A
002E F500          MOV  c1,A









                ; SOURCE LINE # 10
0030          ?C0004:
0030 22            RET
        ; FUNCTION main (END)

Code Size: 49 Bytes

 相关知识库标题







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值