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

声明:

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

2、请勿用于商业用途。

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

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


NOINTPROMOTE Compiler Directive

Abbreviation

NOIP

Arguments

None.

Default

INTPROMOTE

µVision

Options — CX51 — Enable ANSI integer promotion rules.

Description

The NOINTPROMOTE directive disables ANSI integer promotions. Integer promotions are normally enabled to provide the greatest compatibility between the C51 Compiler and other ANSI compilers. However, integer promotions can yield inefficient code on the 8051.

See Also

ENUMINTINTPROMOTE

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


NOINTPROMOTE 编译器伪指令

缩写

NOIP

参数

无。

缺省

INTPROMOTE

µVision

Options — CX51 — Enable ANSI integer promotion rules.

描述

NOINTPROMOTE 伪指令禁止 ANSI 整型提升。 整型提升一般是使能的,对C51 编译器和其他 ANSI 编译器提供最大的兼容。但是,对 8051来说,整型提升产生低效率的代码。

参考

ENUMINTINTPROMOTE

示例
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)

代码大小: 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)

代码大小: 49 Bytes




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值