zoukankan      html  css  js  c++  java
  • 汇编语言第三章——寄存器(内存访问)

    1.内存中字的存储

      高位字节存放在高地址单元中,地位字节存放在低地址单元中。

      将起始地址为N的字单元简称为N地址字单元。

    2.DS和【address】

      8086CPU自动取DS中的数据为内存单元的段地址。

      8086CPU不支持将数据直接送入段寄存器的操作。

    3.字的传送

      mov ax,[0]:字型数据传送

      mov al,[0]:字节数据传送

      原因:高位字节存放在高地址单元中,地位字节存放在低地址单元中。

    4.mov,add,sub指令

      mov指令的几种形式:

      mov 寄存器,数据                                                     

      mov 内存单元,寄存器

      mov 寄存器,寄存器                                                   

      mov 段寄存器,寄存器

      mov 内存单元,常数                                                   

      mov 内存单元,段寄存器

      mov 寄存器,段寄存器                                               

      mov 段寄存器,内存单元

      mov 内存单元,数据                   

      sub 寄存器,数据

      sub 寄存器,寄存器

      sub 寄存器,内存单元

      sub 内存单元,寄存器

      add和sub可操作类型差不多

      mov [1],byte ptr 3和mov byte ptr [1],3

      因为数据3占用的字节数不确定,而计算机系统只执行确定的东西,用btye ptr 确定占用的字节数。

      jmp是具有一个操作对象的指令。

    JMP 1000H 段内直接转移,转移地址的偏移量由指令给出
    JMP CX
    段内间接转移,转移地址的偏移量由CX指出
    JMP 1000H:2000H
    段间直接转移,段码和偏移量由指令给出
    JMP DWORD PTR [SI] 段间间接转移转移地址在SI所指地址开始的4个单元中

      注意:1、常数不能作为目的操作数。

                       2、作为源操作数时,若最高位是16进制的A~F,前加0。

                       3、两个操作数长度要一致。

                       4、两个内存单元之间不能直接传送数据。(eg:mov [1], [2] ×)

                       5、不能使用mov指令修改CS和IP的值。

                       6、两个段寄存器之间不能直接传送;不能把常数送到段寄存器。

    6.CPU提供的栈机制

           注:8086CPU中栈以字为单位。

           引入指令:PUSH(入栈:把数据存入栈)和POP(出栈:从栈取出数据)  

           栈顶:最后入栈的字数据所对应的地址单元。

           栈底:固定的一端,栈区最高地址单元的前一个单元。

           栈为空时,栈顶指向栈底+2

         寄存器:SS和SP。

           SS:栈段段寄存器,用于存放栈段的「段地址」

           SP:栈指针寄存器,用于存放栈顶的偏移地址。

      任一时刻,ss:sp指向栈顶元素。

      进栈: 栈顶上移两个单元,即: 栈顶-2 → 栈顶 ,存入数据。

           出栈: 栈顶下移两个单元,即: 栈顶+2 → 栈顶 ,取出数据。

      栈顶低地址,栈顶高地址。

    7.越界的问题

            当栈满的时候,再使用push指令入栈; 当栈空的时候,再使用pop指令出栈。

            编程时要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作也要注意,以防栈空的时候继续出栈而导致的超界。

    8.push、pop指令

      形式:push 寄存器

                      push 段寄存器

                      push 内存单元

         pop亦同。

           注:1、栈的操作都是以字为单位。

                  2、操作对象不能是常数。

                  3、pop 段寄存器中,段寄存器不能是CS和SS。

        4.push,pop实质上是内存传送指令,与mov指令不同的是,push,pop访问的内存单元地址不是在指令中给出的,而是由ss:sp决定,同时push,pop还是改变sp中的内容,即在执行push,pop指令时cpu进行了两步操作:先读取ss:sp的内容,后改变sp,且因为修改的只是sp,所以栈顶变化范围最大只能在0~FFFFH之间

      栈的初始化条件: mov ax,1000H

                                         mov ss,ax

                                         mov sp,0010H

    9.栈段

           一个栈段的最大容量为64KB。

           「段」是一个逻辑上的概念。 编程时,可根据需要指定一段内存区用作数据段、代码段或是栈段。

             用作数据段时,要把段地址→DS。

             用作栈段时,要把段地址→SS,栈顶偏移地址 → SP。

             用作代码段时,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改变。

            

  • 相关阅读:
    前端与算法 leetcode 344. 反转字符串
    JavaScript闭包使用姿势指南
    前端与算法 leetcode 48. 旋转图像
    前端与算法 leetcode 36. 有效的数独
    前端与算法 leetcode 1. 两数之和
    前端与算法 leetcode 283. 移动零
    前端与编译原理 用js去运行js代码 js2run
    前端与算法 leetcode 66. 加一
    前端与算法 leetcode 350. 两个数组的交集 II
    前端与算法 leetcode 26. 删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/saudade/p/9813444.html
Copyright © 2011-2022 走看看