寄存器(内存访问)07 - 零基础入门学习汇编语言19

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

 

让编程改变世界

Change the world by program


 

栈段

  前面讲过,对于8086PC机,在编程时,我们可以根据需要 ,将一组内存单元定义为一个段。 我们可以将长度为 N(N ≤64K )的一组地址连续、起始地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈段。 比如我们将10010H~1001FH 这段长度为 16 字节的内存空间当作栈来用,以栈的方式进行访问。 这段空间就可以成为栈段,段地址为1000H,大小为16字节。 将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就在执行push、pop 等栈操作指令时就自动地将我们定义的栈段当作栈空间来访问。  

如何使的如push、pop 等栈操作指令访问我们定义的栈段呢?

将SS:SP指向我们定义的栈段。  

问题3.11

如果我们将10000H~1FFFFH这段空间当作栈段,初始状态是空的,此时,SS=1000H,SP=?  

思考后看分析

我们将10000H~1FFFFH这段空间当作栈段 ,SS=1000H ,栈空间大小为64KB ,栈最底部的字单元地址为1000:FFFE。 任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=FFFEH。 栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2。 SP原来为FFFEH,加2后SP=0,所以,当栈为空的时候,SS=1000H,SP=0。  

换个角度看

任意时刻,SS:SP指向栈顶元素,当栈为空的时候 ,栈中没有元素 ,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元 ,该单元的偏移地址为栈最底部的字单元的偏移地址+2 ,栈最底部字单元的地址为1000:FFFE,所以栈空时,SP=0000H。  

问题3.12

一个栈段最大可以设为多少?为什么? 思考后看分析  

一个栈段最大可以设为多少?

分析:这个问题显而易见,提出来只是为了提示我们将相关的知识融会起来。 首先从栈操作指令所完成的功能的角度上来看,push、pop等指令在执行的时候只修改SP; 所以栈顶的变化范围是0~FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。 所以一个栈段的容量最大为64KB。  

段的综述 == 总结 + 啰嗦

  我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。

我们可以用一个段存放数据,将它定义为“数据段”;

我们可以用一个段存放代码,将它定义为“代码段”;

我们可以用一个段当作栈,将它定义为“栈段”;

  我们可以这样安排,但若要让CPU按照我们的安排来访问这些段,就要:

对于数据段,将它的段地址放在 DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当作数据段来访问;

对于代码段,将它的段地址放在 CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令;

对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地置放在 SP 中,这样CPU在需要进行栈操作的时候,比如执行 push、pop 指令等,就将我们定义的栈段当作栈空间来用。

  可见,不管我们如何安排 ,CPU 将内存中的某段内存当作代码 ,是因为CS:IP指向了那里。 CPU将某段内存当作栈 ,是因为 SS:IP 指向了那里。 我们一定要清楚 ,什么是我们的安排,以及如何让CPU按我们的安排行事。 要非常的清楚CPU的工作机理,才能在控制CPU来按照我们的安排运行的时候做到游刃有余。   比如我们将10000H~1001FH安排为代码段,并在里面存储如下代码:

设置CS=1000H,IP=0,这段代码将得到执行。

  可以看到,在这段代码中,我们又将10000H~1001FH 安排为栈段和数据段。 10000H~1001FH这段内存,既是代码段,又是栈段和数据段。 一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。 关键在于CPU中寄存器的设置,即:CS、IP、SS、SP、DS的指向。 检测点3.2 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LCMHTRKPMYHS']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2010/11/17/3846973.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站架构设计系列总结

大型网站架构设计系列-我的总结如下: 1、 数据结构和产品架构设计,这是基础! 2、 角色分开,各司其职(web服务器,缓存服务器,负载平衡,数据库等) 3、 HTML静态化&#xff…

Linux里Web应用上的截图软件——Shutter

Linux的发行版里——Ubuntu与Fedora自带的截图软件都是“gnome-screenshot”,这款软件小巧实用,不过就是截出来的图都是PNG图片,质量过高,而我截图发布在网上对图片的质量要求并不高,反而希望质量一般就行,…

腾讯的强大不是偶然,小马哥很强大

为什么80%的码农都做不了架构师?>>> 其实自己对于腾讯没什么好感,不过也没有太多的坏感,之前还有一篇日志,小批评了一下腾讯,今天看到小马哥写给内部员工的反思邮件。记录下两点提醒自己:对待敌…

计算机三级网络技术第一道大题 网络地址 主机号 直接广播地址 网络技术

加粗样式#计算机三级网络技术 ##网络地址,直接广播地址,主机号,子网中第一个可以IP地址,子网中最后一个可用IP地址 这是我在备考计算机三级网络技术中,写的几个例题,有哪里错的,还请大佬们帮忙纠…

开发人员应该用好的一些网站

文章分类:综合技术 我们在开发项目的时候,大多数模块都是逐字逐句敲打出来的,然而随着开源的蓬勃发展,涌现出了好多优秀的开源项目,这些项目不仅能加快开发应用,而且能给我们的开发带来灵感。如果开发人员能灵活应用好…

SQL Server2008 附加数据库时出错

开机后附加数据库失败: 1.正常操作附加数据库。 右键单击sqlserver中的数据库,选择【附加】左击【添加】,选择文件路径,左击【确定】,之后弹出“附加数据库时出错”:确定,继续下一步进而查看原因,如图&…

fread 和 read的区别

f是ANSI的C标准库。而后者的是UNIX下的系统调用。 fread带有缓冲,是read的衍生,或者说fread是通过read实现的 要想直接和硬件打交道,必须用read fopen/fread是C标准的库函数,操作的对象是: file stream open/read是和…

有三个数a,b,c,要求按大小顺序输出。

有三个数a,b,c,要求按大小顺序输出。 #include <stdio.h> int main() {int a,b,c,;scanf("%d %d %d",&a,&b,&c);if(a<b){ta,ab,bt;}if(a<c){ta,ac,ct;}if(b<c){tb,bc,ct;}if(a<b){ta,ab,bt;}printf("%d %d %d\n",a,b,c);re…

rails online api

http://railsapi.com/doc/rails-v3.0.1/

求1+2+3+……+100的累加和。

利用三种循环语句求123……100的累加和。 方法一&#xff1a;whlie #include<stdio.h> int main() { int i1,sum0; while(i<100){sumsumi;i;}printf("sum%d\n",sum);return 0;}方法二&#xff1a;do…whlie #include<stdio.h> int main() { int i1,…

j2me 学习资料

为什么80%的码农都做不了架构师&#xff1f;>>> 1:J2ME移动应用开发实战视频教程 http://www.pconline.com.cn/pcedu/videoedu/asp/0809/1425959.html 转载于:https://my.oschina.net/sunyh/blog/10534

求两个数中的较大数

#include <stdio.h> int max(int a,int b); int main(){int a,b,c;printf("请输入两个整数&#xff1a;\n");scanf("%d%d",&a,&b);cmax(a,b);printf("两个数的较大数为:%d\n",c);return 0; } int max(int a,int b){int t;t(a>b…

VSTO应用程序中加入键盘钩子

在VSTO应用程序中有时为了处理一些快捷按键操作等实现一些特殊的功能&#xff0c;此时需要对键盘进行挂钩&#xff0c;此时使用P/Invoke函数实现&#xff0c;参考如下&#xff1a; VSTO加载和卸载时进行钩子的初始化和卸载 代码 KeyboardHook hook;privatevoidThisAddIn_Startu…

深入理解JavaScript中的this关键字

在JavaScript中this变量是一个令人难以摸清的关键字&#xff0c;this可谓是非常强大&#xff0c;充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。 对于this变量最要的是能够理清this所引用的对象到底是哪一个&#xff0c;也许很多资料上都有自…

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …

在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展?

在你们看来&#xff0c;信息网络的定级如何才能更好的发展&#xff1f;或者说有什么影响因素使得定级工作不好开展&#xff1f; 可以从三个层面考虑&#xff1a; &#xff08;定级工作步骤:定级&#xff0c;备案&#xff0c;建设整改&#xff0c;等级测评&#xff0c;安全监管&…

PHP中文乱码的常见解决方法总结

PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身&#xff0c;有些产生在于MySQL交互的过程中&#xff0c;有时与操作系统有关。下面进行一番总结。 一&#xff0e;首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码&…

计算机网络技术期末考试复习总结

随便敲的一点复习资料 缩写题 WAN&#xff08;广域网&#xff09; LAN &#xff08;局域网&#xff09; MAN&#xff08;城域网&#xff09; PSE&#xff08;分组交换器&#xff09; PAD&#xff08;分组组装/拆卸设备&#xff09; NCC&#xff08;网络控制中心&#xff09; RT…

LYNC解决方案巡展

今天有幸参加了微软的LYNC解决方案巡展&#xff0c;也捕捉到一些镜头。和大家分享一下。 酒店入口的易拉宝。这个酒店的海鲜自助不错&#xff0c;可惜不是旋转餐厅。 微软中国及大中华区信息工作者业务群峰鹰巩的演讲。不过是纯英文的&#xff0c;没有翻译。我觉得微软在这些方…

计算机网络考试试题库-期末考试题库含答案

一、选择题(第一章 1-10&#xff1b;第二章 11-20;第三章21-35&#xff1b;第四章36-60 &#xff1b;第五章 61-73道&#xff1b;第六章 74-84道&#xff1b;第七章85-90&#xff1b;第九章91-95&#xff1b;第十章96-100) 1.下列四项内容中&#xff0c;不属于Internet&#x…