Use DS and SS to access the same memory

Use DS and SS to access the same memory

eryar@163.com

CPU要读写一个内存单元时,必须先要给出这个内存单元的地址,在8086PC中内存地址由段地址和偏移地址组成。8086CPU中有一个DS(Data Segment)寄存器,通常用来存放要访问数据的段地址。

8086CPU也提供相关的指令以栈的方式LIFO(Last In First Out后进先出)来访问内存空间。这意味着在基于8086CPU编程的时候,可以将一段内存当作栈来使用。8086CPU提供入栈和出栈的指令:push和pop。比如push ax表示将寄存器AX中的数据入栈;pop AX表示从栈顶取出数据送入AX。

8086CPU中有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。

由上可知,通过DS可以用来访问指定内存中的数据。同样地,通过SS和SP也可以用来访问指定内存中的数据。

如下代码通过DS将内存10000H~10002H中的数据设置成1111:

mov ax,1000 
mov ds,ax 
mov ax,1111 
mov [0],ax 

 

在debug中输入上述指令,并查看10000H的内存情况。执行这些指令后内存中的数据为:

由上图可知,通过DS的方式改变了内存10000H~10001H中的值。下面我们通过栈的方式将同样的内存单元设置成2222。

mov ax,1000 
mov ss,ax 
mov sp,2 
mov ax,2222 
push ax 

 

将上述代码输入到debug中,并执行后,得到如下图所示的结果:

由上图可知,相同的内存单元中的值被修改了。说明也可以通过SS来设置内存中的数据。只不过用SS的方式要复杂一些,需要自己来通过SP管理栈的大小。

那么问题来了,如果用DS或SS修改CS中的数据,程序会不会出现矛盾呢?

时间: 2025-01-21 19:18:40

Use DS and SS to access the same memory的相关文章

Memory Access Patterns Are Important

原文地址:http://mechanical-sympathy.blogspot.com/2012/08/memory-access-patterns-are-important.html(因墙转载) In high-performance computing it is often said that the cost of a cache-miss is the largest performance penalty for an algorithm.  For many years the

WIN98SE硬盘主引导记录代码反汇编分析

硬盘引导记录MBR(Master Boot Record)是指硬盘之0面0道1扇区之内容,PC及其兼容机之ROM BIOS约定在上电及POST自检成功后,将其从硬盘读出,放置在内存0:7C00处,然后转去该地址执行.该段代码负责从代码尾部之4个分区表项中找出可以引导的项,读出其引导记录引导之.     MBR在相当长时间内都保持着1982年IBM设计IBM PC机时的代码原样,直到硬盘容量突破传统BIOS所能支持的最大容量8.4G之时,它才不得不加入新的INT13功能扩展代码,不过主要的功能还是

汇编 HelloWorld

图灵奖获奖得主,Alan Perlis曾说过:"如果一门语言没有改变你的编程思维,那么它不值得你去学习" 别人学高级语言,但是高级语言会变,我学低级语言,学了永远也不会变! stack segment stack ; 定义堆栈段 db 100 dup(?) ;堆栈段长100字节, 这里db就是字节的意思,如果是用dw就是字,100 dup(?) 中的dup是重复的意思,这句话是重复100遍,一遍定义一个字节,每个字节里全填0 stack ends ; 堆栈段结束 data segmen

[转贴]改好DEBUG七处缺点的comexe实现报告

 改好DEBUG七处缺点的comexe实现报告   首先声明,本文所指DEBUG,系DOS 6.22,win 98及2k三者DEBUG.EXE. (1) DEBUG命令T及P的2处缺点 跟踪命令T,建立在8086标志寄存器第8位(自陷位)置1后,处理器执行完一条 被跟踪指令,就进单步中断1的基础上(进入时,被调试进程栈顶3个字,被无辜破坏). DEBUG预先接管中断1,在那里,对被跟踪指令的执行完现场,先保存,后显示. 于是,DEBUG用以下5步,让欲跟踪的指令,在自陷位持有1的处理器环境下,间

新手必看-汇编语言超浓缩教程

" 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来."此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛.)别急,别急,让我把这个中原委慢慢道来:一.所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪.调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣--:二

kernel学习之内存管理简介

内存是linux内核所管理的最重要的资源之一,内存管理子系统是操作系统中最重要的部分之一.对于立志从事内核开发的工程师来说,熟悉linux的内存管理系统是非常重要的.早些年的DOS是直接访问内存的,这样不同的应用程序很容易让系统死机.在现在的linux系统,应用程序会产生一个trap,进入内核,这时内核是安全的.虚拟内存可以使应用程序使用连续.比实际内存更大的内存空间,这些内存空间在物理上可能是离散的,甚至可能是交换到磁盘上的.可以 这么说现代操作系统的内存管理就是虚拟内存的管理. 一.存储器地

汇编基础:顺序、分支与循环程序设计

一个算法用程序设计语言的语句有序地组合在一起加以描述,其组合方式称为程序的控制结构或简称为程序结构.程序的基本结构形式有顺序结构.分支结构和循环结构. 一.顺序结构 顺序结构是最简单的,也是最基本的程序结构形式,这种结构形式的程序的最大特点就是程序运行时从开始到结尾一直是按照编写指令的顺序执行,且每条指令仅执行一次,具有顺序结构的程序或者程序段,成为顺序程序. 我们拿一个简单的程序来说明汇编的顺序程序设计. 例:设两个字存储变量X和Y, 编程实现这两个变量的交换. 分析:由于存储单元之间不能够直

汇编基础:寻址方式

紧接着上一篇我们的标志寄存器,这一篇我大致概括下计算机的寻址方式,因为自己在汇编上也不是知道很多,所以难免有错误之处,还希望高手拍砖.希望这一系列文章能为大家学习汇编提供一个平台. 首先还是说下指令操作数,Intel  8086/8088CPU的指令系统中锁需操作数有以下4种: (1)寄存器操作数:操作数在CPU的通用寄存器或段寄存器中 (2)立即数操作数:操作数在指令中直接给出 (3)存储器操作数:操作数在存储器的存储单元中 (4)I/O操作数:操作数在输入输出端口的存储单元中 根据操作数来源

汇编基础:Hello World

"Hello World!"是一个经典之作,学习每一门语言的第一个程序便是它,但对于汇编来说,我感觉它的入门程序拿"Hello World!"的话,就有点难度了,对于汇编语言的一些基本知识就不再说了,这里就着重实现下用汇编语言输出"Hello World!" DATA SEGMENT STRING DB 'Hello Wowrld!', '$' DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP (0)