写给自己的话:

为什么要重学编程…在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
2
3
4
5
6
7
8
9
chmod 111 file #把这个文件设置成全部用户只可执行,不可写也不可读,尝试读取时文件显示为空

chmod 700 file #把这个文件设置成当前用户可读可写可执行

chmod 777 file #把这个文件设置成所有用户可读可写可执行

chmod 000 file #这个文件所有用户都干不了任何事情,不可查看不可写入不可执行

chmod 531 file #把这个文件设置成当前用户可读可执行不可写入,组权限设置成可写可执行不可读,其它用户设置成可执行不可读不可写

文件内容查找 grep

system.log
1
2
3
4
5
[Info] this is Info
[Info] this is Info Too
[Info] this is Info Three
[Warring] this is Warring
[Error] this is Error

输入命令:

1
grep info *.log -r -i -n -B1 -A1 -H

输出

1
2
3
4
5

system.log-2-[Info] this is Info Too
system.log:3:[Info] this is Info Three #'Three' chars color is red
system.log-4-[Warring] this is Warring

命令解释:

info意思是需要文件中包含字符串"info",*.log是查找范围,意思是查找所有当前目录下以.log结尾的文件

-r: 如果有文件夹则递归查找
-i: 忽略待查找字符串的大小写
-n: 在输出结果中显示行号
-B1:额外输出匹配行的前1行文本
-A1:额外输出匹配行的后1行文本
-H: 在结果开头显示匹配字符所在文件的文件名

剪切字符 cut

用于截取文件或标准输入的字符,常与其它命令一起使用,例如我想提取出当前用户的用户名

1
who|cut -d " " -f 1
1
2
3
-b #表示以字节进行分割,后面可跟取出的范围,类似-f
-c #表示以字符进行分割,后面可跟取出的范围,类似-f
-d -f #表示以什么字符进行分割 -f表示取出分割后的第几个,-f只与-d一起使用

创建文件夹 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
2
3
4
5
6
7
8
9
10
内存地址增长方向 ↓(高地址)
+-----------------+
| 参数2 | ← ESP+8
+-----------------+
| 参数1 | ← ESP+4
+-----------------+
| 返回地址 | ← ESP
+-----------------+
| 局部变量 | ← ESP-xxx
+-----------------+

一些概念:

ESP 是动态的:随着 PUSH/POP 指令,ESP 的值会变化

[ESP+偏移]:用于访问栈上的参数和局部变量

+4 的由来:32位系统地址宽度是4字节

偏移

1
2
3
4
5
6
7
8
9
char *p = 0x00; //p为地址变量
*(p+1) = 0x0f; // 在p地址的基础上偏移一位并赋值为0x0f

// 访问数组时其实只是在访问内存的偏移而已,实际并没有数组这个概念

char arr[5];

int el = arr[0];
int el = *(arr)

重学C

指针

1
2
3
4
5
6
char *p = 0x00;
p[0] = 1; //意思是把地址0x00处赋值为1
p[1] = 2; //意思是把地址0x01处赋值为2
p[2] = 3; //意思是把地址0x02处赋值为3
p[3] = 4; //意思是把地址0x03处赋值为4
//...

以上语法在C中是合法的,p[n]表示在p地址上的基础上偏移n个地址

数组也是一样,首先声明int arr[5] = {1,2,3,4,5};一块连续的内存地址,接着在这个基地址arr上加上特定的偏移来访问指定偏移处的数据,即:arr[i]