【汇编语言】栈区与SS:SP寄存器

这篇具有很好参考价值的文章主要介绍了【汇编语言】栈区与SS:SP寄存器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

汇编语言 - 栈

栈是一块特殊的内存空间,本文涉及的CPU为8086CPU,所有与内存地址有关的数字皆为16进制

前言

栈的运行规律 - 先进后出,后进先出

以下为入栈的过程:
【汇编语言】栈区与SS:SP寄存器

以下是出栈的过程:

【汇编语言】栈区与SS:SP寄存器

以上就是栈的运行机制,栈的入栈叫做push,出栈叫做pop

在8086CPU中,栈是一块特殊的内存空间,栈的出栈和入栈都是以字为单位的

1. 8086栈机制

8086使用一段内存对栈进行模拟,最基本的操作是pop(出栈)和push(入栈)

  • pop 寄存器 : 表示将栈顶元素出栈并且将数据送入寄存器中
  • push 寄存器: 表示将寄存器中的元素入栈

下面是一段当作栈区使用的内存空间,初始化如下:

执行指令:push AX后:

寄存器AX中的内容被存放进内存中,栈顶指针上移两个字节

执行指令 push BX 后:

寄存器BX中的内容被存放进内存中,栈顶指针上移两个字节

执行指令pop CX中:

将栈顶元素送入CX后,栈顶指针下移两个字节

我们只需要使用pop和push指令,就可以对这段内存空间按照先进先出的规则进行访问,那么CPU怎么知道这段空间就是栈空间呢?

2. SS和SP寄存器

CPU是怎么知道我们执行的指令的地址?CPU是怎么知道我们执行指令的时候需要的数据的地址的?CPU通过CS:IP寄存器确定指令的位置,CPU通过DS:[address]确认数据的位置,那么需要确定栈顶的位置,也需要添加寄存器,SS与SP寄存器就是用来确定栈顶的位置的。

SS寄存器中存着栈顶的段地址,SP寄存器中存放着偏移地址,通过这两个寄存器中的值就可以判断栈顶的位置。

2.1 push指令与pop指令

push指令的完成,需要以下两个步骤

  1. SP = SP - 2:因为SS:SP指向前栈顶,既然需要push 数据,自然需要获取新栈顶
  2. 将 push 后面跟的寄存器中的内容写入刚开辟出的内存中,此时的SS:SP指向新栈顶

入栈时,栈顶从高地址向低地址增长

pop指令的完成,需要以下两个步骤

  1. 将栈顶元素送入pop后面跟的寄存器中
  2. SP = SP + 2,SS:SP指向下一个元素

出栈时,栈顶从低地址向高地址增长

2.2 示例

测试初始空间如下:

图中的栈顶SS:IP应为 SS:SP

当前SS:SP指向1000:A

执行push AX 指令后:

栈顶指针先上移,SP = SP - 2,然后将AX中的数据写入栈顶

【汇编语言】栈区与SS:SP寄存器

执行push BX指令后:

栈顶指针先上移,SP = SP - 2,然后将BX中的数据写入栈顶

【汇编语言】栈区与SS:SP寄存器

执行pop AX指令后:

先将栈顶中的数据写入AX中,然后栈顶指针下移,SP=SP + 2

执行pop BX指令后:
先将栈顶的数据写入BX中,然后栈顶指针下移,SP = SP + 2

如果1000:0 到 1000:F 这块内存是栈空间,并且初始状态栈空,那么初始状态下栈顶指针应指向1001:0,也就是第一次PUSH时栈顶指针刚好能够减到1000:E

2.3 越界问题

因为8086CPU只提供了栈顶寄存器,如果划分了一段内存空间为栈空间,例如1000:0 到 1000:F,如果SS:SP指针通过一系列的push和pop操作超出了这个范围,出现了上溢或者下溢的问题,是没有办法解决的,因为8086CPU 并没有提供对应的寄存器存放栈空间的大小,不能在每次push和pop操作之前先判断是否越界。

只能通过自己编程的时候避免。

3. debug测试

3.1 例题

利用栈的功能交换两个寄存器中的内容

寄存器和内存初始化

将AX压栈:

将BX压栈:

将栈顶pop到AX中:

将栈顶pop到BX中

完成两个寄存器中的内容交换

3.2 在debug中进行测试

  1. 先将AX和BX中的内容设置为1234H和5678H,然后找好栈区
  1. 写入对应的代码
  1. 将CS:IP指向对应的代码处,则开始运行程序

执行完代码后成功交换寄存器中的值文章来源地址https://www.toymoban.com/news/detail-400496.html

到了这里,关于【汇编语言】栈区与SS:SP寄存器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

    这篇文章主要介绍在 海思SS528 开发板,去操作某个 GPIO 寄存器输出高、低电平,来熄灭或点亮 LED 灯。 首先,了解一下 ARM裸机编程 ,也就是在一块没有移植操作系统的ARM开发板去编程,相当于把它当成单片机去使用,很多与硬件相关的操作都需要直接读写该硬件的寄存器。

    2024年02月10日
    浏览(30)
  • Arm汇编---寄存器

    寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc 条件码:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al ------------------------------------------ 一、数据寄存器 --------------------------------------------- ------------------------------------------ 二、指针寄存器 --------------------------------------------- --------------------

    2024年02月02日
    浏览(35)
  • 【汇编中的寄存器分类与不同寄存器的用途】

    寄存器分类 在计算机体系结构中,8086CPU,寄存器可以分为以下几类: 1. 通用寄存器: 通用寄存器是用于存储数据和执行算术运算的寄存器。在 x86 架构中,这些通用寄存器通常包括 AX、BX、CX、DX、SI、DI、BP 和 SP。其中,AX、BX、CX 和 DX 寄存器可以分别作为累加器(accumulat

    2024年02月09日
    浏览(41)
  • 通用寄存器-汇编复习(1)

    弄清寄存器表达,原理和配件及汇编实验验证。 8086cpu寄存器,字在寄存器存储 往期文章: 汇编语言基础-汇编复习(0)_luozhonghua2000的博客-CSDN博客 一个典型的 CPU(此处讨论的不是某一具体的 CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。前

    2024年02月07日
    浏览(34)
  • 16位汇编通用寄存器

    1、输入命名debug,进入调试程序 2、r 命令显示寄存器 3、a命令输入汇编指令 4、t命令单步执行汇编指令 5.数据溢出后标志位NC 变为NY, 0变成1 最后A

    2023年04月11日
    浏览(48)
  • ARM64 寄存器、常用汇编指令收集

    ARM64 有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。 寄存器 位数 描述 x0-x30 64bit 通用寄存器,如果有需要可以当做32bit使用:WO-W30 FP(x29) 64bit 保存栈帧地址(栈底指针) LR(x30) 64bit 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令 SP 64bit 保存栈指针,使用

    2023年04月20日
    浏览(31)
  • 一、1.汇编指令、寄存器和寻址方式

    立即数:可以立即在一条机器指令后找到具体数值的数,如内存中00位写着加指令,01位写着1100_1111,意思就是将1100_1111(十进制207)加到某处,反之可以表示数据的地址。 低端字节序:16位寄存器数据存入内存(内存单位为8位),寄存器低位存入内存低位(如00)高位存入内

    2024年02月14日
    浏览(41)
  • ARM汇编寄存器和常用指令详解

    对于32位及其以下的ARM处理器来说,函数调用规则如下: 父函数与子函数的入口参数以此通过 R0~R3 这4个寄存器传递。 父函数在调用子函数前先将子函数入口参数存入 R0~R3 寄存器中,若只有一个入口参数则使用 R0 寄存器传递,若有2个入口参数则使用 R0 和 R1 寄存器传递,以

    2024年02月03日
    浏览(42)
  • 汇编语言笔记(一)——汇编语言基础

    一、开发环境 我使用visual studio 2022 preview,其他版本的设置大同小异。 第一步: 打开visual studio,点击“创建新项目”: 第二步: visual studio并没有专门的汇编项目,所以需要挂羊头卖狗肉,选择C++空项目 第三步: 输入项目名称,点击创建 第四步: 鼠标右键单击项目名称—

    2024年02月05日
    浏览(30)
  • [ARM 汇编]高级部分—系统控制协处理器—3.2.3 控制寄存器的读写操作

    在这一部分,我们将学习如何使用ARM汇编指令在系统控制协处理器(CP15)的控制寄存器上执行读写操作。我们将通过实例来讲解如何使用MCR(Move to Coprocessor Register)和MRC(Move from Coprocessor Register)指令进行读写操作。 MCR指令 MCR指令用于将ARM内核寄存器的值写入协处理器寄存

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包