CSAPP-第三章

CSAPP-第三章,第1张

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);

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存