基本指令

mov 指令可以拥有的形式, addsub都可以

mov	  寄存器, 数据			 # 比如:mov ax, 8
mov    寄存器, 寄存器          # 比如:mov ax, bx
mov    寄存器, 内存单元        # 比如:mov ax, [0]
mov    内存单元, 寄存器        # 比如:mov [0], ax
mov    段寄存器, 寄存器        # 比如:mov ds, ax
mov    段寄存器, 内存单元      # 比如: mov ds, [0]
add	   寄存器, 数据			  # 比如:add ax, 8
add    寄存器, 寄存器          # 比如:add ax, bx
add    寄存器, 内存单元        # 比如:add ax, [0]
add    内存单元, 寄存器        # 比如:add [0], ax
sub	   寄存器, 数据			  # 比如:sub ax, 8
sub    寄存器, 寄存器          # 比如:sub ax, bx
sub    寄存器, 内存单元        # 比如:sub ax, [0]
sub    内存单元, 寄存器        # 比如:sub [0], ax

使用jmp修改CSIP的地址

同时修改CS/IP的内容,可以用jmp短地址:偏移地址的指令完成
jmp 2AE3:3
JMP 3:0B16
只修改IP的内容,可通过jmp某一合法寄存器
jmp ax
jmp bx

LIFO(Last in First Out) 后进先出

8086CPU提供入栈和出栈指令,最基本的两个时PUSH(入栈)和POP(出栈)

任意时刻SS:SP指向栈顶元素

无法解决栈超界的问题

pop和push的命令使用

  • push 段寄存器 将一个段寄存器中的数据入栈
  • pop 段寄存器 ;出栈,用一个段寄存器接收出栈的数据
  • push 内存单元: 将一个内存字单元处的字入栈(注意:栈操作都是以字为单位
  • pop 内存单元: ;出栈,用一个内存单元接收出栈的数据
mov ax, 1000
mov ds, ax
push [0]
pop [2]
  • push指令的执行步骤:
    1. sp = sp - 2
    2. 向ss:sp指向的字单元中送入数据
  • pop 指令的执行步骤
    1. 从ss:sp指向的字单元中读取数据
    2. sp = sp + 2
  • 用栈来暂存需要恢复的寄存器内容时,寄存器出栈的顺序要和入栈的顺序相反
  • push/pop 实质上时一种内存的传送指令

小结

用一个段存放数据,将他定义为数据段

用一个段存放代码,将他定义为代码段

用一个段村放栈,将他定义为栈段

将数据段的地址放在DS中,使用mov/add/sub等访问内存单元的指令时,CPIU就像数据段中的内容当作数据来使用;

将代码段地址放在CS中,将段中的第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令

将栈段的地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU需要进行栈操作的时候,就将我们定义的栈段当作栈空间来使用

原文地址:https://www.cnblogs.com/songyaqi/p/11887931.html