目录
  1. 1. 寄存器(内存访问)
    1. 1.1. 内存中字的存储
    2. 1.2. DS和[address]
    3. 1.3. 字的传送
      1. 1.3.1. 问题1
      2. 1.3.2. 问题2
      3. 1.3.3. 问题3
    4. 1.4. 检测点3.1
    5. 1.5. CPU提供的栈机制
      1. 1.5.1. 问题1
      2. 1.5.2. 问题2
      3. 1.5.3. 问题3
寄存器(内存访问)

寄存器(内存访问)

内存中字的存储


DS和[address]

  • 8086CPU中有一个DS寄存器,通常用来存放要访问数据的地址段
  • [address]表示一个内存单元,address表示内存单元的偏移地址

如果要读取10000H单元的内容,可以用如下的程序段进行

mov bx,1000H
mov ds,bx
mov al,[0]

上面的3条指令将10000H(1000:0)中的数据读到al中

字的传送

mov bx,1000H
mov ds,bx
mov ax,[0]        ;1000:0处的数据送入ax
mov [0],cx        ;cx中的16位数据送到1000:0处

问题1

问题2


问题3

检测点3.1

(1)在Debug 中,用”d 0:0 1f” 查看内存,结果如下:

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完毕后相关寄存器中的值:

Mov ax,1
Mov ds,ax
Mov ax,[0000]       AX=2662
Mov bx,[0001]       BX=E626
Mov ax,bx           AX=E626
Mov ax,[0000]       AX=2662
Mov bx,[0002]       BX=D6E6
Add ax,bx           AX=FD48
Add ax,[0004]       AX=2C14
Mov ax,0            AX=0
Mov al,[0002]       AX=00E6
Mov bx,0            BX=0
Mov bl,[000C]       BX=0026
Add al,bl           AX=000C

(2)

mov ax,6622H        CS=2000H IP=0002H
jmp 0ff0:0100       CS=0ff0H IP=0100H  物理地址=CS*16+IP=10000H
mov ax,2000H        CS=0ff0H IP=0103H
mov ds,ax           CS=0ff0H IP=0105H
mov ax,[0008]       CS=0ff0H IP=0108H
mov ax,[0002]       CS=0ff0H Ip=010BH

第一步:CS=2000H,IP=0H 地址:20000H

读取第一条指令 mov ax,6622H

CS=2000H, IP=03H

执行指令 mov ax,6622H

执行结果:AX=6622H

第二步:地址:20003H

读取第二条指令 jmp 0ff0:0100

CS=2000H,IP=03H

执行指令:jmp 0ff0:0100

执行结果:CS=0ff0H, IP=0100H

第三步:地址:CSx16+IP = 10000H

读取指令:mov ax,2000H

CS=0ff0H, IP=0103H

执行指令:mov ax,2000H

执行结果:AX=2000H

第四步:地址:10003H

读取指令:mov ds,ax

CS=0ff0H, IP=0105H

执行指令:mov ds,ax

  执行结果:ds=2000H

第五步:地址:10005H

读取指令:mov ax,[0008]

CS=0ff0H,IP=10008H,DS=2000H

执行指令:mov ax,[0008] ;

也就是将地址【DS:IP】为 2000H:0008H的值移动到AX

执行结果:AX=C189H

第六步:读取指令:mov ax,[0002]

CS=0ff0H ,IP=1000BH,DS=2000H

执行指令:mov ax,[0002]

执行结果:AX=EA66

知识点:

任意时刻SS:SP 指向栈顶元素。

push指令和pop指令执行时,CPU从 SS和SP中得到栈顶的地址。

注:SS(Stack Segmet)堆栈段寄存器,指向当前的堆栈段。

SP(Stack Pointer)堆栈指针寄存器,主要用于堆栈操作,存放堆栈段首地

址到栈顶单元的偏移量。

入栈时:886CPU栈顶从高地址向低地址方向增长。

CPU提供的栈机制

CS、IP中存放着当前指令的段地址和偏移地址,而段寄存器SS和寄存器SP为CPU的入栈,出栈服务。任意时刻SS:SP指向栈顶元素。

问题1

如果将10000H~1000Fh这段空间当作栈,初始空间是空的,此时,SS=1000H,SP=0010H

问题2

利用栈,交换AX和BX中的数据

mov ax,1000H
mov ss,ax
mov sp,0010H         ;初始化栈顶
mov ax=001AH
mov bx=001BH
push ax
push bx
pop ax               ;当前栈顶的数据是bx中的欲来的数据,所以先pop ax,即ax=001BH
pop bx               ;执行pop ax后,栈顶的数据为ax原来的数据,所以再pop bx,即bx=001AH

问题3

利用栈在10000H处写入数据2266H

mov ax,1000H
mov ss,ax
mov sp,0002H
mov ax,2266H
push ax

一般写法

mov ax,1000H
mov ds,ax
mov ax,2266H
mov [0],ax

文章作者: nocbtm
文章链接: https://nocbtm.github.io/2018/09/08/寄存器(内存访问)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nocbtm's Blog
打赏
  • 微信
  • 支付宝