《汇编语言》第二章寄存器



《汇编语言》第二章:寄存器

📌 主要内容

本章从汇编语言中最基本的“寄存器”概念出发,系统介绍了 8086 CPU 的寄存器结构、物理地址的形成方式、段与偏移的关系以及代码段的基本运作机制。

重点包括:

  • 通用寄存器与段寄存器的功能和组成;
  • 数据在寄存器中的存储方式;
  • 汇编指令的作用与编码行为;
  • 段地址 × 16 + 偏移地址 = 物理地址的本质含义;
  • CS、IP、代码段与程序执行流程的关系。

🧠 笔记重点

2.1 通用寄存器
  • 8086 CPU 共有 4 个通用寄存器,每个 16 位:

    • AXBXCXDX
  • 每个通用寄存器可拆分为两个 8 位寄存器:

    • 例如:AX 可拆为 AH(高 8 位)和 AL(低 8 位)

    image-20250425084310693

  • 通用寄存器可用于存放数据、参与运算、访问内存地址等。

2.2 字在寄存器中的存储
  • 在 8086 结构中,一个字(16 位)是以两个字节表示的:
    • 低地址存低字节,称为小端模式
  • 示例:
    • AX = 1234H,在内存中为:34H(低地址)12H(高地址)
2.3 几条汇编指令
  • 常见数据传送与操作指令:
    • MOV AX, BX:将 BX 中的数据复制到 AX
    • ADD AX, 1:AX 加 1
    • SUB AX, BX:AX 减去 BX 的值
  • 指令的一般形式为:
    操作码 目的操作数, 源操作数
    
2.4 物理地址
  • CPU 实际访问的是物理地址,但程序中使用的是“段地址 + 偏移地址”
  • 8086 中地址总线为 20 位 ⇒ 2^20 = 1MB 地址空间
  • 段地址左移 4 位(即 ×16)后加上偏移地址 = 物理地址
  • 示例:
    • 段地址 = 1000H, 偏移地址 = 0010H
    • 物理地址 = 10000H + 10H = 10010H
2.5 16 位结构的 CPU
  • 8086 是 16 位 CPU ⇒ 内部数据总线为 16 位 ⇒ 一次可以传输 2 字节
  • 所有通用寄存器为 16 位
  • 指令操作的数据长度默认为 16 位,除非特别说明使用 8 位
2.6 8086CPU给出物理地址的方法
  • 利用段寄存器(如 CSDSSS 等)和偏移地址一起生成物理地址:
    物理地址 = 段寄存器值 × 16 + 偏移地址
    

image-20250425084541550

2.7 “段地址×16+偏移地址=物理地址”的本质含义
  • CPU 通过段寄存器得到段的起始地址(段地址左移 4 位)
  • 偏移地址指定在段内的偏移量
  • 本质上:段寄存器控制“访问哪一段内存”,偏移地址控制“访问该段内的哪个位置”
2.8 段的概念
  • 为了简化编程,将内存分为逻辑上的不同“段”
    • 代码段(CS):存放程序指令
    • 数据段(DS):存放变量、常量
    • 栈段(SS):支持子程序调用、临时数据保存
  • 每个段最多 64KB 大小(因为偏移地址是 16 位)
2.9 段寄存器
  • 8086 提供 4 个段寄存器:
    • CS(代码段)
    • DS(数据段)
    • SS(栈段)
    • ES(附加段)
  • 使用场景示例:
    • mov ax, [0] 默认从 DS:0000 读入内存数据
    • 若需访问 ES 段,可用 mov ax, es:[0]
2.10 CS 和 IP
  • CS(Code Segment):指定代码所在的段
  • IP(Instruction Pointer):指令偏移地址
  • 指令执行地址 = CS × 16 + IP
  • 示例:
    • CS = 0A00H, IP = 0010H ⇒ 执行指令地址为 0A010H
2.11 修改 CS、IP 的指令
  • 一般程序无法直接修改 CS 和 IP
  • 需通过控制转移指令间接实现,例如 JMPCALL
  • 示例:
    JMP 1234H
    
2.12 代码段
  • 程序指令必须放在代码段中,由 CS 寄存器指向
  • 执行过程中,CPU 使用 CS:IP 定位指令地址,逐条执行
  • 示例程序结构:
    assume cs:code
    
    code segment
        start:
            mov ax, 0000
    		add ax, 0123H
    		mov bx, ax
    		jmp bx
    code ends
    end start
    

💻 实验1:查看CPU和内存,用机器指令和汇编指令编程

  • 使用 DEBUG 查看内存内容、寄存器状态、反汇编指令:
    • R:查看寄存器
    • D:查看内存中的内容
    • U:反汇编查看指令
    • E:编辑内存内容
    • T:执行一条机器指令
    • A:以汇编指令的格式在内存中写入一条机器指令
  • 示例步骤:
    - debug
    - a 2000:0
      mov ax, 1
      add ax, ax
      jmp 2000:0003
    - RCS
    :2000
    - RIP
    : 0
    - t
    

✅ 检测点 2.1

(1)写出每条汇编指令执行后相关寄存器中的值

mov ax,62627	AX=F4A3H
mov ah,31h		AX=31A3H
mov al,23h		AX=3123H
add ax,ax		AX=6246H
mov bx,826CH	BX=826CH
mov cx,ax 		CX=6246H
mov ax,bx		AX=826CH
add ax,bx		AX=04D8H
mov al,bh		AX=0482H
mov ah,bl		AX=6C82H
add ah,ah		AX=D882H
add al,6		AX=D888H
add al,al		AX=D810H
mov ax,cx		AX=6246H

(2)只能使用目前学过的汇编指令,最多使用4条命令,编程计算2的4次方。

mov ax,2
add ax,ax
add ax,ax
add ax,ax

✅ 检测点 2.1

(1) 00010H 1000FH

(2) 1001H 2000H

✅ 检测点 2.3

(1) 四次

(2) 第一次读取mov ax,bx, 第二次读取sub ax,ax,第三次读取jmp ax,第四次执行jmp ax

(3) 假设CS=a,IP=b

​ 执行完mov ax,bx CS=a,IP=b+2 ,ax=bx

​ 执行完sub ax,ax CS=a,IP=b+4 ,ax=0

​ 执行完jmp ax CS=a,IP=b+6,ax=0

​ 最后执行jmp ax,此时IP=ax=0


🔍 拓展理解

  • 学会使用调试工具 DEBUG,掌握 CPU 寄存器与内存的关系;
  • 理解“段”结构是深入学习汇编语言与操作系统的关键;
  • 掌握“物理地址”的形成过程,有助于理解指针与存储机制。

📖 下一篇预告 | 第三章 寄存器(内存访问)

第三章 寄存器(内存访问)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值