note/程序开发/编程语言/汇编/汇编语言.md
2023-08-08 18:22:43 +08:00

199 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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