技术文章:编译器的寄存器分配

2022年07月04日18:36:25 科技 1923

因为存储速度成本之间的问题,电脑的整个存储系统按照CPU从近到远可以分为4级:寄存器、cache缓存、主内存、硬盘。

离CPU最近的寄存器,读写速度最快

离CPU最远的硬盘,读写速度最慢。

包括C语言在内的大多数语言,是不需要关注寄存器怎么分配的。这部分的工作被编译器处理了。

当然,汇编语言是需要手动分配寄存器的。

程序员在写汇编时,会按照自己的直觉给出一个寄存器分配方案。

例如 5 / 3 = 1;汇编是这么写的:

mov 5, eax

xor edx, edx

mov 3, ecx

div ecx

这时,在eax里,余数在edx里。英特尔的CPU就是这么设计除法指令的。

除法使用固定的寄存器eax和edx,是CISC架构的缺点,让寄存器的分配变得麻烦。

如果是int a = 5, b = 3, c = a / b;

那么就要尽量给c分配寄存器eax,因为除法的商默认就在eax里,这样可以提高生成的汇编码的效率

如果是c = a % b,那么就要尽量给c分配寄存器edx,因为余数默认就在edx里。

因为寄存器只有16个,在程序规模较大的时候,是没法这么理想的分配寄存器的。

编译器里,寄存器的分配是根据变量之间的活跃度来的:同时活跃变量不能使用同一个寄存器,否则数据就互相覆盖了。

c = a / b这行代码的被除数a和除数b肯定是同时活跃的,在除法指令运行的那一刻它们必须同时有效(而且互相覆盖)。

c与a、b并不是同时活跃的,它是在除法运行之后开始活跃。

如果变量a在这行代码之后不再使用,那么c和a是可以共用eax的。

如果后续还要使用a,那么就不能共用eax。例如:

int a = 5, b = 3;

int c = a / b;

c += a; // a在这里还是活跃的,不能在第二行c = a / b时被覆盖。

这时就只能给c分配eax,同时edx除法指令占用,所以a和b只能使用ecx和ebx

以上代码翻译成汇编:

mov 5, ecx // a使用ecx

mov 3, ebx // b使用ebx

mov ebx, eax // 加载被除数的最低32位到eax

xor edx, edx // 被除数的高32位清零

div ebx // 真正的除法运算只是这一条

add ecx, eax // c += a

技术文章:编译器的寄存器分配 - 天天要闻

上面2行代码c = a / b, c += a的寄存器冲突图,如上。

给这个图的3个顶点a、b、c着色,被冲突线连接两个顶点不能是同一个颜色,即不能分配同一个寄存器

因为CISC的除法使用edx,我们把它也作为一个约束条件添加到这个图里:变量a是不能使用它的,因为它会被除法运算的余数覆盖,而a在c += a这行代码还要使用。

c可以使用它,但c作为除法运算的商应该优先分配eax,否则就还需要多1条mov eax, edx的汇编码。

技术文章:编译器的寄存器分配 - 天天要闻

64位寄存器的字节分配

实际CPU的寄存器是个64位的寄存器组,它的最低8位AL、次低8位AH、最低16位AX、最低32位EAX、整个寄存器RAX的关系如图。

al和rax是冲突的:

char buf[8] = {0};

char c = 'A';

char* p = buf;

*p += c;

如果指针p使用了rax,那么char类型的变量c就不能再使用al,反之也一样。

代码 *p += c里,指针变量p和字符变量c是同时活跃的。

这种情况可以通过掩码来判断,可以用1个二进制表示寄存器的1个字节

1,RAX是8字节的寄存器,掩码就是0xff。

2,al是1字节的寄存器,掩码就是0x1。

3,ah的掩码是0x2,因为它使用的是第2个字节。

4,ax的掩码是0x3,2个字节。

5,eax的掩码是0xf,4个字节。

如果掩码的与运算不为0,就是互相冲突的寄存器,不能用于同一个变量。

当然不是同一个寄存器组的寄存器,肯定是不冲突的。

ah和al是不冲突的,因为0x2 & 0x1 == 0。

ah和ax是冲突的,因为0x2 & 0x3 != 0。

技术文章:编译器的寄存器分配 - 天天要闻

科技分类资讯推荐

全市前列!苏州高新区5家企业入选 - 天天要闻

全市前列!苏州高新区5家企业入选

近日苏州市工信局公示了2023年苏州市智能制造优秀服务商名单苏州高新区共有5家企业入选数量居全市前列苏州高新区入选企业名单1苏州天准科技股份有限公司2苏州英威腾电力电子有限公司3中移(苏州)软件技术有限公司4苏州盖雅信息技术有限公司5苏州穗
代码大模型安全规范正式定稿,中国信通院启动首轮评估 - 天天要闻

代码大模型安全规范正式定稿,中国信通院启动首轮评估

IT之家 6 月 20 日消息,近年来,代码大模型已成为企业研发人员辅助编程必备助手,能够生成、翻译、补全代码,帮助定位和修复错误。然而,代码大模型背后隐藏的风险挑战还有待讨论。中国信息通信研究院(以下简称“中国信通院”)依托中国人工智能产业发展联盟(AIIA),联合业内近 30 家单位共同编制了《代码大模型安全风...
荣耀16英寸大屏笔记本不到3000元,真便宜! - 天天要闻

荣耀16英寸大屏笔记本不到3000元,真便宜!

目前在荣耀官方商城上面,荣耀MagicBook X 16 战斗版笔记本低至2799元即可拥有。这价格,真便宜!  这款笔记本于2023年11月上市,搭配第12代酷睿i5-12450H移动处理器,4+4核12线程设计,睿频高达4.4GHz,具备40W高性能输出,此外还有16GB LPDDR4x-4266MHz高频内存以及512GB固态硬盘,性能放在2024年6
打造“Living smart Way”在地营销IP  smart - 天天要闻

打造“Living smart Way”在地营销IP smart

2024年6月18日,成都诞生于都市,更为都市注入无数灵感。作为全球知名的新奢智能纯电汽车品牌,smart倾情打造“Living smart Way”在地营销IP,携手广大用户与品牌粉丝双向奔赴,创造smart的生活方式,积聚smart的生活灵感。
微信有一种功能,工作中我们都离不开它 - 天天要闻

微信有一种功能,工作中我们都离不开它

在如今移动通讯的时代,微信已经成为我们生活和工作中不可缺少的一部分,从最初期的只能文本输入,到后面可以文档传送,视频通话,以及现在的群功能等,几乎能覆盖工作中能接触的一切需要,自此帮助打工人完成了办公的网络自动化。
鸿蒙微信谈妥,华为让步,一场双赢,但应用分成的步子迈早了 - 天天要闻

鸿蒙微信谈妥,华为让步,一场双赢,但应用分成的步子迈早了

文/王新喜据澎湃新闻、蓝鲸TMT等媒体报道,华为、腾讯即将达成协议,将微信排除在收入分成之外,允许微信在其鸿蒙操作系统上运行而不收取应用内收入分成。据透露,这是这两家总部位于深圳的科技巨头经过数月谈判达成的。作为回报,腾讯将在鸿蒙持续维护和
未来十年最炙手可热的就业方向是什么? - 天天要闻

未来十年最炙手可热的就业方向是什么?

随着科技的飞速发展和社会的不断变革,未来的就业市场将呈现出全新的格局。在未来十年,有哪些行业将成为最炙手可热的就业方向?本文将为你揭晓。1. 人工智能行业:AI将成为未来的主角。随着人工智能技术的日益成熟和应用的普及,在语音识别、自动驾驶、
新民随笔|还女孩一张安静的书桌 - 天天要闻

新民随笔|还女孩一张安静的书桌

这段时间,江苏中专女生姜萍爆冷获得世界数学比赛第12名的新闻网络热度居高不下,人们为这位数学天才横空出世而鼓掌叫好,但许多杂音也“如期而至”,例如作弊、造假、阴谋论等,着实令人为女孩捏一把汗。图说:姜萍在黑板上解答数学题 图源:阿里巴巴微信
移动充电机器人来帮忙,巧解老旧小区电动汽车充电难题 - 天天要闻

移动充电机器人来帮忙,巧解老旧小区电动汽车充电难题

据“浦东发布”微信公号消息,老旧小区难以安装充电桩,导致充电补能不方便,是困扰许多电动汽车车主的问题。近日,周家渡街道引入移动充电机器人,探索充电设施与车位解绑的电动汽车用车模式,进一步方便居民生活。  雪野二村是一个老旧小区,建成于上世纪