zoukankan      html  css  js  c++  java
  • 汇编语言程序设计学习笔记(第一遍学习)第4节:汇编就像HTML一样简单

      最近好多天没有更新笔记了,主要是最近几个月在写操作系统,比较忙点了,大约要写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很像,不知道你们是不是这样觉得的!

  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/dodolook/p/2104984.html
Copyright © 2011-2022 走看看