汇编语言:利用栈的特性对内存数据进行逆置
问题介绍
今天我们来解决这样一个问题,利用栈的的特性,将代码段中定义的数据进行逆序存放。请看下面代码段:
assume cs:code
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;?
code ends
end start
预备知识
- 对代码段使用数据是dw(define word) 程序会向内存申请一个字单元也就是2个字节。
- 如何将一段连续的内存空间设置为一个栈段?使用ss、sp 寄存器,ss 代表栈段的段地址,sp代表偏移地址,注意弹栈 压栈 sp 都移动的2个字节。
- 压栈弹栈问题?弹栈是 向将数据弹出,再进行的sp = sp +2,压栈是 先将 sp = sp-2 后在压数据 ,为啥呢?是因为弹栈 压栈都是根据偏移量sp进行push和pop的!你仔细领悟领悟。所以在压栈前我们的 sp 要指向 空闲单元的地址高1个字节的内存单元,这一点很重要。如果你理解了,就知道为啥 c/c++中有这样一个说法,栈的生长是从高地址到低地址了。
- 可以通过段寄存器:偏移量对内存单元进行访问
- 循环语法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个字数据!
检测结果
第一步查看内存单元数据。
第二步代码运行到第一个循环(压栈)结束,查看是否将内存单元的数值全部压栈到空闲单元。
第三步代码运行到第二个循环(弹栈)结束,查看内存单元数值是否逆置。
汇编语言:利用栈的特性对内存数据进行逆置相关推荐
- 汇编语言 利用栈 将数据逆序存放
题目要求 利用栈,将程序中定义的数据逆序存放 数据如下: 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 数据段DS 076A:0000存放的内容 交换 ...
- 利用栈的特性,将十进制数转换成八进制数
栈的特定是:先进后出 源程序: //这个程序的目的是让用户输入一个十进制数,然后打出这个数的八进制数 #include<iostream> using namespace std; #de ...
- 借助于栈结构将一个单链表逆置
借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...
- solidity 汇编语言问题——内存数据mload时为什么从第32位开始
问题:内存数据mload时为什么从第32位开始 代码出处:https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d pragma so ...
- C语言的内存管理(堆,栈,代码段,数据段)
C语言的内存管理(堆,栈,代码段,数据段) 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量: ...
- 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...
- 使用qsort对不连续的内存数据排序_常见的内排序和外排序算法
常见的内排序算法 所谓的内排序是指所有的数据已经读入内存,在内存中进行排序的算法.排序过程中不需要对磁盘进行读写.同时,内排序也一般假定所有用到的辅助空间也可以直接存在于内存中.与之对应地,另一类排序 ...
- 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...
一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...
- Apache Arrow 内存数据
1.概述 Apache Arrow 是 Apache 基金会全新孵化的一个顶级项目.它设计的目的在于作为一个跨平台的数据层,来加快大数据分析项目的运行速度. 2.内容 现在大数据处理模型很多,用户在应 ...
最新文章
- react进阶系列 - 高阶组件详解四:高阶组件的嵌套使用
- java web Junit
- windows 10 +fedora双系统引导修复
- 05_通过sql操作表中的数据_插入修改删除查询
- Android之View绘制流程开胃菜---setContentView(...)详细分析
- 665C. Simple Strings
- project文件_移动和发出时通过UploadsReWriter读取的任意文件
- 凌云一周看点 | 混合云多Region架构;云上用户定制化网络;边缘云全站加速;什么是操作系统的云原生...
- [健康]生病了绝对不能吃的东西
- c语言教程入门ppt,C语言基础入门教程.ppt
- 全球及中国报刊行业运营策略与未来发展态势研究报告2022版
- JavaScript-标签语句
- 怎样恢复内存卡的视频文件?(图文操作解析)
- 别混淆你想要什么和能否实现
- Unity大型场景程序化生成及优化技术—FPS迷宫生成和优化
- 【目录】博客目录 | 先点这里
- Merriam-Webster's Vocabulary Builder 学习笔记 Unit 6
- GAMES101第四讲Transformation Cont.笔记
- 【OpenCV】边缘检测:Sobel、拉普拉斯算子
- 昆明理工大学计算机技术英语翻译,昆明理工大学自动化专业英语翻译学习指导书.ppt...
热门文章
- Randomatic mac - AE随机摆动的字母图层效果脚本
- html页面缓存meta,html中怎么用meta语句禁用页面缓存?
- python小游戏之二
- 1.6编程基础之一维数组_09向量点积计算
- RTX5 | 消息队列01 - 创建消息队列
- java conterller_java后台controller能否直接接收list
- python字符串倒数第三个_python字符串常用方法
- Vue第二部分(3):路由 VueRouter
- uni app map 地图 漂浮问题及方案
- Java笔记-CXF增加拦截器与自定义拦截器