内存中字的存储
CPU中用16位(2bytes)进行存储字,16位分为高8位和低8位。
例如:
- 0 20H
- 1 4EH
- 2 12H
- 3 00H
0地址单元中存放的
字节型
的数据是: 20H
0地址单元中存放的
字型
的数据是: 4E20H(字型是两个字节)
2地址单元中存放的
字型
的数据是: 0012H(注意00是高八位,12是低八位)
DS和[address]
DS与CS类似,同样也是一个段寄存器,功能是存放需要读取的数据的端寄存器。
我们知道内存地址由段地址和偏移地址构成,例如我们需要读取10000H的内容,就需要段地址1000H和偏移地址0来进行访问
mov bx,1000H
mov ds,bx
mov al,[0]
第三行中的[0]就代表偏移地址,那么段地址呢?其实默认他会取ds寄存器中的数据作为段地址,因此我们在读取内存中的数据的时候就需要提前设定好段地址放在DS中。
那么为什么要分两步将地址存放到DS中呢,因为8086CPU不支持
将数据直接送入到DS中
,但是可以将另一个寄存器的内容转移到DS中,因此我们可以从bx进行中转数据。
样例:将al中的数据送入内存单元10000H中。
mov bx,1000H
mov ds,bx #将bx作为中转的寄存器
mov [0], al
字的传送
由上文中我们可以知道,一个字的组成是由两个字节组成的,内存单元中一个单位就是一个字节。
样例:已知内存情况如下,请说明执行结束后的ax, bx, cx的值
10000H 23
10001H 11
10002H 22
10003H 66
-
mov ax, 1000H ->此时ax中的值为1000H
-
mov ds, ax ->将ax中的数据转移到ds中,此时ds为1000H
-
mov ax,[0] ->将内存中的1000:0开始的内容填充到ax寄存器中 值为
ax=1123H
-
mov bx,[2] ->同上,将内存中1000:2开头的内容填充到bx中 值为
bx=6622H
-
add cx,[1] ->同上,
cx=2211H
mov add sub 指令
在基本的类型中注意不能的类型
-
不能实现mov 内存单元,内存单元
-
不能实现add ds,ax
-
不能实现mov 段寄存器,数据
样例:请写指令,累加数据段(123B)的前三个
字型数据
mov ax,123BH
mov ds,ax //将内存段ds设置为ax中存储的内容123B
mov ax,0
add ax,[0]
add ax,[2]
add ax,[4]
总结
- 字在内存中进行存储的时候用两个
连续的内存单元
来进行存放,低位放在低位,高位放在高位- 【address】表示偏移地址为address的内存单元,此时段地址取ds中的数据
- mov, add, sub是具有两个操作对象的指令,jmp是具有一个操作对象的指令
- 当将数据进行相加如果超出了范围,那么超过的范围的字段直接舍弃掉
栈(FILO)
在CPU中的栈机制:
- push ax 表示将寄存器ax中的数据送入到栈中(将数据送到栈内)
- pop ax 表示将从栈顶取出来的数据送入到ax中(将栈顶的数据拿出来)
-
8086CPU的入栈和出栈操作的基本单位都是
字
- 由于基本单位是字,所以一定要注意高位和低位的区别
Q:我们怎么确定那一段是栈呢?我们在push和pop的时候,怎么确定栈顶呢?
A: 其实如同CS:IP代表下一次需要执行的内存的位置,栈也有SS和SP来进行表示栈的位置,其中
在任意
时刻,SS:SP指向栈顶的元素
因此push和pop命令执行之后,栈顶元素会发生改变。
push:
- SP=SP-2 SP指向当前栈顶元素的单元
- 入栈时候,栈顶元素由高地址方向朝着低地址方向增长
例题:如果将10000H~1000FH作为栈,初始栈的状态是空的,SS = 1000H,那么SP=?
谨记一点,SS:SP一直是指向栈顶元素,那么这个栈的栈底是1000F,而栈是空的,不存在栈顶元素,那么只能指向栈底元素的下一个单元了,SS:SP = 10010
因此SP=10H
pop
:
原理就是跟push向反,得到的栈顶元素会填充到你的目标寄存器中
问题1:将10000H~1000FH作为栈,初始栈的状态是空的,将AX,BX,DS中的数据入栈
mov ax,1000
mov ss,ax
mov sp,0010H #栈的空间到1000F 但是栈顶元素应该是这个单位加上1(因为初始栈为空)
push ax
push bx
push dx
例题2:将10000H~1000FH这段空间看做是栈,初始状态为空
设置Ax = 001AH , BX = 001BH
利用栈,交换AX与BX中的数据
mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH
push ax
push bx //此时栈顶到栈底分别为bx ax
pop ax //将栈顶字 bx放置到ax中
pop bx //将栈顶字 ax放置到bx中
总结cs、ss、ds
- CS:IP 代码段
- SS:SP 栈段
- DS:IP 数据段
实验二:用机器指令和汇编指令编程