汇编基础教程(4)段


1    将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元


2    种类

2.1  代码段

定义

   例如

  如何使得代码段中的指令被执行

 

2.2  数据段

定义

  1.     段地址:123BH
  2.     长度:10字节

DS和[address]

  1.       在8086PC中,内存地址由段地址和偏移地址组成。
  2.       8086CPU中有一个 DS寄存器,通常用来存放要访问的数据的段地址。
  1.       mov bx,1000H
  2.       mov ds,bx
  3.       mov al,[0]

      mov 指令可以将一个内存单元中的内容送入一个寄存器。

  1.        mov 寄存器名,内存单元地址
  2.        “[…]”表示一个内存单元, “[…]”中的0表示内存单元的偏移地址。
  1.        10000H表示为1000:0(段地址:偏移地址)
  2.        将段地址1000H放入ds
  3.        用mov al,[0]完成传送(mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中)
  1.        8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。(硬件设计的问题)
  2.        mov ds,1000H 是非法的。
  3.        数据>>一般的寄存器>>段寄存器

例如

   

 

2.3  栈段

 

操作方式

  1.        入栈:将一个新的元素放到栈顶
  2.        出栈:从栈顶取出一个元素

 

8086CPU提供入栈和出栈指令

    SS:SP

      8086CPU中,有两个寄存器:

         SS和SP只记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈时找到栈顶。

   栈顶超界的问题

      种类

      8086CPU不保证对栈的操作不会超界。

  1.         当前栈顶在何处;
  2.         当前要执行的指令是哪一条。

     解决办法

 

push、pop指令

定义

PUSH(入栈)

     push ax:将寄存器ax中的数据送入栈中;

     执行过程

        push ax

         图示

 

POP(出栈)

       pop ax :从栈顶取出数据送入ax。

       执行过程

        图示

   注意:

 

格式

(1)

(2)

(3)

 

注意

 

栈段定义

 

思考


3    访问

 比如我们将10000H~1001FH安排为代码段,并在里面存储如下代码:


4    段前缀

在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”

应用

场景1

   问题:将内存ffff:0~ffff:b段元中的数据拷贝到 0:200~0:20b单元中。

   分析

  1.       初始化:X=0
  2.       循环12次

  问题

  解决

 

场景2

Debug和汇编编译器Masm对指令的不同处理

    Debug中

    在汇编源程序中,指令“mov ax,[0]”被编译器当作指令“mov ax,0”处理。

解决:利用段前缀显性的指出段地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值