汇编语言第二版笔记自用【第三章】

汇编语言

第三章 寄存器(内存访问)

3.1 内存中字的存储

  • 在CPU中,用16位寄存器来存储一个字,高八位存放高位字节,低八位存放低位字节
  • 在内存中,用连续的两个内存单元来存放字,低位字节存放在低地址单元中,高位字节存放在高地址单元中
  • 字单元:由两个地址连续的内存单元组成,比如一个字单元由2、3两个内存单元组成,则这个字单元的起始地址为2,可以说这是2地址字单元

3.2 DS和[address]

  • DS通常用来存放要访问的数据的段地址

  • mov指令的作用

    • 将数据直接送入寄存器
    • 将一个寄存器中的内容送入另一个寄存器
    • 将一个内存单元中的内容送入一个寄存器中 ;比如mov ax,[0] 将ds:[0]地址的数据送入ax中,在指令执行时,8086CPU自动取ds中的数据为内存单元的段地址
    • 将一个寄存器中的内容送入一个内存单元。例:将al的值送入1000:0内存单元
    mov bx,1000H
    mov ds,bx
    mov [0],al
    
  • 8086CPU不支持将数据直接送入段寄存器的操作;错误:mov ds:0001H,可通过间接的方式将数据送入ds,如下:

mov bx,0001H
mov ds,bx

3.3 字的传送

  • 8086CPU一次性可传送16位数据,即一个字,所以只要在mov指令中给出16位寄存器就可以进行16位数据的传送;例:
mov bx,1000H
mov ds,bx
mov ax,[0]
mov cx,[0]

3.4 mov、add、sub指令

  • mov指令的几种形式
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器
mov 内存单元,段寄存器
mov 段寄存区,内存单元
  • add和sub的几种形式
add 寄存器,数据
add 寄存器,寄存器
add 寄存器,内存单元
add 内存单元,寄存器
sub 寄存器,数据
sub 寄存器,寄存器
sub 寄存器,内存单元
sub 内存单元,寄存器
不能对段寄存器进行操作,比如 add ds,ax 或者add ax,ds都是不允许的

3.6 栈

  • 栈有两个基本操作:入栈和出栈,入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶元素总是最后入栈,最先出栈。称为LIFO(Last In First Out,后进先出)

3.7 CPU提供的栈机制

  • 8086CPU提供入栈和出栈指令,push(出栈)和pop(入栈),均是以字为单位进行的

    • push ax 表示将寄存器ax中的数据送入栈中

    push指令分为两步:1)SP=SP-2;2)将ax中的内容送入SS:SP指向的内存单元处,此时新的栈顶为SS:SP

    • pop ax表示从栈顶取出数据送入ax

    pop指令分为两步:1)将SS:SP指向的内存单元处的数据送入ax中;2)SP=SP+2

    注意:pop指令执行后,原栈顶地址处数据依然存在,但已不在栈中,当再次执行push指令到这个地址处时,写入新数据,覆盖旧数据

  • 8086CPU中,段寄存器SS存储栈顶的段地址,寄存器SP存储偏移地址,任意时刻,SS:SP指向栈顶元素。push和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

  • 当栈为空时,栈中没有元素,不存在栈顶元素,所以SS:SP指向栈的最底部单元下的单元(书里后面还有一句:该单元的偏移地址为栈最底部的字单元的偏移地址+2,这里要注意的是字单元是两个地址相连的存储单元,表示字单元的时候用低字节单元的表示,所以是+2)

3.8 栈顶超界问题

  • 8086CPU不会记录栈的大小,所以在执行出栈和入栈指令时,都可能发生栈顶超界的问题,覆盖到不属于我们的数据,或读取到错误的数据,所以需要我们在编程的时候自己注意栈顶超界的问题。

3.9 push、pop指令

  • push和pop指令的几种形式
push 寄存器
pop  寄存器
push 段寄存器
pop  段寄存器
push 内存单元
pop  内存单元  这里段地址从ds中取得

3.10 栈段

  • 栈段只是我们在编程时自己定义的,CPU并没有相关定义,要让CPU在执行push和pop时去访问我们定义的栈段,就要将SS:SP指向我们定义的栈段

问题3.11

如果将10000H~1FFFFH这段空间当做栈段,初始状态栈是空的,此时,SS=1000H,SP=?

课本原文分析了,当SS:SP指向栈最底部的字单元(1000:FFFE),这个时候,假设栈中有一个元素,那么执行出栈后,SP应该为FFFE+2,为10000H,8086是16位的,所以SP=0000H,此时,栈空,那么问题中SP为0H,假设此时执行push,SP要先减2,为-2,-2的补码正好就是FFFEH。

debug 工具自取https://download.csdn.net/download/weixin_45080573/76754300

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值