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

4.3 KiB
Raw Blame History

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