寄存器(内存访问)
内存中字的存储
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