对于计算机的探索

半捧光阴终流水,一轮岁月始光尘

1. 简述

本文是自己对于计算机的粗略了解,随着了解的深入,会不断修改内容,大致目录为 组成、系统、语言。

2. 计算机组成

组成以硬件系统和软件系统组成

2.1 硬件系统

  1. 输入设备

输入设备功能是将数据、程序及其他信息,从人们熟悉的形式转换为计算机能够识别和处理的形式输入到计算机内部。 常用的输入设备有键盘、鼠标、光笔、扫描仪、数字化仪、条形码阅读器等。

  1. 输出设备

输出设备功能是将计算机内部二进制形式的数据信息转换成人们所需要的或其他设备能接受和识别的信息形式。常用的输出设备有显示器、打印机、绘图仪等。

  1. 存储器

存储器的主要功能是存放程序和数据。程序是计算机操作的依据,数据是计算机操作的对象。

  1. 运算器

运算器功能是完成算术运算和逻辑运算,算术运算是指加、减、乘、除及它们的复合运算。而逻辑运算是指“与”、“或”、“非”等逻辑比较和逻辑判断等操作

  1. 控制器

控制器一般由指令寄存器、指令译码器、时序电路和控制电路组成。它的基本功能是从内存取指令和执行指令。指令由操作码(操作方法)及操作数(操作对象)两部分组成

  1. 总线

总线是一组能为多个部件分时共享的公共信息传送线路,分时和共享

2.2 软件系统

  1. 系统软件

操作系统【OS】、数据库管理系统【DBMS】、语言处理程序、分布式软件系统、网络软件系统、标准库程序、服务性程序

  1. 应用软件

程序库软件、包套装软件、自己开发的软件

3. 操作系统

调用软件能和硬件进行交互的程序

3.1 功能

进程管理(Processing management) 、 处理器管理、存储器管理、设备管理、文件管理、作业管理(系统调用接口) 、用户界面、安全机制、网络通信

3.2 种类

  • 嵌入式

如VxWorks、eCos、Symbian OS及Palm OS,iOS,Android

  • 类 Unix

System V、BSD与Linux

  • Microsoft Windows
  • MacOS X
  • Google Chrome OS
  • 鸿蒙

3.3 组成

内核、驱动程序、接口库、外围

  • 对CPU的使用进行管理的进程调度程序

  • 对内存分配进行管理的内存管理程序

  • 对输入输出设备进行管理的设备驱动程序

  • 对外存中信息进行管理的文件系统

3.4 特征

并发、共享、虚拟、异步

3.5 BIOS帮助命令

1
2
3
4
5
6
# windows加在命令后面可以有详细的信息
/?
# 加在命令后面可以有详细的信息
--help
# (windows、Linux)帮助
help

4. 计算机网络

连接设备在协议下进行资源共享和信息传送

4.1 功能

数据通信、资源共享、集中管理、实现分布式处理、负荷均衡

4.2 种类

按地理范围标准可以把各种网络类型划分为局域网、城域网、广域网和互联网四种。

4.3 组成

计算机、网络操作系统、传输介质(可以是有形的,也可以是无形的,如无线网络的传输介质就是空间)以及相应的应用软件四部分

4.4 查看网络连接

1
2
3
4
# 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。 
netstat
# 查看ip
ipconfig

5. 机器语言

5.1 简述

机器语言是机器能直接识别的程序语言或指令代码,机器语言使用绝对地址和绝对操作码,不同的计算机都有各自的机器语言,可以运行在计算机内的指令集。

5.2 功能

它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它

5.3 种类

  • 二进制代码,由操作码和操作数两部分组成
  • 三进制(3^1)
  • 四进制(2^2)
  • 八进制(2^3)
  • 九进制(3^2)
  • 十进制
  • 十六进制(2^4,ABCDEF)

5.4 组成

(1)操作码。
(2)操作数的地址。
(3)操作结果的存储地址。
(4)下条指令的地址。

5.5 实现Hello

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0040 0000 0000 0000
0000030 0000 0000 0040 0000 0000 0040 0007 0003
0000040 0000 0000 0000 0000 0000 0000 0000 0000
*
0000080 0001 0000 0001 0000 0003 0000 0000 0000
0000090 0000 0000 0000 0000 0200 0000 0000 0000
00000a0 000d 0000 0000 0000 0000 0000 0000 0000
00000b0 0004 0000 0000 0000 0000 0000 0000 0000
00000c0 0007 0000 0001 0000 0006 0000 0000 0000
00000d0 0000 0000 0000 0000 0210 0000 0000 0000
00000e0 0027 0000 0000 0000 0000 0000 0000 0000
00000f0 0010 0000 0000 0000 0000 0000 0000 0000
0000100 000d 0000 0003 0000 0000 0000 0000 0000
0000110 0000 0000 0000 0000 0240 0000 0000 0000
0000120 0032 0000 0000 0000 0000 0000 0000 0000
0000130 0001 0000 0000 0000 0000 0000 0000 0000
0000140 0017 0000 0002 0000 0000 0000 0000 0000
0000150 0000 0000 0000 0000 0280 0000 0000 0000
0000160 0090 0000 0000 0000 0005 0000 0005 0000
0000170 0004 0000 0000 0000 0018 0000 0000 0000
0000180 001f 0000 0003 0000 0000 0000 0000 0000
0000190 0000 0000 0000 0000 0310 0000 0000 0000
00001a0 0020 0000 0000 0000 0000 0000 0000 0000
00001b0 0001 0000 0000 0000 0000 0000 0000 0000
00001c0 0027 0000 0004 0000 0000 0000 0000 0000
00001d0 0000 0000 0000 0000 0330 0000 0000 0000
00001e0 0018 0000 0000 0000 0004 0000 0002 0000
00001f0 0004 0000 0000 0000 0018 0000 0000 0000
0000200 6548 6c6c 2c6f 5720 726f 646c 0021 0000
0000210 01b8 0000 ba00 000d 0000 be48 0000 0000
0000220 0000 0000 01bf 0000 0f00 b805 003c 0000
0000230 00bf 0000 0f00 0005 0000 0000 0000 0000
0000240 2e00 6164 6174 2e00 6574 7478 2e00 6873
0000250 7473 7472 6261 2e00 7973 746d 6261 2e00
0000260 7473 7472 6261 2e00 6572 616c 742e 7865
0000270 0074 0000 0000 0000 0000 0000 0000 0000
0000280 0000 0000 0000 0000 0000 0000 0000 0000
0000290 0000 0000 0000 0000 0001 0000 0004 fff1
00002a0 0000 0000 0000 0000 0000 0000 0000 0000
00002b0 0000 0000 0003 0001 0000 0000 0000 0000
00002c0 0000 0000 0000 0000 0000 0000 0003 0002
00002d0 0000 0000 0000 0000 0000 0000 0000 0000
00002e0 0011 0000 0000 0001 0000 0000 0000 0000
00002f0 0000 0000 0000 0000 0019 0000 0010 0002
0000300 0000 0000 0000 0000 0000 0000 0000 0000
0000310 6800 6c65 6f6c 772d 726f 646c 612e 6d73
0000320 6d00 7365 6173 6567 5f00 7473 7261 0074
0000330 000c 0000 0000 0000 0001 0000 0002 0000
0000340 0000 0000 0000 0000 0000 0000 0000 0000
0000350

6. 汇编语言

6.1 概述

汇编是一种直接访问计算机硬件不具有移植性的编程语言

6.2 功能

能够对计算机进行开发自己想要的功能和操作

6.3 种类

根据操作系统有不同的种类,汇编语言编译器如MASM、NASM、TASM、GAS、FASM、RADASM

6.4 组成

逻辑运算、算术运算、输入输出、内存运算

  1. 传送指令
  • 通用数据传送指令

MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )

  • 目的地址传送指令

LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.

  • 标志传送指令

LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.

  1. 逻辑运算

AND 与运算.
or 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL

  1. 算数运算指令

ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.
NEC 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整.
DAS 减法的十进制调整.
MUL 无符号乘法.
IMUL 整数乘法.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整.
DIV 无符号除法.
IDIV 整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)

  1. 串操作

DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX<>0时重复.
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
REPC 当CF=1且CX/ECX<>0时重复.
REPNC 当CF=0且CX/ECX<>0时重复.

  1. 输入输出

IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
其范围是 0-65535.

  1. 程序转移指令

1>无条件转移指令 (长转移)
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1<op2 )
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 “0” 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 “1” 时转移.
3>循环控制指令(短转移)
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT 中断指令
INTO 溢出中断
IRET 中断返回
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允许位.
CLI 清中断允许位.

  1. 伪指令

DW 定义字(2字节).
PROC 定义过程.
ENDP 过程结束.
SEGMENT 定义段.
ASSUME 建立段寄存器寻址.
ENDS 段结束.
END 程序结束.

6.5 编程hello

  1. 下载开发环境包,(msam、link、dosbox【需要32位环境】)
  1. 运行dosbox.exe

  2. 进行挂载,查看是否成功

1
2
3
4
5
# 挂载命令  masm 我是放在DOSBOX下面的  Z盘是你存放文件的路径
mount d: d:\test\DOSBox\masm
# 出现msam,link文件为成功
cd d:
dir
  1. 汇编编译hello.asm(将数据转换为机器语言)
1
masm hello.asm
  • hello.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data SEGMENT                  ;定义数据段
msg DB 'Hello, xxy.8.$' ;定义一个字符串,以'$'结束
data ENDS ;定义数据段结束

code SEGMENT ;代码段定义开始
ASSUME CS:code,DS:data ;通知汇编程序,源程序中定义的组由对应的段寄存器进行段的寻址
start: ;整个程序开始
MOV AX,data ;获取段基址
MOV DS,AX ;实现段基址加载到寄存器DS
lea dx,msg ;将字符串地址送人DX中,同mov dx,offset str
mov ah,09h ;调用9号功能调用输出字符串
int 21h ;调用INT 21H的9号中断
MOV Ah,4Ch ;实现返回MOS-DOS窗口
INT 21h
code ENDS ;代码段结束
END start ;整个程序结束
1
2
3
4
5
6
7
8
9
10
11
12
code SEGMENT
ASSUME CS:code,DS:data
msg DB 'Hello, Mr.286.$'
start:MOV AX,data
MOV DS,AX
lea dx,msg
mov ah,9h
int 21h
MOV AX,4C00h
INT 21h
code ENDS
END start
  1. 汇编后生成hello.obj文件,进行链接生成hello.exe机器码文件(将机器码分配内存)
1
link hello.obj
  1. 执行hello.exe,查看结果
1
hello

7. 高级语言

7.1 概述

高级语言(High-level programming language)是一种独立于机器,面向过程或对象的语言。高级语言设计的程序必须经过“翻译”以后才能被机器执行。“翻译”的方法有两种,一种是解释,一种是编译。

7.2 功能

能够在任何平台上进行开发自己想要的任何功能

7.3 种类

  • 命令式语言

这种语言的语义基础是模拟“数据存储/数据操作”的图灵机可计算模型,Fortran、Pascal、Cobol、C、C++、Basic、Ada、Java、C# 等,各种脚本语言也被看作是此种类型

  • 函数式语言

这种语言的语义基础是基于数学函数概念的值映射的λ算子可计算模型,如 Lisp、Haskell、ML、Scheme 、F#

  • 逻辑式语言

这种语言的语义基础是基于一组已知规则的形式逻辑系统,如 Prolog

  • 面向对象语言

模块化,如 Smalltalk

7.4 组成

  1. 接口分析
  2. 寻址分析
  3. 位操作分析
  4. 任务支持分析
  5. 控制程序分析

7.5 C、C++语言执行流程

【预处理 hello.c-hello.s 将stdio.h内容加入】【汇编生成hello.o】【链接生成hello.exe】

7.6 Java编程hello

  1. 编写
  • Hello.java
1
2
3
4
5
6
package l.hello;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
  • MANIFEST.MF
1
2
3
4
5
Manifest-Version: 1.0  
Created-By: x
Main-Class: l.hello.Hello

//最后一行空白不能省略
  1. 编译Hello.class字节码文件
1
2
3
4
# -d . 将包名生成树结构
javac -d . Hello.java
# 帮助后面加
--help
  1. 打包
1
2
3
4
# 手动写MANIFEST.MF
jar cvfm hello.jar MANIFEST.MF ./l/hello/Hello.class
# 自动MANIFEST.MF
jar cvfe Hello.jar l.hello.Hello l/hello/Hello.class
  1. 执行 .jar 文件
1
java -jar hello.jar
  1. 执行war包
1
2
3
4
5
# 1. 把 war 文件放到 tomcat 的 webapps 文件夹中
# 2. --jar
java --jar 文件名.war
# 3. 修改端口
java -jar jenkins.war --httpPort=9999
  1. 反编译
1
2
3
4
5
6
7
8
9
10
# .class文件
javap ./l/hello/Hello.class
# jar包
# 1. jar后缀修改为zip,然后解压再通过javap
# 2. 利用集成开发工具或其他工具JGUI JD-GUI jad-gui vscode插件Decompiler
# 3. 通过java-decompiler.jar手动执行命令反编译整个jar包,在idea插件文件中可以找到plugins/java-decompiler/lib/java-decompiler.jar
# 确定反编译jar包位置 /d/java/jdk/lib/tools.jar
# 确定反编译后文件的输出位置,注意输出目录必须得事先存在,反编译过程不会自动创建,如果不存在就会报错目标目录不存在/d/test/
# # 引号里的就是反编译插件jar包,后面跟的是jar包执行主类,最后的是需要反编译的jar包以及输出目录,执行命令进行反编译
java -cp "./java-decompiler.jar" java -cp "./java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true ./hello.jar ./l

7.7 Java执行流程

  1. 编译:java源代码 java编译器(javac)生成字节码文件(.class)
  2. 类加载:类加载器把字节码文件通过加载、校验(文件格式验证、元数据验证、字节码验证、符号引用验证)、准备内存、转换解析(一般是序列化)和初始化(main方法)加载到虚拟机的方法区,现在也叫元数据
  3. 创建:通过new 或者反射将创建的对象存入堆中
  4. 链接:方法调用,执行引擎(相当于jvm的cpu)解释为机器码
  5. 执行:通过Java方法栈和本地方法栈从内存中获取指令、译码、执行
  6. 多线程:切换上下文
  7. 结束:存入寄存器,打印或者存储或堆回收

7.8 JVM

  1. 概述

JVM是一种仿真计算机硬件和软件的功能实现的指令系统

  1. 功能

在实际计算机上模拟各种java开发的功能

  1. 组成

一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。

  1. 种类

Sun Classic Vm 、Exact Vm 、Sun公司的HotspotBEA公司的JRockitIBM公司的J9 VM

8. 总结

从计算机的组成到语言的实现有了基本上的了解