最近好多天没有更新笔记了,主要是最近几个月在写操作系统,比较忙点了,大约要写3个月左右呢,因为我学习的安排也会顺着兴趣随时做一些小的改动,因为兴趣是最好的老师嘛!今天在写操作系统之余再更新汇编的学习笔记。其实写操作系统也是对汇编,C语言,数据结构与算法的综合学习,很有趣味又能回顾知识点,还能熟悉操作系统原理,真是太好了!现在的笔记我会多写操作的描述,动手去练习然后发现问题比只是看书效率真的高很多哦!
DEBUG的“R”命令
当我们在CMD中键入 debug后,会进入debug系统,我们来看看debug中的一个命令'r'.当我们键入r后,会出现下面的画面:
是不是又发晕了,哈哈!要是又发晕,肯定是之前几节笔记没有仔细看呀!其实看起来蛮复杂,其实就只有14个寄存器!嗯?!不对呀!仔细一数没有14个啊!只有13个的啊,你说对了,比较明显的就13个,不过后面那排NV UP EI PL NZ NA PO NC是什么呀!其他它们是第14个寄存器中的8位!其实这14个寄存器都是16位的,那为什么这里只显示出其中的8位呀?!因为这个寄存器我们只用到了其中的9位,而且其中还有一位是单步调试中断使用,所以这里就只有8位了哦。每个寄存器都是16位的,大家能看出来吗?像图中的DS是1415,这个是16位知道的吗,要是不知道就去看我写的C语言学习笔记里面有写哦!一下子来了这么多的寄存器,我怎么知道里面谁是干什么用的呀!或者里面谁和谁又有什么关系啊?!其实寄存器就像这个社会中的不同的人,每个人有不通的工作方向和技术方向,所以每个寄存器也有它们各自的职能,社会中有些人是情侣,他们之间的关系比较亲密,其实寄存器中也有这样的关系的呢!具体怎么个关系和各自的特点,慢慢的说了哦!
其实大家发现1个问题没有,我们去网上下载操作系统的时候,一般不是32位的就是64的位,怎么这里的寄存器是16位的呢!我一直也为这个问题苦恼了小会.其实我们这里看到的寄存器是操作系统虚拟出来的,其实我们真正的电脑不是这样的结构的,哦!原来是这样,我就说呢,怎么有本书叫WINDOWS32位汇编语言程序设计。所以我们现在弄的这个是8086,16位汇编,32位以后再学了呢!最早的电脑是4位的,后来又是8位的,再后来出现了16位,由于在16位机器去上有好多特好的程序,随着硬件的发展,如果要兼容16位机的程序就必须制造16倍数的机器,所以后来就32位,64位了。但是在早起,硬件的成本很昂贵,为了达到高性价比的特点,就只用了20位地址线,这样的话,内存的寻找能力就是1M。但是我们的电脑并不处理20位数据呀!而且早在8位机的时候,一次还只能处理8位的数据,我先来看看,16位机器是如何处理8位数据的,我们看到寄存器是16位的,比如AX,BX,CX,DX如果把它们的1个16位的一分为二不就可以了吗,其实真实的情况就是这么处理的,AX分成AL,AH,其他同理。我们来实践实践加深理解。
T命令是单步执行的意思哦!大家看了吧!一起都在我们的掌握之中,不过有个地方很奇怪呀!IP怎么也在变,我们写的代码没有更改IP的值呀!其实通过细心的观察就知道了.比如1415:0100 后面的是IP的值,那么前面的1415是什么呢,仔细一看,1415和DS,ES,SS,CS的值一样,那么到底是其中的哪个的呢!其实是CS的。呵呵!为什么这样的,虽然,DS,ES,SS,CS的值都是1415,但是IP只喜欢CS,呵呵!所以它们是一对的。这样的话CS:IP就指向当前运行的代码。
我们再来看看刚才哪个问题,16位电脑中如何去用20位的地址线的。我们来看看刚才CS:IP的值:1415:0100。如果要16位变20位,只要左移4位不就可以了吗,关于位移如果不清楚的就去看我学C时候的笔记吧!所以为了解决这个问题就引入了段的概念。冒号前面的就叫做段地址,冒号后面的就叫做段内偏移地址。左移4位就是X16,所以真实的地址就是段地址X16+段内偏移地址。很简单吧!只是有点繁琐,但是没办法呀!为了兼容,只有这么办啦!所以电脑必须要提高段寄存器呀!所以DS ES SS CS就是4个段寄存器,我们现在知道了CS,代码段,那么其他是什么段呢,以前我学C时候的笔记不是分析了1个程序还有其他段的吗,那么其他3个具体表示什么呢,等以后的笔记再说了,这样一来是不是觉得汇编也什么难的呀!说到段,还要注意1个问题,就是不能对段进行直接赋值,如果我们写MOV DS,4444 会出错,为什么会这样呢?!其实这个没有为什么,造CPU的人就是这么造的,记住就好了啦!你可以用1个通用寄存器进行间接赋值就好了。不过有个奇怪的地方,我们如果用这种方法去修改CS的值为什么会跳出1个对话框,然后退出程序呢!那么怎么样才能修改CS的值呢?!这确实1个问题,这个问题下次笔记再说了。
我们再来看1个有趣又疑惑的问题。我们知道D命令是显示一段内存地址的值,那么我们来用D命令看1段内存,就看,03A3:006E吧!
我们再来看1段地址的值,我们就看03a0:009e
发现问题了没有,!怎么一模一样的,我们仔细一敲,也很正常啊!03A9E=03A30+006E ,03A9E=03A00+009E 。是吧!因为这个段是认为规定的,同样1个地址,你可以用很多种方式去寻址呢!
这节就到这里了,仔细算算,今天学到了不少东西呢,一起征服汇编吧!通过以前学习C语言,我觉得对汇编的理解也有好大的帮助的呢!你说是吗?!因为对于16进制我们早就熟悉了,对于内存,我们也好熟悉好熟悉了呢!发现没有!汇编和HTML很像,不知道你们是不是这样觉得的!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述