计算机体系知识
冰箱里有碗
人生是旷野,慢慢来
展开
-
程序运行之后,编译器怎样发挥作用?
??原创 2024-04-24 10:14:48 · 307 阅读 · 0 评论 -
C语言中的整数安全:溢出、回绕
无符号数永远不会溢出,只是在无限的循环往复。对于加法、乘法,假装有额外的有效位来承载运算结果,最后再直接截断。加法例子减法例子。原创 2024-01-25 23:29:14 · 829 阅读 · 0 评论 -
可执行文件为什么又叫映像文件image?——程序员的自我修养——链接、装载与库》笔记
直到启动运行,可执行文件中的指令、数据都没有被装入内存中。OS仅通过可执行文件头部的信息建立起“可执行文件”和进程虚存之间的映射关系。举例子:身份证就是一种映射关系,我的身份证是“鹅城”给我发的,我并不需要真的在“鹅城”,但通过这个身份证的映射又真的能找到我。“可执行文件”与“执行该可执行文件进程的虚拟空间”存在着一种映射关系,这种映射关系只是保存在OS内部的一个数据结构。“可执行文件在装载时实际上是被映射的虚拟空间” —— 《程序员的自我修养——链接、装载与库》原创 2024-01-22 23:42:32 · 481 阅读 · 0 评论 -
未初始化的全局变量为什么可以认为放在.bss 段?
未初始化的全局变量是弱符号。编译成.o时,占的大小是未知的,有可能别的地方还定义了,且定义的size更大。但是链接器是要符号判决的,是能知道大小的,最终在bss段为其分配空间(可执行文件)。目标文件中,没有在.bss段分配空间,而是标记为COMMOM。原创 2024-01-21 23:30:46 · 485 阅读 · 0 评论 -
《嵌入式C语言自我修养》第四章笔记
编译过程,将程序翻译成CPU能够识别和运行的二进制机器指令的过程。 从源程序到二进制文件的过程,很有意思 一个可执行文件中的每一个section都有一个section header,将这些section headers集中放到一起,就是section header table,翻译成中文就是节头表。section header描述各个section的名称、类型、起始地址、大小等信息。程序运行时,加载器会根据ELF header来获取可执行文件信息。 未初始化的全局变量和静态变量会放置在BSS段中,但是原创 2024-01-11 20:47:03 · 359 阅读 · 0 评论 -
程序员的自我修养-笔记
4、链接之前,.o的VMA都是0,因为虚拟空间还没有分配。链接之后,可执行文件各个段就分到相应的虚拟地址。链接器在完成地址、空间分配之后,就可以确定所有符号的虚拟地址了,然后就可以对需要重定位的进行地址修正了。代码引用了外部代码、符号,对应.o“.rel.text”代码段的重定位表,“.rel.data”数据段的重定位表。2、链接器为目标文件分配地址和空间,.test、.data在可执行文件及装载后的虚拟地址中均占空间;1、.bss 在目标文件、可执行文件中并不占用空间,但在装载时占用地址空间。原创 2024-01-21 23:19:53 · 463 阅读 · 0 评论 -
优化程序性能
1、选择一组适当的算法和数据结构;编写编译器能有效优化以转换成高效可执行代码的源代码。2、编写的一小点变化,都会引起编译器优化方式的很大变化。3、消除不必要的函数调用、条件测试、内存引用。原创 2024-01-17 23:22:31 · 311 阅读 · 0 评论 -
谈谈寄存器
寄存器在CPU内部,用来暂存指令、数据,利用寄存器会非常的快,通常在一个CPU时钟周期就可以完成。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。CPU的内部一般由:寄存器、控制器、运算器和时钟组成。“机器语言级别的程序是通过寄存器来处理的” —— 《程序是怎么跑起来的》矢泽久雄。通过汇编/反汇编,可以发现寄存器大量参与我们的程序运行。从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号。—— 《程序是怎么跑起来的》矢泽久雄。寄存器可以看做内存的一种。原创 2024-01-04 23:38:48 · 454 阅读 · 1 评论 -
什么是程序/代码
程序由指令和代码组成。程序能指挥计算机每一步怎么去运行。CPU只能识别和执行机器语言。原创 2024-01-04 23:20:04 · 375 阅读 · 1 评论 -
关于指针、内存的一些释疑与疑问
我觉得是编译器直接优化掉了中间过程,直接往栈上内存写值。原创 2023-12-25 23:02:04 · 436 阅读 · 1 评论 -
一次看透const
a、#defineb、const#define修饰的符号名称是一个真量数值,而const修饰的栈常量,是一个“假”常量。在实际中,使用const定义的栈变量,最终还是一个变量,只是在编译期间对语法进行了检查,发现代码有对const修饰的变量存在直接修改行为则报错。——《C++反汇编与逆向分析技术揭秘》const 修饰的变量,根据实测,要区分是局部变量还是全局变量。如下图所示全局变量g_val,虽然我们通过指针转换,绕过了编译器检查,但实际在写入操作时,引发异常。原创 2023-12-24 22:05:13 · 1896 阅读 · 2 评论 -
static 变量是怎样对外不可见的?
a、只能在当前文件内使用。—— 由编译器在编译之前进行语法检查,来保证。b、其他店同全局变量相同—— 内存结构、访问原理。原创 2023-12-24 18:04:26 · 574 阅读 · 1 评论 -
位:相关知识点集锦
1. 结构体位域:本质是在进行与或运算。原创 2023-12-20 22:51:32 · 383 阅读 · 0 评论 -
怎么快速记住大端、小端
0x12 | 0x34| ... |... 这样的,跟我们阅读习惯一样的,从左到右,从地地址到高地址的,就是大端(符合我们阅读习惯)跟我们阅读习惯不太相符的,0x78, 0x56, 0x34, 0x12 就是小端。比如 0x12345678。假设地址从左到右:依次增高。原创 2023-12-20 22:33:40 · 516 阅读 · 0 评论 -
常用寄存器
eax。原创 2023-12-18 22:42:35 · 329 阅读 · 1 评论 -
编译和链接【未完待续】
扫描(词法分析)-语法分析(检查表达式是否合法)-语义分析(静态语义通常包括声明和类型匹配、类型的转换;动态语义:运行期出现的语义相关问题,比如除0)-源代码优化-代码生成-目标代码优化。编译Compilation:词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。汇编Assembly:将汇编代码转换成机器可以执行的指令。构建:编译和链接合并到一起的过程。预处理Prepressing。原创 2023-12-17 13:47:49 · 451 阅读 · 1 评论