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