- 博客(13)
- 收藏
- 关注
原创 Linux0.11源码学习笔记_2
那么整体的逻辑就是,选取了硬盘的第一个(0号)磁头,让它读取数据的时候从0号磁道的第二个扇区开始读取数据,然后设置了应该把数据写入到哪里,也就是0x90200为起始地址处,再然后设置了进行读取操作,而且是读取4个扇区,最后,调用13号中断,执行硬盘操作。失败时,首先把dx的值设置成了0x0000,也就是选择0号磁头和0号驱动器,然后把ax的值设置成了0x0000,表示重置磁盘系统,读取0块扇区,然后再执行13号中断,最后,无条件跳回到load_setup处,重新执行之前的操作。那么这些代码就很好理解了。
2024-08-03 08:08:04
632
原创 Linux0.11源码学习笔记_1
ss,stack segment register,堆栈段寄存器,这是中文翻译的一个很诡异的地方,不知道是哪个神仙翻译的,stack就是栈,但偏要加个堆,堆是堆,栈是栈,这才对嘛。在执行jmpi之前,是完成了一个rep movw的操作,这是bootsect.s的代码,bootsect.s就是启动区的代码,大小应该是没有512字节的,也就是说,此时cpu还在执行0x7c00往后的一点点内存处的代码,也就是rep movw所在的内存空间处。rep指令,repeat的缩写,顾名思义,重复。
2024-08-01 09:30:14
881
原创 Linux0.11源码学习笔记_0
而在复制时,ds中的值会默认左移四位,也就是十六进制的一位,那么0x07c0就会变成0x7c00,也就是最开始的那512字节数据被移动到内存中的起始地址。那么,以这个地址为基本点,加上不同的值,就可以访问后面的不同的地址了,在后面的代码中就可以看到,不同的代码是放在不同的区域的。BOOTSEG的值是0x07c0,mov指令的作用是移动数据,手段就是复制地址,所以说第一句的意思就是把ax中的值变成0x07c0,第二句就是把ds中的值变成0x07c0。当然,是cpu跳转到的这个地址,并执行的程序。
2024-07-31 16:29:50
738
原创 c语言笔记_5
const关键字用于声明一个变量,其值在初始化后不能被修改。这提供了一种在编译时检查变量值是否被意外修改的方法,增加了程序的可靠性和安全性。const可以用于基本数据类型、指针以及函数参数。
2024-07-30 15:57:00
677
原创 半导体、PN结、二极管、三极管、场效应管
组成半导体的元素,如硅(si)、锗(ge),最外层都是四个电子,这四个电子不容易跑,但不是不能跑,能跑一点点,也就是如跑。
2024-07-30 12:39:12
574
原创 c语言笔记_4
在用函数对某一数据进行操作时,有这两种方式进行。一是直接去到对应内存进行修改,二是修改后将值返回,然后接收。第一种方式就需要把指针的地址传给函数,所以是&head,类型是node_n **,是个二级指针,所以参数需要是node_n **,在操作时,(*head)才是传之前的head指针,所以在使用时需要用(*head)。
2024-06-30 12:41:45
770
原创 NO cortex-M SW device Found
解决办法:把boot0和boot1置1,也就是自举模式切换成SRAM,按按复位(不按应该也行),然后程序就成功下载进去了。再切换成Flash,也就是boot0和boot1置0,再下载程序也是正常的。如何置1和置0查看原理图就行。今天遇到了这个问题,应该是不知道开了啥端口导致的。
2024-06-28 22:38:23
325
原创 c语言笔记_3
按道理来说,a和p[0]的类型是不匹配的,但是a是一号元素的地址,此时会进行隐式类型转换,变成int(*)[3],当把a赋值给p[0]时,a还会继续进行隐式类型转换,让a指向第一个3个int元素组的第一个元素的地址,这时就是让一个指针指向一个地址,类型就匹配了。()中的定义的变量不可在其{}外使用,比如i,如果定义在()内,那么{}外是无法使用的,定义在()外的话,在{}内更改值后,后面{}外的语句也可以使用,并且值是更改后的值。p是一个数组的首元素的地址,也是数组名,其中数组里有三个int型的指针变量。
2024-01-30 15:01:20
417
1
原创 c语言笔记_2
那么以此类推,64位机就是2^64个地址,是2^32乘以2^32,这个数值是很大的,理论上可以代表很多个存储单元,远超了现在的内存的容量大小。虽然p+1和*(p+1)的值一样,但p+1还在第一层,而*(p+1)在第二层,只不过因为第一层的地址和第二层的首地址一样而已。*和++的优先级相同,但它们是从右往左算的,先执行p++,不过p++会先将p的值给*,然后再执行p的自增。而*(p[0]+2),p[0]指的是{1,2,3}这个数组的首地址,已经进入了第二层,+2就成了3的地址。赋值的操作,就是在把p指向a。
2024-01-20 10:27:55
576
原创 c语言笔记_1
如果小于5,则不会进位,大于等于5,则加0.5后就进位了。如果是后面的小数,可先乘以对应位数再四舍五入,之后再除回来就可以了。比如,对第三位进行四舍五入,可先乘以100,然后加0.5,最后除100.0就行了。3.浮点类型:浮点数遵循IEEE 754标准,使用一种特殊的格式存储,这包括三个部分:符号位、指数部分和尾数部分。一个float是4,10个也就是40,可以看出,指的是数组的大小。这条语句从右往左算,第一步后,a=3,b=4,3x4=12。可以看出,声明数组后,a既是数组名,也是0号元素的地址。
2024-01-17 13:49:29
400
原创 c笔记_0
类型,意味着在对这段内存进行读取和写入操作时,会按照整数的方式来解析和处理这段内存。要清楚哪些量可改,哪些量不可改,比如函数的指针型参数,声明了一个指针出来,那么总是的用它的,如果整个程序中都没写让它指向某个地址,没有掌握指针的状态是一件很危险的事,使用指针时,野指针不一定会报错。%p是输出地址的值,如果以%d去输出&a的话,有可能会导致错误。2e3这样的指数,e后面只能是整数,e前面也不能不写值。因为指针就是地址,内存地址是多少位,指针就是多少位。这句声明会确定两个东西,内存大小,内存的分析方式。
2024-01-16 17:28:30
350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人