【汇编语言】第3章 寄存器(内存访问)

推荐文章【汇编语言 王爽第三版】学习笔记目录+习题解析+实验

【汇编语言】第3章 寄存器(内存访问)

本文分为4个部分:

  1. 书本知识点概览
  2. 书本自带的小结
  3. 书本习题解析
  4. 个人小结

知识点概览

3.1 内存中字的存储

CPU用16为寄存器来存储一个字。高8为存高位字节,低8位存放低位字节。一个字要两个内存单元来存储。

字单元,存放一个字型数据的内存单元,有两个地址连续的内存单元组成

起始地址位N的字单元称为N地址字单元
问题3.1

主要看清是字型数据还是字节型数据
在这里插入图片描述
在这里插入图片描述

3.2 DS 和 [address]

DS 存放要访问数据的段地址。
mov指令也可以将一个内存单元中的内容传入到一个寄存器中。

mov 寄存器名 内存单元地址
mov al,[0]

[]表示一个内存单元,[0]中的0表示内存单元的偏移地址,8086CPU自动取DS中的数据为内存单元的段地址

但是8086CPU不支持将数据直接送入段寄存器
也就是说你可以

mov bx,1000H
mov ds,bx

但是不能

mov ds,1000H

问题3.2
在这里插入图片描述

mov bx,1000H
mov ds,bx
mov [0],al

3.3 字的传送

8086CPU是16为架构可以一次性传一个字
问题3.3
在这里插入图片描述
ax=1000 H
ds=1000 H
ax=1123 H (1000:0)
bx=6622 H (1000:2)
cx=2211 H (1000:1)
bx=8833 H (6622 H+2211 H)
cx=8833 H (2211 H+6622 H)
在这里插入图片描述

问题3.4
在这里插入图片描述
ax=1000 H
ds=1000 H
ax=2C34 H
1000:0=2C34 H
bx=2C34 H
bx=1B12 H
1000:2 1B12 H
在这里插入图片描述

3.4 mov,add,sub 指令

MOV

指令例子
mov 寄存器 数据mov ax,8
mov 寄存器,寄存器mov ax,bx
mov 寄存器,内存单元mov ax,[0]
mov 内存单元,寄存器mov [0],ax
mov 段寄存器,寄存器mov ds,ax
mov 寄存器,段寄存器mov ax,dx
mov 内存单元,寄存器mov [0
mov 段寄存器,内存单元mov ds,[0]

在这里插入图片描述
但是不能对段寄存器操作
在这里插入图片描述

3.5 数据段

我们可以定义一组长度为N(N<=64KB),地址连续,起始地址为16倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段

问题3.5
在这里插入图片描述
A指令输入后U指令查看
在这里插入图片描述
可以发现123B H被送入到DS中了
在这里插入图片描述
但是我们使用D指令查看的话发现数据段里都是0
在这里插入图片描述
所以我们先用E指令修改相应内存单元的值
在这里插入图片描述
在这里插入图片描述
然后成功执行了
在这里插入图片描述

3.6 栈

后进先出原则(LIFO)

3.7 CPU提供的栈机制

任意时刻,SS:SP指向栈顶元素,段寄存器SS存放栈顶的段地址,寄存器SP存放偏移地址.

push和pop指令执行时,CPU通过SS和SP获得栈顶地址

入栈时,栈顶从高地址向低地址增长
push ax
(1) SP=SP-2
(2) 把ax内容送入SS:SP指向的内存单元
pop ax和push ax相反
(1)SS:SP 指向的内存单元出数据送入ax
(2)SP=SP+2
问题3.6
在这里插入图片描述
栈空,SS:SP指向栈空间最高地址单元的下一个单元
在这里插入图片描述

3.8 栈顶超界的问题

push和pop可能造成超界问题,但是8086CPU不保证我们对栈的操作不会越界。
如果发送越界可能造成数据覆盖,所以要小心

3.9 push、pop指令

注意,栈操作都是以字为单位的。

指令功能
push 寄存器将一个寄存器中的数据入栈
push 段寄存器将一个段寄存器中的数据入栈
push 内存单元将一个内存单元中的字入栈
pop 寄存器出栈,用一个寄存器接受出栈的数据
pop 段寄存器出栈,用一个段寄存器接受出栈的数据
pop 内存单元出栈,用一个内存单元接受出栈的数据

问题3.7
在这里插入图片描述
A指令编写命令后U查看,T执行
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

问题3.8
在这里插入图片描述

在这里插入图片描述
A输入命令,U查看,T执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题3.9
和前面差不多懒得打了,这边主要利用LIOF的性质
在这里插入图片描述

在这里插入图片描述
问题3.10
就用栈传数据嘛,想办法指向10000H就行了
在这里插入图片描述

mov ax,1000H
mov ss,ax
mov sp,0002H

3.10 栈段

把长度为N(N<=64 KB)的一组地址连续,起始为16倍数的内存单元当作栈空间来用,从而定义了一个栈段

问题3.11
在这里插入图片描述
栈最底的字单元地址为1000:FFFE。SS=1000,SP=FFFE,所以栈为空的时候SP=0

这题主要两点
1根据栈段确定栈最底字单元地址
2计算栈为空时SP

问题3.12
一个栈段最大可以设为多少?为什么?
64 KB,push和pop使用的时候知识修改SP,所以栈顶变化范围0~FFFF H,所以64 KB

书本小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

习题解析

在这里插入图片描述

在这里插入图片描述

指令AXBXCSIPDS
初始002000 H01000 H
MOV AX,6622 H6622 H02000 H31000 H
JMP 0FF0:01006622 H00FF0 H0100 H1000 H
MOV AX,2000 H2000 H00FF0 H0103 H1000 H
MOV DS,AX2000 H00FF0 H0105 H2000 H
MOV AX,[0008]C389 H00FF0 H0108 H2000 H
MOV AX,[0002]EA66 H00FF0 H010B H2000 H

在这里插入图片描述

MOV AX,2000H 
MOV SS,AX    
MOV SP,0010H   

在这里插入图片描述

MOV AX,1000H
MOV SS,AX   
MOV SP,0   

个人总结

这章主要两个,寄存器访问内存和栈段
寄存器访问内存要记住如何找到内存地址
栈段的话主要记住push操作和pop操作流程
新增的几个寄存器
段寄存器DS:存内存访问时段地址
段寄存器SS存放栈顶的段地址,寄存器SP存放偏移地址.
还有就是段的概念应用到变成中:数据段,代码段,栈段

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值