第三章 寄存器(内存访问)
3.1 内存中字的存储
内存中用两个连续的内存单元存放一个字,低内存地址存放低8位,高内存地址存放高8位
3.2 DS和[address]
内存段地址使用DS
寄存器保存,基地址采用[0]
这样的方式代表
3.3 字的传送
CPU将字写到内存时,低8位在写入内存的起始地址,高8位写入下一个地址
CPU读取内存是,默认读取一个字
3.4 mov、add、sub指令
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 寄存器,段寄存器
mov 内存单元,寄存器
mov 内存单元,段寄存器
mov 段寄存器,寄存器
mov 段寄存器,内存单元
3.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=(2662H) 解析:此时访问的内存地址为1:0
等同于0:10
mov bx,[0001]
BX=(E626H)mov ax,bx
AX =(E626H)mov ax,[0000]
AX=(2662H)mov bx,[0002]
BX=(D6E6H)add ax,bx
AX=(FD48H)add ax,[0004]
AX=(2C14H)mov ax,0
AX=(0)mov al,[0002]
AX=(00E6H)mov bx,0
BX=(0)mov bl,[000C]
BX=(0026H)add al,bl
AX=(000CH)
-
答:程序和数据没有区别,本质上都是二进制码,关键在于CPU如何解读
mov ax,6622H
cs=2000H ip=0003H ax=6622Hjmp 0FF0:0100
cs=0FF0H ip=0100Hmov ax,2000H
cs=0FF0H ip=0103H ax=2000Hmov ds,ax
cs=0FF0H ip=0105H ds=2000Hmov ax,[0008]
cs=0FF0H ip=0108H ax=c389Hmov ax,[0002]
cs=0FF0H ip=010BH ax=EA66H
3.6 栈
后进先出
3.7 CPU提供的栈机制
- 指令:
PUSH
(入栈),POP
(出栈)push/pop 寄存器
push/pop 段寄存器
push/pop 内存单元
- 栈相关的寄存器:段寄存器
SS
,偏移地址寄存器SP
,任意时刻,SS:SP
指向栈顶元素 - 栈为空时,
SS:SP
指向大的内存地址,入栈时,SP-2
3.8 栈顶超界问题
- 栈顶超界的问题需要我们自己处理,CPU没有提供相关机制
3.9 push、pop指令
- push 先将
SP-2
在向SS:SP
的字单元中送入数据 - pop 先从
SS:SP
指向的字单元中读取数据,在SP+2
3.10 栈段
- 将栈的大小定义为64KB,得到一个环绕的栈
- 对于数据段,将它的段地址放在
DS
中 - 对于代码段,将他的段地址放在
CS
中 - 对于栈段,将他的段地址放在
SS
中
3.2 检测点
mov ax,1000H
mov ds,ax
- (add ax,ax)
- (mov ss,ax)
- (mov sp,10H)
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
- 补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~2000FH中
mov ax,2000H
mov ds,ax
- mov ax,1000H
- mov ss,1000H
- mov sp:0H
pop [E]
pop [C]
...
3.3 实验2 用机器指令会汇编指令编程
- Debug的t命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行