汇编语言-王爽著学习心得 第二天

第二章 寄存器

8086CPU共有14个寄存器,它们都是16位:
AX、BX、CX、DX、
SI、DI、
SP、BP、IP、
CS、SD、SS、ES、
PSW

2.1 通用寄存器

AX (Accumulator):累加寄存器
BX (Base):基地址寄存器
CX (Count):计数器寄存器
DX (Data):数据寄存器
这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
这里写图片描述

为了兼容上一代8位的CPU,这4个寄存器都可以拆分为两个独立的8位寄存器使用:
AX 可拆分为 AH 和 AL
BX 可拆分为 BH 和 BL
CX 可拆分为 CH 和 CL
DX 可拆分为 DH 和 DL
这里写图片描述

2.2 字在存储器中的存储

一个字由两个字节组成,可以存放在一个16位的寄存器中。高字节存放在高位,低字节存放在低位。
例如: 数字 20000 = 4E20H = 0100 1110 0010 0000B 想存放在AX中
高8位 4E 存放在 AH 中, 低8位 20 存放在 AL 中
这里写图片描述

2.3 几条汇编指令

汇编指令 控制CPU完成的操作 用高级语言的语法描述
mov ax, 18 将18送入寄存器AX AX=18
mov ah, 78 将78送入寄存器AH AH=78
add ax, 8 将寄存器AX中的数据加上8 AX=AX+8
mov ax, bx 将寄存器BX中的数据送入AX AX=BX
add ax, bx 将AX和BX中的数据相加,结果存入AX中 AX=AX+BX

分析题:

程序段中的指令 执行指令后AX中的数据 执行指令后BX中的数据
mov ax, 001AH 001AH 0000H
mov bx, 0026H 001AH 0026H
add al, bl 0040H 0026H
add ah, bl 2640H 0026H
add bh, al 2640H 4026H
mov ah, 0 0040H 4026H
add al, 85H 00C5H 4026H
add al, 93H ? 4026H

结果 AX = 0058H

2.4 物理地址

CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的物理地址与之对应。

2.5 16位结构的CPU

  • 运算器一次最多可以处理16位的数据

  • 寄存器的最大宽度为16位

  • 寄存器和运算器之间的通路为16位

2.6 8086CPU给出物理地址的方法

物理地址 = 段地址 x 16 + 偏移地址
例如:CPU 想要访问123C8H的内存单元
方法有无数种,可以 123C8H = 1230H x 16 + 00C8, 也可以 123C8H = 11A5H x 16 + 0978H
但是选择一种适合自己的,能简化程序逻辑

2.7 “段地址 x 16 + 偏移地址 = 物理地址” 的本质含义

用这个方法合成物理地址也是没有办法中的办法,也算是IBM大叔们智慧的结晶,毕竟想要一个123C8H的地址,直接给 AX = 123C8H 多方便。
CPU的进化比内存慢许多。直到现在CPU才到64位,而内存已经可以到16G了。当时CPU 寄存器最大才16位,能访问的最大内存也只有0~FFFFH(64K),而内存已经发展到了1M。如果找不到解决办法,不仅造成内存极大的浪费,而且严重阻碍计算机行业的发展。
所以 “段地址 x 16 + 偏移地址 = 物理地址” 的方式应运而生。FFFF x 16 + FFFF = 10FFEF ≈ 1.06M

2.8 段的概念

段是我们根据编程需要,人为的把内存假象成若干个段。用 段地址 x 16 + 偏移地址 = 物理地址 的方式定位内存单元。内存的物理地址依然是连续的。

  • 段地址 x 16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数

  • 偏移地址为16位,16的寻址能力是64K,所以一个段的最大长度为64K

2.9 段寄存器

8086CPU有4个段寄存器:
CS (Accumulator):代码段寄存器
DS (Base):数据段寄存器
SS (Count):堆栈段寄存器
ES (Data):扩展段寄存器

说到段寄存器,很自然的就会想到偏移地址。因为把它们分开了一点用的没有。
CS 与之 对应的 偏移地址 只能用 IP 寄存器
SS 与之 对应的 偏移地址 只能用 SP 寄存器
至于DS、ES能与之搭配使用的就多了

2.10 CS 和 IP

CS 指向 代码段地址
IP 指向 代码段偏移地址
CS:IP 指向CPU将要执行的下一条指令。这个功能只能由CS:IP提供,而且CS:IP也提供不了别的功能
这里写图片描述

2.11 修改CS、 IP的指令

只有2中方法:

1、jmp

  • 仅修改IP, “jmp 某一合法寄存器”
    例如 jmp ax
    执行前 ax = 1000H, CS = 2000H, CS = 0003H
    执行后 ax = 1000H, CS = 2000H, CS = 1000H

  • 同时修改CS、IP,“jmp 段地址:偏移地址”
    例如 jmp 2AE3:3
    执行后 CPU 将从 2AE33H 处读取指令

  • 不能只修改CS

2、pop

  • 仅修改IP
    push ax
    pop IP
    执行后 IP = ax

  • 修改CS、IP
    push ax
    push ax
    pop CS
    pop IP
    执行后 CS = ax,IP = ax

  • 仅修改CS
    push ax
    pop CS
    可以这么操作,但是没有意义。因为谁也不能保证换了一个代码段以后CS:IP依然有效。

2.12 代码段

假设一段代码
mov ax, 0000    (B8 00 00)
add ax, 0123     (05 23 01)
mov bx, ax        (8B D8)
jmp bx                  (FF E3)
存放在 123B0H ~ 123B9H 这9个字节中,该怎么执行这段代码?
只需要将CS:IP 指向 123B0H 即可

猜你喜欢

转载自blog.csdn.net/wanyongtai/article/details/79955404
今日推荐