王和平的《程序是怎样跑起来的》学习笔记

第1章 对程序员来说,CPU意味着什么
问题:
1程序是什么?
2程序是有什么组成的?
3什么是机器语言
4正在运行的程序存储在什么位置?
5什么是内存地址
6计算机的构成元件中,负责程序解释和运行的哪一个?
答案
1指示计算机每一步动作的一组指令
2指令和数据
3CPU可以直接识别并使用的语言
4内存
5内存中,用来表示命令和数据存储位置的数值
6CPU
1.1.CPU的内部结构解析
1.2CPU是寄存器的集合体
程序是把寄存器作为对象来描述的
1.3决定程序流程的程序计数器
1.4条件分支和循环机制
1.5函数的调用机制
1.6通过地址和索引实现数组
1.7CPU的处理其实很简单
第2章 数据是用二进制数表示的
问题
1 32位是几个字节
2二进制数01011100转成十进制数是几?
3二进制数00001111左移两位后,会变成原数的几倍?
4补码形式表示的8位二进制数11111111,用十进制数表示的话是多少?
5补码形式表示的8位二进制数10101010,用十六位的二进制数表示的话是多少?
6反转部分图形模型时,使用的是什么逻辑运算?
答案
1 4字节
2 92
3 4倍
4 -1
5 1111111110101010
6 XOR
2.1用二进制数表示计算机的原因
2.2什么是二进制数
2.3移位运算和乘除运算的关系
2.4便于计算机处理的“补数”
2.5逻辑右移和算数右移的区别
2.6掌握逻辑运算的窍门
第3章 计算机进行小数运算时出错的原因
问题
1二进制数0.1,用十进制数是多少?
2用小数点后的3位的二进制数,能表示0.625吗?
3将小数分为符号、尾数、基数、指数4个部分进行表现的形式成为什么?
4二进制数的基数是什么?
5通过把0作为数值范围的中间值,从而在不使用符号位的情况下来表示负数的表示方法成为什么?
6 10101100.01010011这个二进制数,用十六进制数字表示的话是什么?
答案
1 0.5
2能
3浮点数
4 2
5EXCESS系统表现
6AC.53

3.1将0.1累加100次也得不到10
3.2用二进制数表示小数
3.3计算机运算出错的原因
3.4什么是浮点数
3.5正则表达式和EXCESS系统
3.6在实际的程序中进行确认
3.7如何避免计算机计算出错
3.8二进制数和十六进制数

4熟练使用有棱有角的内存
问题
1有十个地址引号引脚的内存IC可以指定的地址范围是多少?
2高级编程语言中的数据类型表示的什么?
3在32位内存地址环境中,指针变量的长度是多少位?
4与物理内存有着相同构造的数组的数据类型长度是多少?
5用后进先出方式进行数据读写的数据结构称为什么?
6根据数据的大小链表分叉成两个方向的数据结构称为什么?
答案
1 00000000001111111111(相当于十进制数01023)
2占据内存区域大小和存储在该内存区域的数据类型
3 32位
4 1字节
5栈
6二叉树

4.1内存的物理机制很简单
4.2内存的逻辑模型是楼房
4.3简单的指针
4.4数组是高效使用内存的基础
4.5栈、队列以及环形缓冲区
4.6链表使元素的追加和删除更容易
4.7二叉树使数据搜索更有效

第5章 内存和磁盘的亲密关系
问题
1存储程序方式指的是什么?
2通过使用内存来提高磁盘访问速度的机制称为什么?
3把磁盘的一部分作为假想内存来使用的机制是什么?
4windows中,在程序运行时,存储着可以动态加载调用的函数和数据的文件称为什么?
5在EXE程序文件中,静态加载函数的方式称为什么?
6在windows计算机中,一般磁盘的一个扇区是多少字节?
答案
1在存储装置中保存程序,并逐一运行的方式
2磁盘缓存
3虚拟内存
4DLL文件
5静态链接
6 512字节

5.1不读入内存就无法运行
5.2磁盘缓存加快了磁盘访问速度
5.3虚拟内存把磁盘作为部分内存来使用
5.4节约内存的编程方法
(1)通过DLL文件实现函数共有
(2)通过调用_stdcall来减少程序文件的大小
5.5磁盘的物理结构

第6章 亲自尝试压缩数据
问题
1文件存储的基本单位是什么?
2DOC\LZH\TXT这些扩展名中,哪一个是压缩文件的扩展名?
3文件内容用“数据的值*循环次数”来表示的压缩方法是RLE算法还是哈夫曼算法
4在windows计算机经常使用shift jis字符编码中,1个半角英数是用几个字节的数据来表示的?
5位图格式的图像,是压缩过的吗?
6可逆压缩和不可逆压缩不同之处是什么?
答案
1 1个字节(8位)
2LZH
3RLE算法
4 1个字节(8位)
5没有压缩过
6压缩过的数据能复原的是可逆压缩,不能复原的是不可逆压缩
6.1文件以字节为单位保存
6.2RLE算法
6.3RLE算法的缺点
6.4通过摩尔斯编码来看哈夫曼算法的基础
6.5用二叉树实现哈夫曼编码
6.6哈夫曼算法能够大幅度提升压缩比率
6.7可逆压缩与不可逆压缩

第7章 程序是在何种环境下运行
问题
1应用的运行环境,指的是什么?
2macintosh用的操作系统macOS,在AT兼容机上能运行吗?
3windows上的应用,在macOS上能运行吗?
4FreeBSD提供的ports,指的是什么?
5在macintosh上可以利用的windows环境模拟器称为什么?
6java虚拟机的功能是什么?
答案
1操作系统和计算机硬件本身的种类
2无法运行
3无法运行
4通过使用源代码来提供应用,并根据运行环境进行整合编译,从而得以在该环境下运行的机制
5virtual PC for mac
6运行JAVA应用的字节代码

7.1运行环境=操作系统+硬件
7.2windows克服了CPU以外的硬件差异
7.3不同操作系统的API不同
7.4freebsd port帮你轻松使用源代码
7.5利用虚拟机获得其他操作系统环境
7.6提供相同运行环境的JAVA虚拟机
7.7BIOS和引导

第8章 从源文件到可执行文件
问题
1CPU可以解析和运行的程序形式称为什么代码?
2将多个目标文件结合生成EXE文件的工具称为什么?
3扩展名为.obj的目标文件内容,是源代码还是本地代码?
4把多个目标文件收录在一起的文件称为什么?
5仅包含windows的DLL文件中存储的函数信息的文件称为什么?
6程序运行时,用来动态申请分配的数据和对象的内存区域形式称为什么?
答案
1本地代码(机器语言代码)
2链接器
3本地代码
4库文件
5导入库
6堆

8.1计算机只能运行本地代码
8.2本地代码的内容
8.3编译器负责转换源代码
8.4仅仅靠编译器是无法得到可执行文件的
8.5启动以及库文件
8.6DLL文件以及导入库
8.7可执行文件的必要条件
8.8程序加载时会生成堆栈
8.9有点难度的Q&A

第9章 操作系统和应用的关系
问题
1监控程序的主要功能是什么?
2在操作系统上运行的程序称为什么?
3调用操作系统功能称为什么?
4windows vista是多少位的操作系统?
5GUI是什么的缩写?
6WYSIWYG是什么的缩写?
答案
1程序的加载和运行
2应用或者应用程序
3系统调用
4 32位(也有64位的)
5 graphic user interface
6 what you see is what you get

9.1操作系统功能的历史
9.2要意识到操作系统的存在
9.3系统调用和高级编程语言的移植性
9.4操作系统和高级编程语言使硬件抽象化
9.5windows操作系统的特征
(1)32位操作系统
(2)通过API函数集来提供系统调用
(3)提供采用了GUI的用户界面
(4)通过wysiwyg实现打印输出
(5)提供多功能任务
(6)提供网络功能以及数据库功能
(7)通过即插即用实现设备驱动的自动设定
第10章 通过汇编语言了解程序的实际构成
问题
1本地代码的指令中,表示其功能的英语缩写称为什么?
2汇编语言的源代码转换成本地代码的方式称为什么?
3本地代码转换成汇编语言的源代码的方式称为什么?
4汇编语言的源文件的扩展名,通常是什么格式?
5汇编语言程序中的段定义指的是什么?
6汇编语言的跳转指令,是在何种情况下使用的?
答案
1助记符
2汇编
3反汇编
4.asm
5构成程序的命令和数据的集合组
6将程序流程跳转到其他地址时需要用到该指令

10.1汇编语言和本地代码是一一对应的
10.2通过编译器输出汇编语言的源代码
代码清单10-1

int AddNum(int a,int b)
{
   
return a+b;
}
void MyFunc()
{
   
int c;
c=AddNum(123,456);
}

代码清单10-2

_TEXT segment dword public use32 'CODE'
_TEXT ends
_DATA segment dword public use32 'DATA'
_DATA ends
_BSS  segment dword public use32 'BSS'
_BSS  ends
Dgroup group _BSS,_DATA
_TEXT segment dword public use32 'CODE'
_AddNum proc near
push ebp
mov  ebp,esp
mov  eax,dword ptr[ebp+8]
add  eax,dword ptr[ebp+12]
pop  ebp
ret
_AddNum  endp
_MyFunc   proc near
push ebp
mov  ebp,esp
push  456
push  123
call  _AddNum
add  esp,8
pop  ebp
ret
_MyFunc  endp
_TEXT  ends
       end

10.3不会转换成本地代码的伪指令
代码清单10-3

_TEXT segment dword public use32 'CODE'
_TEXT ends
_DATA segment dword public use32 'DATA'
_DATA ends
_BSS  segment dword public use32 'BSS'
_BSS  ends
Dgroup group _BSS,_DATA
_TEXT segment dword public use32 'CODE'
_AddNum proc near
push ebp
mov  ebp,esp
mov  eax,dword ptr[ebp+8]
add  eax,dword ptr[ebp+12]
pop  ebp
ret
_AddNum  endp
_MyFunc   proc near
push ebp
mov  ebp,esp
push  456
push  123
call  _AddNum
add  esp,8
pop  ebp
ret
_MyFunc  endp
_TEXT  ends
       end

10.4汇编语言的语法是“操作码+操作数”
10.5最常用的mov指令
10.6对栈进行push和pop
10.7函数调用机制
代码清单10-4

_MyFunc proc near
push  ebp
mov   ebp,esp
push  456
push  123
call  _AddNum
add   ebp,8
pop   ebp
ret 
_MyFunc endp

10.8函数的内部处理
代码清单10-5

_AddNum  proc near
push  ebp
mov   ebp,esp
mov   eax,dword ptr[ebp+8]
add   eax,dword ptr[ebp+12]
pop   ebp
ret
_AddNum  endp

10.9始终确保全局变量用的内存空间
代码清单10-6

int a1=1;
int a2=2;
int a3=3;
int a4=4;
int a5=5;
int b1,b2,b3,b4,b5;
void MyFunc()
{
   
int c1,c2,c3,c4,c5,c6,c7,c8,c9,c10;
c1=1;
c2=2;
c3=3;
c4=4;
c5=5;
c6=6;
c7=7;
c8=8;
c9=9;
c10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值