十二天深入理解计算机系统(三)

本文介绍了程序的机器级表示,包括如何生成汇编代码、数据格式、寄存器使用、数据传送指令限制等内容。深入探讨了直接跳转与间接跳转的区别、if与switch的不同实现方式、栈帧结构及指针差计算等概念。同时对比了IA32与x86-64架构的特点。

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

程序的机器级表示

最近因为在忙我们数据仓库的开源工作,要是一个C++系统开源,工作量实在是大,说起来都是泪(累)。以及生活中的一些事,找房子什么的,学习东西的时间比较少,这个系列很长时间没有更新,争取年前搞完,废话少说,直接介绍知识点。

1 如何产生汇编代码

gcc -O1 -S code.c

objdump -d code.o

objdump -d code

2 数据格式

Intel用“字”表示16位数据类型,32位数为“双字”,64位数为“四字”

3 IA32位寄存器

wps_clip_image-19481wps_clip_image-7229

4 数据传送指令的限制

两个操作数不能都指向存储器位置

5 直接跳转与间接跳转的区别

如:jmp .L1

.L1:

popl %edx

这就就是直接跳转

jmp *%eax

用寄存器%eax中的值作为跳转的目标。条件跳转只能是直接跳转

6 if和switch的区别

Switch通过跳转表来实现,跳转表的优点是执行开关语句的时间与开关情况的数量无关。跳转表更加高效。If通过条件跳转实现。

7 栈帧结构

wps_clip_image-10663

8 指针差

结构值是除以数据类型大小后的值

9 最小化缓存区溢出攻击方法

随机化、栈保护和限制那部分存储器存储可执行代码

10 IA32和x86-64通用寄存器对比

wps_clip_image-11862

wps_clip_image-26167

11 x86-64特性

1)指针和长整数是64位长

2)通用目的寄存器从8个扩展到16个

3)许多程序状态都保存在寄存器中,而不是在栈上。整形和指针过程参数(最多6个)通过寄存器传递。

4)对栈位置的引用相当于栈指针。大多数函数在调用开始时分配所需要的整个栈存储,在过程开始时通过减小栈指针,并在调用过程中保持栈指针指向固定位置。

转载于:https://www.cnblogs.com/jacksu-tencent/p/3472297.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值