zoukankan      html  css  js  c++  java
  • 基本指令

    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需要进行栈操作的时候,就将我们定义的栈段当作栈空间来使用

  • 相关阅读:
    Elasticsearch Windows下安装及配置集群
    .Net文件压缩
    DateHelper
    lambda Helper
    Log4net的使用
    python3之rabbitMQ
    python3之协程
    python3之paramiko模块
    python3之redis
    redis
  • 原文地址:https://www.cnblogs.com/songyaqi/p/11887931.html
Copyright © 2011-2022 走看看