汇编笔记[02]

汇编笔记[02]

内存中字的存储

  • 事实:对8086CPU,16位作为一个字
  • 问题
    16位的字存储在一个16位的寄存器中,如何存储?
    020H
    14EH
    212H
    300H
AXAX
4EH20H
AHAL
  • 回答
    高八位放高字节,低8位放低字节
  • 问题
    16位的字在内存中需要2个连续的字节存储,怎么存放?
  • 回答
    低位字节存放在低地址单元,高位字节存放在高地址单元
    例:20000D(4E20H)存放0,1两个单元,18D(0012H)存放在2,3两个单元
  • 字单元
    字单元:有两个地址连续的内存单元组成,存放一个字形数据(16位)
  • 原理:在一个字单元中,低地址单元存放低位字节,高地址单元存放高位字节。
  • 问题:
    (1)0地址单元中存放的字节型数据是(20H)
    (2)0地址字单元中存放的字型数据是(4E20H)
    (3)2地址单元中存放的字节型数据是(12H)
    (4)2地址字单元中存放的字型数据是(0012H)

要解决的问题:CPU从内存单元中要读取数据

  • 要求
    CPU要读取一个内存单元的时候,必须要先给出这个内存单元的地址;
  • 原理
    在8086 PC中,内存地址由段地址和偏移地址组成(段地址:偏移地址)
  • 解决方案:DS 和 [address] 配合
    用DS寄存器存放要访问的数据的段地址
    偏移地址用[…]形式直接给出
  • 例1
    mov bx,1000H
    mov ds,bx
    mov al,[0]
    将10000H(1000:0)中的数据读到al中
    这种情况al,[0]并不是没有给定段地址,段地址是直接读取的ds中的值。
  • 例2
    mov bx,1000H
    mov ds,bx
    mov [0],al
    将al中的数据写到10000H(1000:0)中
  • 将段地址送入DS的两种方式
    (1)mov ds,1000H 【错误】
    (2)mov bx,1000H
    mov ds,bx
    【正确】
  • 8086CPU不支持将数据直接送入段寄存器(硬件设计的问题)
  • 套路:数据 -> 一般的寄存器 -> 段寄存器

字的传送


  • mov bx,1000H
    mov ds,bx
    mov ax,[0] 【1000:0处的字型数据送入ax】【将内存中的数据传入寄存器】
    mov [0],cx 【cx中的16位数据送到1000:0处】【将寄存器中的数据传入内存】

DS的数据段

对内存单元中数据的访问

  • 对于8086PC机,可以根据需要将一组内存单元定义为一个段。
    物理地址 = 段地址 x 16 + 偏移地址
    将一组长度为N(n <= 64K)、地址连续、起始地址为16的倍数的内存单元当做专门存储数据的内存空间,从而定义了一个数据段。
  • 例:用123B0H~123B9H的空间来存放数据
    段地址:123BH 起始偏移地址:0000H 长度:10字节
    段地址:1230H 起始偏移地址:00B0H 长度:10字节
  • 处理方法:(DS):([address])
    用DS存放数据段的段地址
    用相关指令访问数据段中的具体单元,单元地址由[address]指出

将123B0H~123BAH的内存单元定义为数据段

  • 累加数据段中的前3个单元的数据
    mov ax,123BH
    mov ds,ax
    mov al,0
    add al,[0]
    add al,[1]
    add al,[2]
  • 累加数据段中的前3个字型数据
    mov ax,123BH
    mov ds,ax
    mov al,0
    add al,[0]
    add al,[2]
    add al,[4]

用mov指令操作数据

指令形式例子
mov 寄存器,数据mov ax, 8
mov 寄存器, 寄存器mov ax, bx
mov 寄存器, 内存单元mov ax, [0]
mov 内存单元, 寄存器mov [0], ax
mov 段寄存器, 寄存器mov ds, ax
  • 已知:mov 段寄存器,寄存器
    推测1 -> mov 寄存器,段寄存器【正确】
  • 已知:mov 内存单元,寄存器
    推测2 -> mov 内存单元,段寄存器【正确】
    推测3 -> mov 段寄存器,内存单元【正确】
  • 已知:mov 寄存器,数据
    推测4 -> mov 段寄存器,数据【不支持】

栈及栈操作的实现

栈结构

关于"段"的总结

各种段

  • 基础
    物理地址 = 段地址 x 16 + 偏移地址
  • 做法
    编程时,可以根据需要将一组内存单元定义为一个段。
    可以将起始地址为16的倍数,长度为N(N <= 64k)的一组连续的内存单元,定义为一个段。
    将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元–在程序中可以完全由程序员安排。
  • 三种段(目前学习的)
    数据段
    将段地址放在DS中
    用mov、add、sub、等访问内存单元的指令时,CPU将我们定义的数据段中的内容当做数据段来访问;
    代码段
    将段地址放在CS中,将段中第一条指令的偏移地址放在IP中
    CPU将执行我们定义的代码段中的指令;
    栈段
    将段地址放在SS中,将栈顶单元的偏移地址放在SP中
    CPU在需要进行栈操作(push,pop)时,就将我们定义的栈段当做栈空间来用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值