BY eHWRITTEN ON HALO6 MIN READ

汇编补课

汇编补课 一、汇编语言的底层原理 汇编语言直接与计算机硬件打交道,理解它就要理解计算机内部的工作原理。这些原理包括 CPU 的指令集、内存、寄存器、堆栈、I/O 操作等。 1. CPU 工作原理 CPU(中央处理器)是计算机的大脑,它从内存中获取指令(执行指令集),并对寄存器中的数据进行操作。每条汇

汇编补课

一、汇编语言的底层原理

汇编语言直接与计算机硬件打交道,理解它就要理解计算机内部的工作原理。这些原理包括 CPU 的指令集、内存、寄存器、堆栈、I/O 操作等。

1. CPU 工作原理

  • CPU(中央处理器)是计算机的大脑,它从内存中获取指令(执行指令集),并对寄存器中的数据进行操作。每条汇编指令都对应着一个机器码操作(操作码)。
  • CPU 执行指令时,利用 寄存器 来存储数据。寄存器是 CPU 内部的高速缓存,速度远快于内存。

2. 寄存器的作用

寄存器是 CPU 内部用于临时存储数据的位置。常见的寄存器有:

  • 数据寄存器(例如 AX, BX, CX, DX
  • 指令指针IP,指向当前执行的指令地址)
  • 栈指针SP,指向当前栈顶)
  • 基指针BP,通常用于栈帧管理)

二、汇编语言指令和操作

汇编语言的指令与机器语言指令之间一一对应。常见的汇编指令包括 MOVADDSUBJMPCMP 等。

1. 数据传送指令(MOV)

MOV 用于将数据从一个位置传送到另一个位置。在大多数情况下,它用于将数据从内存、寄存器或常数传送到寄存器中。

MOV AX, 10        ; 将值 10 存入 AX 寄存器
MOV BX, AX        ; 将 AX 的值复制到 BX 寄存器
MOV [1000h], AX   ; 将 AX 寄存器的值存入内存地址 1000h

2. 算术运算指令(ADD、SUB)

这些指令用于对寄存器中的数据进行加法或减法操作。

ADD AX, BX        ; AX = AX + BX
SUB AX, 5         ; AX = AX - 5

3. 逻辑运算指令(AND、OR、XOR)

这些指令执行逻辑运算,例如与(AND)、或(OR)、异或(XOR)。

AND AX, BX        ; AX = AX & BX(按位与)
OR AX, 1          ; AX = AX | 1  (按位或)
XOR AX, BX        ; AX = AX ^ BX (按位异或)

4. 比较与跳转指令(CMP、JMP、JE、JNE)

CMP 比较两个值并设置 CPU 标志寄存器。JMP 是跳转指令,基于标志寄存器的状态可以进行条件跳转(JE:如果相等,跳转;JNE:如果不等,跳转)。

CMP AX, BX        ; 比较 AX 和 BX
JE equal_label    ; 如果 AX == BX,跳转到 equal_label
JMP loop_start    ; 无条件跳转到 loop_start

5. 栈操作指令(PUSH、POP)

栈是用于存储函数调用时的局部变量和返回地址的内存区域。PUSH 将数据压入栈中,POP 将栈顶数据弹出。

PUSH AX           ; 将 AX 的值压入栈中
POP BX            ; 将栈顶的数据弹出并存入 BX

三、汇编与 MBR 编程

1. MBR(主引导记录)

MBR 是硬盘的第一个扇区,大小为 512 字节。MBR 存储了操作系统启动所需的引导程序。引导程序通常用汇编语言编写,它负责加载操作系统内核。

  • MBR 的结构
    1. 引导代码:通常位于前 446 字节,执行启动操作。
    2. 分区表:接下来的 64 字节,定义了硬盘的分区信息。
    3. 引导扇区标识符:最后 2 字节为 0x55AA,用于标识该扇区为有效的引导扇区。

2. MBR 汇编代码示例

以下是一个简单的 MBR 引导程序,它将显示一条消息并跳转到操作系统的内核。

; MBR 程序
; 假设该 MBR 文件的大小为 512 字节

; 打印 "Booting..." 消息
MOV AH, 0x0E      ; 设置为字符输出模式
MOV AL, 'B'       ; 输出字符 'B'
INT 0x10          ; BIOS 中断,输出字符
MOV AL, 'o'       ; 输出字符 'o'
INT 0x10
MOV AL, 'o'       ; 输出字符 'o'
INT 0x10
MOV AL, 't'       ; 输出字符 't'
INT 0x10
MOV AL, 'i'       ; 输出字符 'i'
INT 0x10
MOV AL, 'n'       ; 输出字符 'n'
INT 0x10
MOV AL, 'g'       ; 输出字符 'g'
INT 0x10
MOV AL, '.'       ; 输出字符 '.'
INT 0x10

; 跳转到操作系统内核
JMP 0x1000        ; 跳转到内核代码的起始位置

; MBR 结束,必须确保最后两个字节为 0x55AA,表示有效的引导扇区
TIMES 510-($-$$) DB 0  ; 填充到 510 字节
DW 0xAA55              ; 引导扇区标识符

3. MBR 的工作过程

  • 当计算机启动时,BIOS 将从硬盘的第一个扇区加载 MBR。
  • MBR 中的引导代码开始执行,显示启动信息(如 “Booting…”)。
  • 然后,MBR 将控制权转移到操作系统的引导加载程序。通常,操作系统内核会被加载到内存中并启动。

补充对照表

明白了!你需要一个更加详细的汇编语言知识补充,包括寄存器、位运算、指令符号的使用,以及类似于 C 语言结构体的符号用法。我将从基础开始,逐步扩展这些知识,确保你能够理解和使用它们。

在汇编语言中,寄存器是 CPU 内部用于存储数据的高速存储位置。不同的寄存器在不同的处理器架构中有不同的作用。

1. 通用寄存器(General-purpose Registers)

寄存器名称 英文名称 说明
AX Accumulator 累加器,通常用于算术运算
BX Base Register 基址寄存器,常用于数据存储的基地址
CX Count Register 计数寄存器,通常用于循环计数和字符串操作
DX Data Register 数据寄存器,通常用于 I/O 操作
SI Source Index 源索引寄存器,通常用于字符串操作
DI Destination Index 目标索引寄存器,通常用于字符串操作
SP Stack Pointer 栈指针寄存器,指向栈顶
BP Base Pointer 基指针寄存器,通常用于栈帧
SI Source Index 源地址寄存器,用于字符串或数组的操作
DI Destination Index 目标地址寄存器,用于字符串或数组的操作

2. 段寄存器(Segment Registers)

段寄存器用于管理内存分段,它们在段式内存管理中起着至关重要的作用。

寄存器名称 英文名称 说明
CS Code Segment 代码段寄存器,指向当前执行的代码段
DS Data Segment 数据段寄存器,指向数据存储区域
SS Stack Segment 栈段寄存器,指向栈区域
ES Extra Segment 扩展段寄存器,通常用于额外的数据存储
FS FS Segment 用于某些特定的内存操作(如线程栈)
GS GS Segment 用于某些特定的内存操作(如线程栈)

3. 标志寄存器(Flags Register)

标志寄存器包含一些表示运算结果状态的标志位,常见的标志有:

标志位 英文名称 说明
ZF Zero Flag 如果操作结果为零,则设置此标志
CF Carry Flag 如果运算有进位或借位,则设置此标志
SF Sign Flag 如果结果为负,则设置此标志
OF Overflow Flag 如果算术运算溢出,则设置此标志
PF Parity Flag 如果结果的低 8 位包含偶数个 1,则设置此标志
DF Direction Flag 用于控制字符串操作的方向(递增或递减)
AF Auxiliary Flag 辅助进位标志,常用于 BCD 算术操作