内存中字的存储

汇编语言所有实验链接

CPU中用16位(2bytes)进行存储字,16位分为高8位和低8位。

例如:

  • 0 20H
  • 1 4EH
  • 2 12H
  • 3 00H

0地址单元中存放的 字节型的数据是: 20H

0地址单元中存放的 字型的数据是: 4E20H(字型是两个字节)

2地址单元中存放的 字型的数据是: 0012H(注意00是高八位,12是低八位)

DS和[address]

DS与CS类似,同样也是一个段寄存器,功能是存放需要读取的数据的端寄存器。

我们知道内存地址由段地址和偏移地址构成,例如我们需要读取10000H的内容,就需要段地址1000H和偏移地址0来进行访问

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

第三行中的[0]就代表偏移地址,那么段地址呢?其实默认他会取ds寄存器中的数据作为段地址,因此我们在读取内存中的数据的时候就需要提前设定好段地址放在DS中。

那么为什么要分两步将地址存放到DS中呢,因为8086CPU不支持 将数据直接送入到DS中 ,但是可以将另一个寄存器的内容转移到DS中,因此我们可以从bx进行中转数据。

样例:将al中的数据送入内存单元10000H中。

mov bx,1000H
mov ds,bx       #将bx作为中转的寄存器
mov [0], al

字的传送

由上文中我们可以知道,一个字的组成是由两个字节组成的,内存单元中一个单位就是一个字节。

样例:已知内存情况如下,请说明执行结束后的ax, bx, cx的值

​ 10000H 23

​ 10001H 11

​ 10002H 22

​ 10003H 66

  • mov ax, 1000H ->此时ax中的值为1000H

  • mov ds, ax ->将ax中的数据转移到ds中,此时ds为1000H

  • mov ax,[0] ->将内存中的1000:0开始的内容填充到ax寄存器中 值为 ax=1123H

  • mov bx,[2] ->同上,将内存中1000:2开头的内容填充到bx中 值为 bx=6622H

  • add cx,[1] ->同上, cx=2211H

mov add sub 指令

在基本的类型中注意不能的类型

  • 不能实现mov 内存单元,内存单元

  • 不能实现add ds,ax

  • 不能实现mov 段寄存器,数据

样例:请写指令,累加数据段(123B)的前三个 字型数据

mov ax,123BH
mov ds,ax       //将内存段ds设置为ax中存储的内容123B
mov ax,0
add ax,[0]
add ax,[2]
add ax,[4]

总结

  • 字在内存中进行存储的时候用两个 连续的内存单元来进行存放,低位放在低位,高位放在高位
  • 【address】表示偏移地址为address的内存单元,此时段地址取ds中的数据
  • mov, add, sub是具有两个操作对象的指令,jmp是具有一个操作对象的指令
  • 当将数据进行相加如果超出了范围,那么超过的范围的字段直接舍弃掉

栈(FILO)

在CPU中的栈机制:

  • push ax 表示将寄存器ax中的数据送入到栈中(将数据送到栈内)
  • pop ax 表示将从栈顶取出来的数据送入到ax中(将栈顶的数据拿出来)
  • 8086CPU的入栈和出栈操作的基本单位都是
  • 由于基本单位是字,所以一定要注意高位和低位的区别

Q:我们怎么确定那一段是栈呢?我们在push和pop的时候,怎么确定栈顶呢?

A: 其实如同CS:IP代表下一次需要执行的内存的位置,栈也有SS和SP来进行表示栈的位置,其中 在任意

时刻,SS:SP指向栈顶的元素 因此push和pop命令执行之后,栈顶元素会发生改变。

push:

  1. SP=SP-2 SP指向当前栈顶元素的单元
  2. 入栈时候,栈顶元素由高地址方向朝着低地址方向增长

例题:如果将10000H~1000FH作为栈,初始栈的状态是空的,SS = 1000H,那么SP=?

谨记一点,SS:SP一直是指向栈顶元素,那么这个栈的栈底是1000F,而栈是空的,不存在栈顶元素,那么只能指向栈底元素的下一个单元了,SS:SP = 10010

因此SP=10H

pop

原理就是跟push向反,得到的栈顶元素会填充到你的目标寄存器中

问题1:将10000H~1000FH作为栈,初始栈的状态是空的,将AX,BX,DS中的数据入栈

mov ax,1000
mov ss,ax
mov sp,0010H        #栈的空间到1000F 但是栈顶元素应该是这个单位加上1(因为初始栈为空)
push ax
push bx
push dx

例题2:将10000H~1000FH这段空间看做是栈,初始状态为空

设置Ax = 001AH , BX = 001BH

利用栈,交换AX与BX中的数据

mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BHpush ax
push bx         //此时栈顶到栈底分别为bx ax
pop ax          //将栈顶字 bx放置到ax中
pop bx          //将栈顶字 ax放置到bx中

总结cs、ss、ds

  • CS:IP 代码段
  • SS:SP 栈段
  • DS:IP 数据段

实验二:用机器指令和汇编指令编程

汇编语言王爽老师第四版(寄存器解读与实验二)相关推荐

  1. 汇编语言 王爽(第四版)复习笔记

    第一章 基础知识 机器语言是机器指令的 集合. 汇编语言的主体是汇编指令,决定了汇编语言的特性. 汇编语言 汇编指令:机器码的助记符,有对应的机器码. 伪指令:由编译器执行,无对应机器码. 其他符号: ...

  2. 汇编语言实验四-《汇编语言-王爽老师》

    4.实验四 1.编程传送数据到内存 编写代码 编译连接 debug调试 调试几次循环发现没有错误,可以直接在 loop 指令处使用 p 指令,跳过剩余的循环 执行结束后查看一下内存,是否正确写入 2. ...

  3. 汇编语言(王爽)第四版检测点2.2答案

    (1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为0010H到1000fH. 物理地址 = 段地址 * 16 + 偏移地址 注:偏移地址16位,变化范围为0~FFFFH 物理地址 ...

  4. 汇编语言实验一-《汇编语言-王爽老师》

    1.实验一 1.预备知识:debug的使用 r :查看寄存器值 r ax :修改寄存器ax值 d :查看内存中的值,d 段地址:偏移地址(从指定位置,默认显示128个内存单元内容) d 1000:0 ...

  5. 汇编语言实验八-《汇编语言-王爽老师》

    8.实验八 首先将程序编译连接,然后debug调试跟踪. 查看一下寄存器内容 发现IP的初始值为5,说明代码段前面还有其他内容(start前面的两条程序结束指令).然后查看一下各个指令所占的内存空间 ...

  6. 汇编语言实验七-《汇编语言-王爽老师》

    7.实验七 首先查看data段中各个数据的存放位置 076A:0H-076A:53H:存放年份 076A:54H-076A:0A7H:存放收入 076A:0A8H:开始存放雇员数 编写代码如下(htt ...

  7. 汇编语言实验十-《汇编语言-王爽老师》

    10.实验十 1.显示字符串 主要需解决的问题:字符串在显存中的地址定位 代码及注释如下: ;LAB10-1.asm assume cs:code data segmentdb 'Welcome to ...

  8. 汇编语言实验五-《汇编语言-王爽老师》

    5.实验五 (1).输入程序,debug调试跟踪 问题一:data段中数据不变 问题二:cs=076C.ss=076B.ds=076A 问题三:X-2.X-1 (2) 数据段以及栈均定义了两个字的数据 ...

  9. 汇编语言环境准备-《汇编语言-王爽老师》

    0.环境准备 1.DOSBox 1.1.简介 基于 x86 架构的 DOS(磁盘操作系统(Disk Operating System),是早期个人计算机上的一类操作系统.DOS是1979年由微软公司为 ...

  10. 汇编语言实验九-《汇编语言-王爽老师》

    9.实验九 思路大概就是一个大循环(s0)两个小循环(s1.s2),大循环执行三次,内嵌两个小循环,每一次大循环结束后,均会完成一行的字母和属性复制到目的地址.两个小循环的作用分别是复制字符到目的地址 ...

最新文章

  1. Ajax Toolkit Control ——CollapsiblePanelExtender(隐藏显示效果)
  2. Android-使用FindBugs
  3. BO QUERY BUILDER - SI_INSTANCE相关属性
  4. 动态路由协议之OSPF
  5. eclipse中安装Tomcat
  6. Leetcode题目:Binary Tree Paths
  7. docker容器别人访问很卡_一篇文章带你走进Docker的世界
  8. 01-hadoop学习环境准备
  9. R学习笔记:《R语言入门与数据分析》
  10. 联合几位大佬给大家送110本技术书籍!包邮到家!!
  11. 大环境之下软件测试行业趋势能否上升?
  12. http前后端传参写法
  13. msib450i gaming plus ac 开机vga长亮
  14. 内存泄露方式有哪些和如何查询内存泄露?
  15. RedisUtils工具类,设置缓存,然后需要在删除,更新插入的时候清空缓存,保持redis和mysql的数据一致
  16. 阿松嘚嘚嘚-数据库篇3-查询优化不简单(上)
  17. 电脑疑难杂症之Windows更新
  18. 编译安装redis6.2.6
  19. 移动互联网下半场争夺战:逃不过娱乐大网,得年轻中产得天下
  20. 转:人的认识如何自我超越

热门文章

  1. 建文本文档 怎么改成html,文本文档怎么改格式 怎么把文本文档改成CFG格式
  2. sqlserver2005安装(附加sqlserver2005 和 sqlserver2005 sp4补丁,完整安装包)
  3. 计算机程序设计vb怎么保存,VB编程:读取文本文件和保存文本文件的方法
  4. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
  5. C语言数据结构——数组的定义与顺序存储
  6. XMind软件简易使用教程
  7. 一文读懂python中数据纬度是怎么数的。
  8. python游戏程序代码大全_python小游戏代码,python小游戏代码大全打枪
  9. 如何实现现实人脸照片的编码
  10. 区块链技术指南之分布式的一致性