富士山的雪

汇编语言 学习记录02

Toretto·2022-03-29 21:55·72 次阅读

汇编语言 学习记录02

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

由于内存单元是字节单元(高八位和低八位),所以一个字需要两个地址连续的内存单元来进行存放,低位字节存放在低地址单元中,高位字节存放在高地址单元中。
字单元:存放一个字型数据(16位)的内存单元,由定义:是两个地址连续的内存单元组成。高地址内存单元中存放高位字节,低地址内存中存放字形数据的低位字节。
起始地址为N的字单元简称为N地址字单元;例:2、3两个内存单元组成,则这个字单元的起始地址为2,称其为2地址字单元。

3.2 DS寄存器和[address]
*mov指令也可将一个内存单元中的内容送入一个寄存器中,但必须指明内存单元位置和寄存器位置。
寄存器用寄存器名,内存单元用内存单元地址来指明。
格式:mov 寄存器名,内存单元地址。
指令执行时,8086CPU自动取ds寄存器中的数据作为内存单元的段地址。
注意:8086不支持将数据直接送入ds段寄存器的操作,所以如mov ds,1000H这类操作是非法的;故需要一个寄存器来进行中转,先送到寄存器,再送到ds段寄存器当中。

3.3 字的传送
8086是16位结构,16根数据线,一次性可以传送16位数据(一个字)
记住高八位和低八位分开传送,ah和al-->ax。

3.4 mov、add、sub指令
实验证明,mov 段寄存器,寄存器
mov 寄存器,段寄存器
mov 内存单元,寄存器
mov 内存单元,段寄存器
mov 段寄存器,内存单元
同样,add和sub指令都有两个操作对象,也有类似的指令形式

3.5 数据段
将一组长度位N、地址连续、起始地址为16倍数的内存单元当作专门存储数据的内存空间,从而定义一个数据段。
如何访问数据段中的数据:将一段内存当作数据段,便可以在操作时候用ds存放数据段的段地址,再根据需要通过相关指令访问数据段中的具体单元。

3.7 cpu提供的栈机制
栈遵守的操作规则:LIFO(Last In First Out)
8086最基本的两个入栈和出栈指令是:PUSH(入栈)和POP(出栈)
push ax 表示将ax中的数据送入栈内,pop ax 表示从栈顶取出数据送入ax中。
8086中的入栈和出栈操作都是以字为单位进行的(0000H,16位,两个字节,一个字)

引出的问题:
cpu如何知道一段空间要被当作栈来使用
push与pop指令如何知道哪个单元是栈顶单元。
类比CS:IP存放着段地址和偏移地址
8086中也有两个寄存器,段寄存器SS和寄存器SP,分别存放栈顶的段地址和栈的偏移地址。
任意时刻,SS:SP指向栈顶元素,push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

push ax的执行:
SP=SP-2(一个字单元),SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元成为新的栈顶。
将ax中的内容送入SS:SP指向的内存单元出,SS:SP此时指向新栈顶。

当栈为空时,栈中没有元素,不存在栈顶元素,所以SS:SP指向栈的最底部单元下面的一个单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2
例如原来SP位000EH,加2后SP=10H

有入栈有出栈,同理可得pop ax的执行与push正好相反
将SS:SP指向的内存单元出的数据送入ax中;
SP=SP+2(一个字单元),SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶
**注意,出栈后数据依然存在在原来的内存单元当中,只不过由于栈指针已经指向新的栈顶,故再次执行push等入栈指令后,待下次指针指向时直接写入新的数据,直接将其覆盖。

posted @   FantasyLee  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示