-
c语言入门之Turbo C下的寄存器变量
在Turbo C下有种变量叫寄存器变量。使用寄存器的好处是可以提高程序的运行速度!因为减少了寻址时间。
看下面的C代码:
main()
{
int i,k;
register j;
for(i=1;i<=100;i++);
for(k=1;k<=100;k++);
for(j=1;j<=100;j++);
}
这里j被声明为寄存器变量。通过tcc -S后看它的部分汇编代码。
======================================================================================
…… ……
mov di,1
jmp short @5
@4:
@3:
inc di
@5:
cmp di,100
jle @4
@2:
; ?debug L 6
mov word ptr [bp-2],1
jmp short @9
@8:
@7:
inc word ptr [bp-2]
@9:
cmp word ptr [bp-2],100
jle @8
@6:
; ?debug L 7
mov si,1
jmp short @13
@12:
@11:
inc si
@13:
cmp si,100
jle @12
…… ……
======================================================================================
看到了!里面有di和si两个寄存器。但是只有j被声明为寄存器变量,为什么会出现两个呢?这个我没有找到什么合理的解释,也可能是由于程序中的变量少(少的范围是1-3个,如果使用两个变量,一个为普通变量,一个为寄存器变量,在汇编的代码下两个变量均是使用寄存器)。
在Turbo C中寄存器变量的个数最多只能使用两个(因为寄存器这个资源是很宝贵的)。但是如果声明多个寄存器变量的话,在编译时并不会报错,但这并不表示可以定义多个寄存器变量。同样,用tcc -S生成汇编代码后可以看到最多也就使用了di和si两个寄存器。
在一个程序中寄存器变量只能声明两个,肯定对于我们来说是少了点,但是我们也要合理的运用它。如果把它用在程序中规模比较大的循环中,效果也是可佳的(人能感觉到的话,可能不现实吧?我没有用过太大规模的循环)。总之,为了自己程序的速度,合理的利用这两个宝贵的寄存器变量吧!
看下面的C代码:
main()
{
int i,k;
register j;
for(i=1;i<=100;i++);
for(k=1;k<=100;k++);
for(j=1;j<=100;j++);
}
这里j被声明为寄存器变量。通过tcc -S后看它的部分汇编代码。
======================================================================================
…… ……
mov di,1
jmp short @5
@4:
@3:
inc di
@5:
cmp di,100
jle @4
@2:
; ?debug L 6
mov word ptr [bp-2],1
jmp short @9
@8:
@7:
inc word ptr [bp-2]
@9:
cmp word ptr [bp-2],100
jle @8
@6:
; ?debug L 7
mov si,1
jmp short @13
@12:
@11:
inc si
@13:
cmp si,100
jle @12
…… ……
======================================================================================
看到了!里面有di和si两个寄存器。但是只有j被声明为寄存器变量,为什么会出现两个呢?这个我没有找到什么合理的解释,也可能是由于程序中的变量少(少的范围是1-3个,如果使用两个变量,一个为普通变量,一个为寄存器变量,在汇编的代码下两个变量均是使用寄存器)。
在Turbo C中寄存器变量的个数最多只能使用两个(因为寄存器这个资源是很宝贵的)。但是如果声明多个寄存器变量的话,在编译时并不会报错,但这并不表示可以定义多个寄存器变量。同样,用tcc -S生成汇编代码后可以看到最多也就使用了di和si两个寄存器。
在一个程序中寄存器变量只能声明两个,肯定对于我们来说是少了点,但是我们也要合理的运用它。如果把它用在程序中规模比较大的循环中,效果也是可佳的(人能感觉到的话,可能不现实吧?我没有用过太大规模的循环)。总之,为了自己程序的速度,合理的利用这两个宝贵的寄存器变量吧!
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式