199 lines
4.3 KiB
Markdown
199 lines
4.3 KiB
Markdown
# CPU架构
|
||
|
||
## 总线接口单元
|
||
|
||
实现指令的读取功能
|
||
|
||
实现数据的读取写入功能
|
||
|
||
### 数据总线
|
||
|
||
字节编址:`1Byte = 8Bit`
|
||
|
||
总线编码: 20Bit,支持1MB的存储大小
|
||
|
||
寄存器:16Bit,仅能描述64KB大小
|
||
|
||
基寄存器 * 16 + 偏移寄存器 = 总线地址
|
||
|
||
### 段寄存器
|
||
|
||
1MB的空间分段,每段大小不超过64KB,段地址即16位寄存器地址 * 16
|
||
|
||
程序多次运行,变化的是段寄存器,逻辑地址保持不变
|
||
|
||
段之间可以分开也可以重合,取决于数据如何存储
|
||
|
||
- CS
|
||
- 存放指令的代码段地址
|
||
- DS
|
||
- 存放数据的数据段地址
|
||
- SS
|
||
- 程序堆栈段地址
|
||
- ES
|
||
- 附加段寄存器
|
||
- IP
|
||
- 专用寄存器,指令偏移地址
|
||
- 仅由跳转类指令间接控制
|
||
|
||
- 内部寄存器
|
||
|
||
### 指令队列
|
||
|
||
六字节,先进先出,跳转时刷新整个队列
|
||
|
||
## 执行单元
|
||
|
||
对指令进行译码,并执行
|
||
|
||
### 通用寄存器
|
||
|
||
寄存器描述的地址都是偏移地址,每次运行的偏移地址保持不变
|
||
|
||
- AH + AL = AX
|
||
- 累加器
|
||
- BH + BL = BX
|
||
- 基址寄存器
|
||
- CH + CL = CX
|
||
- 计数器
|
||
- DH + DL = DX
|
||
- 数据寄存器
|
||
- SP
|
||
- 堆栈指针寄存器
|
||
- 会受到指令控制,不应用于其他目的
|
||
- BP
|
||
- 基址指针寄存器
|
||
- SI
|
||
- 源变址寄存器
|
||
- 如字符串首地址
|
||
- DI
|
||
- 目的变址寄存器
|
||
- 如字符串第n个元素地址
|
||
|
||
# 程序数据
|
||
|
||
```assembly
|
||
assume cs:code, ds:data, ss:stack ;定义了三个段 code,data,stack 只是为了阅读的方便,用其他的名称是一样的。
|
||
|
||
data segment
|
||
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
|
||
data ends
|
||
|
||
stack segment
|
||
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
stack ends
|
||
|
||
code segment
|
||
start: mov ax,stack # stack 段的首地址
|
||
mov ss,ax
|
||
mov sp, 20h;
|
||
|
||
mov ax, data ;
|
||
mov ds, ax; ds指向data 段的首地址
|
||
|
||
mov bx,0
|
||
mov cx, 8
|
||
|
||
s: push [bx]
|
||
add bx, 2
|
||
loop s ;以上将data段中的0~15单元中的8个字型 数据一次入栈
|
||
|
||
mov bx,0
|
||
mov cx,8
|
||
s0: pop [bx]
|
||
add bx,2
|
||
loop s0; 出栈,把数据放回到data段。 如此就把数据逆序了。
|
||
mov ax, 4c00h
|
||
int 21h ;中断调用操作系统子程序
|
||
code ends
|
||
|
||
end start
|
||
|
||
```
|
||
|
||
|
||
|
||
## 代码段
|
||
|
||
代码数据
|
||
|
||
## 数据段
|
||
|
||
程序数据
|
||
|
||
## 堆栈段
|
||
|
||
### 标志寄存器
|
||
|
||
ALU计算标志,中断、出错等
|
||
|
||
状态标志
|
||
|
||
- 进位标志CF
|
||
- 奇偶标志PF
|
||
- 调整标志AF
|
||
- 零标志ZF
|
||
|
||
- 符号标志SF
|
||
- 溢出标志OF
|
||
|
||
控制标志
|
||
|
||
- 方向标志DF
|
||
- 中断标志IF
|
||
- 单步标志TF
|
||
|
||
### ALU
|
||
|
||
算术逻辑单元,核心计算单元,电路实现了基础运算的程序功能
|
||
|
||
# 指令实例
|
||
|
||
## 接口
|
||
|
||
```assembly
|
||
mov dest,src ;dest ← src
|
||
mov al,[bx+si+6] ;指令功能:AL←[BX+SI+6]
|
||
;[取地址存储的数据]
|
||
|
||
```
|
||
|
||
|
||
|
||
## 函数调用
|
||
|
||
```assembly
|
||
;lea 取函数地址到rax寄存器
|
||
lea rax,[TPoint::`vcall'{0}' (07FF6C97EC00Eh)]
|
||
TPoint::TestStaticFunction();
|
||
00007FF61BAC9A32 call TPoint::TestStaticFunction (07FF61B95BEF1h)
|
||
00007FF61B95BEF1 jmp TPoint::TestStaticFunction (07FF61B9A2900h)
|
||
00007FF61B9A2900 mov eax,dword ptr [TPoint::static_int_a (07FF61BB21BA0h)]
|
||
|
||
00007FF765B1E5AF call TPoint::Testvirtual (07FF765B068CFh)
|
||
00007FF765B068CF jmp TPoint::Testvirtual (07FF765B529E0h)
|
||
FuncPointer fp1 = &TPoint::Testvirtual;
|
||
00007FF765B1E5B4 lea rax,[TPoint::`vcall'{0}' (07FF765B06663h)]
|
||
FuncPointer fp2 = &TPoint::Testvirtua2;
|
||
00007FF765B1E5C3 lea rax,[TPoint::`vcall'{8}' (07FF765B0600Fh)]
|
||
|
||
0x00007ff765c8fa88 {zplus.exe!void(* TPoint::`vftable'[3])()} {
|
||
0x00007ff765b068cf {zplus.exe!TPoint::Testvirtual(void)},
|
||
0x00007ff765b07581}
|
||
```
|
||
|
||
|
||
|
||
# 编译
|
||
|
||
```
|
||
cl.exe -c -nologo /EHsc -Fobuild\.objs\zasm\windows\x64\release\src\main.cpp.obj src\main.cpp
|
||
link.exe -nologo -dynamicbase -nxcompat -machine:x64 -out:build\zasm.exe
|
||
|
||
[ 25%]: compiling.release src\main.cpp
|
||
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.36.32532\\bin\\HostX64\\x64\\cl.exe" -c -nologo /EHsc -Fobuild\.objs\zasm\windows\x64\release\src\main.cpp.obj src\main.cpp
|
||
[ 50%]: linking.release zasm.exe
|
||
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.36.32532\\bin\\HostX64\\x64\\link.exe" -nologo -dynamicbase -nxcompat -machine:x64 -out:build\windows\x64\release\zasm.exe build\.objs\zasm\windows\x64\release\src\main.cpp.obj
|
||
```
|
||
|