• 汇编语言第三章——寄存器(内存访问)


    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改变。

            

  • 相关阅读:
    Acdream 1174 Sum 暴力
    Acdream 1114 Number theory 莫比乌斯反演
    Acdream 1007 快速幂,模乘法
    UVa 10023
    UVa 11027
    UVa 11029
    UVa 10820
    UVa 10791
    UVa 11121
    UVa 106
  • 原文地址:https://www.cnblogs.com/saudade/p/9813444.html
Copyright © 2020-2023  润新知