【汇编】汇编系列四 - DS和栈

一、DS

CPU要读写一个内存单元时,必须要先给出这个内存单元的地址,在8086中,内存地址由段地址和偏移地址组成。8086中有一个DS段寄存器,通常用来存放要访问数据的段地址。

1
2
3
mov bx,1000H
mov ds,bx
mov al,[0] ; 中括号内是偏移地址,因为大部分情况下都是往内存读写数据,所以不需要加ds

上面3条指令的作用是将10000H(1000:0)中的内存数据赋值到al寄存器中。mov al,[address]的意思是将DS:address中的内存数据赋值到al寄存器中,由于al是8位寄存器,所以是将一个字节的数据赋值给al寄存器。

注意:8086不支持将数据直接送入段寄存器中,mov ds,1000H是错误的。所有一般都是先把内存中数据放到通用寄存器中,然后把通用寄存器中的值放到段寄存器中。

下面的指令是将al中的数据送入内存单元1000H中。

1
2
3
mov bx,1000H
mov ds,bx
mov al,[0]

下面的指令执行后寄存器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个字节的。

2.1.1. push ax

2.1.2. pop ax

2.1.3. 思考

2.2. 栈顶超界

2.2.1. push

2.2.2. pop


三、段