问题介绍

今天我们来解决这样一个问题,利用栈的的特性,将代码段中定义的数据进行逆序存放。请看下面代码段:

assume cs:code
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;?
code ends
end start

预备知识

  1. 对代码段使用数据是dw(define word) 程序会向内存申请一个字单元也就是2个字节。
  2. 如何将一段连续的内存空间设置为一个栈段使用ss、sp 寄存器,ss 代表栈段的段地址,sp代表偏移地址,注意弹栈 压栈 sp 都移动的2个字节
  3. 压栈弹栈问题弹栈是 向将数据弹出,再进行的sp = sp +2,压栈是 先将 sp = sp-2 后在压数据 ,为啥呢?是因为弹栈 压栈都是根据偏移量sp进行push和pop的!你仔细领悟领悟。所以在压栈前我们的 sp 要指向 空闲单元的地址高1个字节的内存单元,这一点很重要。如果你理解了,就知道为啥 c/c++中有这样一个说法,栈的生长是从高地址到低地址了。
  4. 可以通过段寄存器:偏移量对内存单元进行访问
  5. 循环语法loop的使用。

代码展示

assume cs:code
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0, 0,0,0,0start:;设置 栈段mov ax,csmov ss,axmov sp,20h;设置访问内存单元 可以用段地址:偏移地址表示    偏移地址用寄存器存放 可变mov bx,0;设置 循环次数mov cx,8;先压栈s:push cs:[bx]add bx,2loop smov bx,0   mov cx,8;后弹栈s1:pop cs:[bx]add bx,2loop s1mov ax,4c00hint 21h
code ends
end start

代码讨论

在汇编语言 王爽 书中的原代码中,定义的是 16字单元,sp 是设置的 30h,猜想作者是申请更多空间,反正没坏处。其实本人认为定义8个字单元足够,我们需要逆置的数据也才8个字单元,如果申请8个字单元,那么sp的设置就要当心了,是空闲单元的最高地址+1,先移动到空闲单元然后开始压栈!地址最高的空闲单元是sp = 19h ,所以 mov sp,20h 没毛病,网上有说mov sp,21h 这是错的。压栈前sp指向代码段第一条指令,sp 先-2 然后压入1个字数据!

检测结果

第一步查看内存单元数据

第二步代码运行到第一个循环(压栈)结束,查看是否将内存单元的数值全部压栈到空闲单元

第三步代码运行到第二个循环(弹栈)结束,查看内存单元数值是否逆置

汇编语言:利用栈的特性对内存数据进行逆置相关推荐

  1. 汇编语言 利用栈 将数据逆序存放

    题目要求 利用栈,将程序中定义的数据逆序存放 数据如下: 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 数据段DS 076A:0000存放的内容 交换 ...

  2. 利用栈的特性,将十进制数转换成八进制数

    栈的特定是:先进后出 源程序: //这个程序的目的是让用户输入一个十进制数,然后打出这个数的八进制数 #include<iostream> using namespace std; #de ...

  3. 借助于栈结构将一个单链表逆置

    借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...

  4. solidity 汇编语言问题——内存数据mload时为什么从第32位开始

    问题:内存数据mload时为什么从第32位开始 代码出处:https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d pragma so ...

  5. C语言的内存管理(堆,栈,代码段,数据段)

    C语言的内存管理(堆,栈,代码段,数据段) 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量: ...

  6. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题

    layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...

  7. 使用qsort对不连续的内存数据排序_常见的内排序和外排序算法

    常见的内排序算法 所谓的内排序是指所有的数据已经读入内存,在内存中进行排序的算法.排序过程中不需要对磁盘进行读写.同时,内排序也一般假定所有用到的辅助空间也可以直接存在于内存中.与之对应地,另一类排序 ...

  8. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  9. Apache Arrow 内存数据

    1.概述 Apache Arrow 是 Apache 基金会全新孵化的一个顶级项目.它设计的目的在于作为一个跨平台的数据层,来加快大数据分析项目的运行速度. 2.内容 现在大数据处理模型很多,用户在应 ...

最新文章

  1. react进阶系列 - 高阶组件详解四:高阶组件的嵌套使用
  2. java web Junit
  3. windows 10 +fedora双系统引导修复
  4. 05_通过sql操作表中的数据_插入修改删除查询
  5. Android之View绘制流程开胃菜---setContentView(...)详细分析
  6. 665C. Simple Strings
  7. project文件_移动和发出时通过UploadsReWriter读取的任意文件
  8. 凌云一周看点 | 混合云多Region架构;云上用户定制化网络;边缘云全站加速;什么是操作系统的云原生...
  9. [健康]生病了绝对不能吃的东西
  10. c语言教程入门ppt,C语言基础入门教程.ppt
  11. 全球及中国报刊行业运营策略与未来发展态势研究报告2022版
  12. JavaScript-标签语句
  13. 怎样恢复内存卡的视频文件?(图文操作解析)
  14. 别混淆你想要什么和能否实现
  15. Unity大型场景程序化生成及优化技术—FPS迷宫生成和优化
  16. 【目录】博客目录 | 先点这里
  17. Merriam-Webster's Vocabulary Builder 学习笔记 Unit 6
  18. GAMES101第四讲Transformation Cont.笔记
  19. 【OpenCV】边缘检测:Sobel、拉普拉斯算子
  20. 昆明理工大学计算机技术英语翻译,昆明理工大学自动化专业英语翻译学习指导书.ppt...

热门文章

  1. Randomatic mac - AE随机摆动的字母图层效果脚本
  2. html页面缓存meta,html中怎么用meta语句禁用页面缓存?
  3. python小游戏之二
  4. 1.6编程基础之一维数组_09向量点积计算
  5. RTX5 | 消息队列01 - 创建消息队列
  6. java conterller_java后台controller能否直接接收list
  7. python字符串倒数第三个_python字符串常用方法
  8. Vue第二部分(3):路由 VueRouter
  9. uni app map 地图 漂浮问题及方案
  10. Java笔记-CXF增加拦截器与自定义拦截器