–
一、DS
CPU要读写一个内存单元时,必须要先给出这个内存单元的地址,在8086中,内存地址由段地址和偏移地址组成。8086中有一个DS段寄存器,通常用来存放要访问数据的段地址。
1 | mov bx,1000H |
上面3条指令的作用是将10000H(1000:0)中的内存数据赋值到al寄存器中。mov al,[address]
的意思是将DS:address
中的内存数据赋值到al寄存器中,由于al是8位寄存器,所以是将一个字节的数据赋值给al寄存器。
注意:8086不支持将数据直接送入段寄存器中,
mov ds,1000H
是错误的。所有一般都是先把内存中数据放到通用寄存器中,然后把通用寄存器中的值放到段寄存器中。
下面的指令是将al中的数据送入内存单元1000H中。
1 | mov bx,1000H |
下面的指令执行后寄存器ax、bx、cx中的值变化:
1.1. 大小端
大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中(高低\低高) (Big Endian)。
小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高\低低) (Little Endian)。
大端模式常用架构:PowerPC、IBM、Sun。
小端模式常用架构:x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。
1.2. mov
注意:
mov 内存单元, 内存单元
是不允许的,比如mov [0], [1]
。
1.3. add、sub
二、栈
栈是一种具有特殊的访问方式的存储空间(后进先出, Last In Out Firt,缩写:LIFO)。
- 8086会将CS作为代码段的段地址,将CS:IP指向的指令作为下一条需要取出执行的指令。
- 8086会将DS作为数据段的段地址,
mov ax,[address]
就是取出DS:address的内存数据放到ax寄存器中。 - 8086会将SS作为栈段的段地址,任意时刻,SS:SP指向栈顶元素。
- 8086提供了PUSH(入栈)和POP (出栈)指令来操作栈段的数据,比如
push ax
是将ax的数据入栈,pop ax
是将栈顶的数据送入ax。
2.1. push、pop
在8086中,push、pop操作的数据都是2个字节的。