CSAPP-第三章

CSAPP第三章:程序的机器级表示

GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。然后GCC调用汇编器链接器,根据汇编代码生成可执行的机器代码

程序编码

源文件-汇编文件-目标代码文件

假设一个C程序,命名为mstore.c。我们使用“-S”选项,就能看到C语言编译器产生的汇编代码

linux>gcc -Og -S mastore.c

这会使GCC运行编译器,产生一个汇编文件mstore.s,但是不做其他进一步的工作

如果我们使用“-c”命令行选项,gcc会编译并汇编该代码

linux>gcc -Og -c mastore.c

这就会产生目标代码文件mstore.o,它是二进制格式的,所以无法直接查看

如果要查看机器代码文件的内容,需要使用到反汇编器(disassembler)这些程序根据机器代码产生一种类似于汇编代码的格式,在Linux系统中,带‘-d’命令行标志的程序OBJDUMP可以充当这个角色

linux>objdump -d mstore.o

数据格式

一个字节等于八个bit,八位

一个字等于两个字节,十六位

双字等于四个字节,三十二位

四字等于八个字节,六十四位

单精度四字节

双精度八字节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LSOLfHve-1652614399385)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220515190121928.png)]

指令操作

各种指令,很多很多,这里就不一一列举了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCmDQMwq-1652614399389)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220515191202012.png)]

特别注意,在汇编语言的栈的操作里,栈顶在底部,栈底在顶部,从下往上地址增大,压栈时,栈顶指针会减小

指针

每个指针都对应一个类型

int *ip
char **cpp

变量ip是一个指向int类型对象的指针

通常,如果对象类型为T,那么指针的类型为T*。特殊的void*类型代表通用指针。

每个指针都有一个值,这个值是某个指定类型的对象的地址。特殊的NULL(0)值表示该指针没有指向任何地方。

指针可以进行强制类型转换

指针的强制类型转换只改变它的类型,而不改变它的值。

指针也可以指向函数

例如

int fun(int x,int *p);
然后我们声明一个指针fp,将它赋值为这个函数
int (*fp)(int,int *);
fp=fun;
然后用这个指针来调用这个函数
int y=1;
int result = fp(3,&y);

函数指针的值是该函数机器代码表示中第一条指令的地址

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值