0%

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

内存中的字

字单元:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。

第三章-寄存器(内存访问)-2025-10-22-19-28-23

  1. 20H
  2. 4E20H
  3. 12H
  4. 0012H
  5. 124EH

DS和[address]

DS—数据段寄存器:提供数据所在内存的段地址。
[address]:表示一个偏移地址为address的内存单元。

例:[1234H]指偏移地址为1234H的内存单元。

1
2
3
MOV BX, 1000H
MOV DS, BX
MOV AL, [0000H]

读取10000H地址数据写入AL

CS只能作为源操作数

判断下列指令是否正确,若错误,为什么?

  1. MOV CL,1000H :CL是 8 位寄存器,而1000H是 16 位立即数
  2. MOV AL,[1000H]:需确保DS已正确初始化
  3. MOV [BX],[SI]:8086 汇编不允许两个内存单元直接传送数据
  4. MOV AH,BH
  5. MOV AX,[SI]
  6. MOV 1234H,BX:目的操作数必须是寄存器或可寻址的内存单元,而1234H是立即数
  7. MOV CL,AX:CL是 8 位寄存器,AX是 16 位寄存器
  8. MOV CS,AX:不允许直接用MOV指令修改CS的值
  9. MOV DS,CS

字的传送

当向内存单元中存取数据时,若操作的为字节型数据则一次读写一个内存单元,若为字型数据则按低地址为低8位,高地址为高8位的原则存取数据

MOV、ADD、SUB指令

指令: 操作码+操作数

CPU提供的栈机制,PUSH,POP指令

PUSH OPPOP OP

执行PUSH、POP指令时,CPU如何找到要操作的位置?
CPU进行堆栈操作—SS:SP
SS—堆栈段寄存器:指定堆栈段的段地址
SP—堆栈指针寄存器:指向栈顶的偏移地址

任意时刻,SS:SP指向栈顶地址。

栈顶超界的问题

在8086CPU中没有预防栈超界的机制,所以程序员必须自己考虑,防止栈超界。

PUSH、POP指令

题目一

将10000H—1000FH这段空间当作栈,初始状态栈是空的,将AX,BX,DS中的数据入栈。

1
2
3
4
5
6
MOV AX,1000H
MOV SS,AX
MOV SP,0010H
PUSH AX
PUSH BX
PUSH DS

题目二

  1. 将10000H—1000FH这段空间当作栈,初始状态是空的;
  2. 设置AX=001AH,BX=001BH;
  3. 将AX,BX中的数据入栈;
  4. 然后将AX、BX清零;
  5. 从栈中恢复AX、BX原来的内容;
1
2
3
4
5
6
7
8
9
10
11
MOV AX,1000H
MOV SS,AX
MOV SP,0010H
MOV AX,001AH
MOV BX,001BH
PUSH AX
PUSH BX
MOV AX,0000H/SUB AX,AX
MOV BX,0000H/SUB BX,BX
POP BX
POP AX
  1. 将10000H—1000FH这段空间作栈,初始状态栈是空的
  2. 设置AX=002AH,BX=002BH;
  3. 利用栈,交换AX和BX中的数据。
1
2
3
4
5
6
7
8
MOV AX,1000H
MOV SS,AX
MOV SP,0010H
MOV AX,002AH
MOV BX,002BH
PUSH AX
MOV AX,BX
POP BX

题目三

如果要将10000H处写入字型数据2266H,可以用以下指令完成:

1
2
3
4
MOV     AX,1000H
MOV DS,AX
MOV AX,2266H
MOV [0],AX

补全下面的代码,使它能够完成同样的功能:

1
2
3
4
5
————————
————————
————————
MOV AX,2266H
PUSH AX
1
2
3
4
5
MOV AX,1000H
MOV SS, AX
MOV SP, 0002H
MOV AX,2266H
PUSH AX

栈段

分析:如果我们将10000H—1FFFFH这段空间作栈段,初始状态栈是空的,此时SS=1000H,SP=?一个栈段最大可以设为多少?

SP=0000H,栈段216字节