# 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 ```