4.3 KiB
4.3 KiB
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个元素地址
程序数据
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
算术逻辑单元,核心计算单元,电路实现了基础运算的程序功能
指令实例
接口
mov dest,src ;dest ← src
mov al,[bx+si+6] ;指令功能:AL←[BX+SI+6]
;[取地址存储的数据]
函数调用
;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