note/程序开发/编程语言/汇编/汇编语言.md

199 lines
4.3 KiB
Markdown
Raw Normal View History

2023-08-08 18:22:43 +08:00
# 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
```