写给自己的话:
为什么要重学编程…在24、25年这两年中,我经历了太多次对自我职业前景的抉择,但我都无一例外的错了,尽管在外看来是正确的,取得了两份实习,有了不少工作经验,但就对我个人而言的成长甚至不如22、23年初学编程时进步的多,这两年来更多的是在"应付"而不是"主动",我需要静下来好好想想自己究竟想要什么了…
重学编程的最大困难就是彻底与过去的自己切割,这是极难的,因为不再是以一个完全小白的心态去学习,会有自己的想法,会去顶撞、会去质疑,更多的是不屑,放不下面子去接受新知识,忍不下心杀死过去的自己,经历了这两年的教训,我应该醒悟了,那么就从今天开始对自己的编程之路进行以此彻底的"重构"吧,无论是知识上还是心态上,拿出22年初入编程领域的热情好吗,那时没有什么,只有自己,现在也请一样,好吗
重学Linux
或者说重新系统的开始学linux,起码学到是你自己在用你的linux,而不是百度或者谷歌在用你的linux
运算符
; 队列执行运算符
1 | command1 ; command2 ; command3 |
意思是command2需要等待command1执行完毕才能开始执行
& 并列执行运算符
1 | command1 & command2 & command3 |
意思是command1、2、3、会同时执行
&&和|| 逻辑执行运算符
1 | command1 && command2 && command3 |
意思是只有当command1执行成功时才会执行command2,只有当command2执行成功时才会执行command3
1 | command1 || command2 || command3 |
意思是只有当command1执行失败时才会执行command2,只有当command2也执行失败时才会执行command3
| 管道运算符
1 | command1 | command2 | command3 |
意思是把command1执行后的输出作为输入传递command2,把command2的输出传递给command3
这是完成高级操作的核心运算符,比如我要截取linux的nameserver值,就可以使用
1 | host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ") |
这段命令的意思是把cat的执行结果传给grep再把grep的执行结果传给cut,最后保存在host_ip变量中
命令
权限管理 chmod
| 数字 | 说明 |
|---|---|
| 4 | 可读 |
| 2 | 可写 |
| 1 | 可执行 |
第一位:设置用户权限
第二位:设置组权限
第三位:设置其它用户权限
1 | chmod 111 file #把这个文件设置成全部用户只可执行,不可写也不可读,尝试读取时文件显示为空 |
文件内容查找 grep
1 | [Info] this is Info |
输入命令:
1 | grep info *.log -r -i -n -B1 -A1 -H |
输出
1 |
|
命令解释:
info意思是需要文件中包含字符串"info",*.log是查找范围,意思是查找所有当前目录下以.log结尾的文件
-r: 如果有文件夹则递归查找
-i: 忽略待查找字符串的大小写
-n: 在输出结果中显示行号
-B1:额外输出匹配行的前1行文本
-A1:额外输出匹配行的后1行文本
-H: 在结果开头显示匹配字符所在文件的文件名
剪切字符 cut
用于截取文件或标准输入的字符,常与其它命令一起使用,例如我想提取出当前用户的用户名
1 | who|cut -d " " -f 1 |
1 | -b #表示以字节进行分割,后面可跟取出的范围,类似-f |
创建文件夹 mkdir
1 | mkdir -p cpp/relearn #会创建cpp/relearn这个多级目录,不加-p的话如果cpp目录不存在会报错 |
新学汇编
一切语言的基础,不可不学,参考教材《三十天自制操作系统》
标志和指令
基本标志
| 标志 | 说明 | 全称 |
|---|---|---|
| C | 进位标志,报告BIOS函数是否调用错误,无错为0,有错为1 | carry flag |
| I | 中断标识,告诉CPU是否需要处理中断请求,不处理为0,处理为1 | interrupt flag |
| FLAGS | 存储进位标志和终端标志的16位寄存器 | - |
基本指令
| 指令 | 功能 | 全称 |
|---|---|---|
| JC | 当进位标志是1的时候跳转 | jump if carry |
| JNC | 当进位标志是0的时候跳转 | jump if not carry |
| CLI | 将中断标志置为0 | clearn interrupt flag |
| STI | 将中断标志置为1 | set interrupt fllag |
| PUSHFD | 把Flag压入栈 | push flags double-word |
| POPFD | 把Flag从栈中弹出 | pop flags double-word |
常用指令集
| 指令集 | 解释 |
|---|---|
| PUSHFD POP EAX | 把flags压入栈再弹出来赋值给EAX |
| PUSH EAX POPFD | 把eax压入栈再弹出来赋值给flags |
寄存器
| 寄存器 | 名称 | 主要用途 | 可访问的位 |
|---|---|---|---|
| EAX | 累加器 | 算术运算、I/O、中断 | AX(16位)、AH(高8位)、AL(低8位) |
| ECX | 计数器 | 循环计数、字符串操作 | CX、CH、CL |
| EDX | 数据寄存器 | I/O指针、乘法辅助 | DX、DH、DL |
| EBX | 基址寄存器 | 内存寻址基址 | BX、BH、BL |
| ESP | 栈指针 | 指向栈顶 | SP |
| EBP | 基址指针 | 指向栈帧基址 | BP |
| ESI | 源索引 | 字符串操作源地址 | SI |
| EDI | 目标索引 | 字符串操作目标地址 | DI |
栈指针寄存器ESP
ESP指向栈顶即返回地址,参数列表从低地址到高地址依次排列
1 | 内存地址增长方向 ↓(高地址) |
一些概念:
ESP 是动态的:随着 PUSH/POP 指令,ESP 的值会变化
[ESP+偏移]:用于访问栈上的参数和局部变量
+4 的由来:32位系统地址宽度是4字节
偏移
1 | char *p = 0x00; //p为地址变量 |
重学C
指针
1 | char *p = 0x00; |
以上语法在C中是合法的,p[n]表示在p地址上的基础上偏移n个地址
数组也是一样,首先声明int arr[5] = {1,2,3,4,5};一块连续的内存地址,接着在这个基地址arr上加上特定的偏移来访问指定偏移处的数据,即:arr[i]