![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机学习
文章平均质量分 81
贺鹏123
这个作者很懒,什么都没留下…
展开
-
C语言 sizeof, size_t, strlen
默认赋值16,而char *arr相当于初始化机器的位数,如机器是64bit,则初始化8byte。由于存放当前地址值不知当前机器平台的位数,并保证代码具有可移植性,定义一个关键字。从这里我们可以看出定义char arr[]和char *p,输出的结果不同。char arr[],初始化为0字节,需要到时在堆内存赋值长度,拿一个。可变数组,在编译期生成,没有编译期不生成,必须动态分配。strlen() 算的是加到\0之前的大小,函数。sizeof() 算的是总空间大小,运算符。编译c文件,查看结果。原创 2023-04-26 20:01:30 · 980 阅读 · 1 评论 -
C语言指针及数组的运行原理
编写一个数组定义的C文件demo.creturn 1;编译C文件生成汇编// -S 只进行编译// -fno-asynchronous-unwind-tables 过滤调试代码 [ root@localhost practice ] # gcc -S -fno-asynchronous-unwind-tables pointer.c查看生成的汇编文件demo.s.textmain:pushq %rbpmovl $11, -12(%rbp) // 将11存储到rbp-12的空间里。原创 2023-04-19 14:40:49 · 607 阅读 · 0 评论 -
指令段间及文件间参数调用过程(64位 Intel架构)
而当指令段间调用参数,先需要一个指令段调用另一个指令段,换句话说,需要该指令段中的一个汇编指令调用另一个指令段名称,这里通过call指令调用(相关作用可看最后指令补充)如下图所示。若文件间调用,则需要其中一个文件调用另一个文件参数,这里就需要用到c语言中的关键字extern来指定所需调用的参数。从下方代码可看出,main数中,将3个数据存放在寄存器中,sum通过寄存器取值并赋予在新开辟的栈空间中。在汇编中,当一个指令段B调用指令段A的数据,是如何实现的呢?编写一段2个指令段之间数据调用的C代码。原创 2023-04-18 23:27:14 · 554 阅读 · 0 评论 -
C语言的Hello World的汇编剖析(64位 Intel架构)
第二种方式的操作非常耗时,但也不是抛弃这个方式,由于寄存器数量有限(和计算机的位数相关,如你的计算机是32位,则有32个寄存器),当通用寄存器耗尽时,就可采用此方式。 若将C文件转换为汇编文件,则需要编译器作为桥梁,这里使用gcc编译器,由于为只需编译成汇编文件,所以采用—S这个选项命令即可。Gcc编译器(若采用Linux虚拟机剖析,则自带无需下载)OS正在运行自身程序,突然来了C语言一段代码,调用它。下图截至intel手册Volume 3 6.4节。指令段之间的调用,若有参数传递时,则会有2种方式。原创 2023-04-18 15:53:42 · 515 阅读 · 0 评论