编学个入门后再倒回来看就会获益匪浅的.
回忆下我们吹了什么东西, 机器语言, 汇编语言明白了吗? 存储器(内存)的作用明白了吗?存储单元和地址总线还有数据总线这些明白了吗? 如果明白了就过关了,如果没有诶~~~~不是你有问题就是我有问题了..
这段终于给大家吹完了,我也松了一口气,以后的扯淡应该会更加轻松些.所以别紧张.下一篇可能要过几天了,这几天比较忙啊!下一篇就给大家真刀实枪的干了,我们就要接触汇编指令了,期待吧! 请多多支持我的blog,你们的支持是我最大的动力..有动力马才跑的快啊!
汇编教程(3):寄存器CPU工作原理① 2008-11-01 15:54
你真的弄懂了汇编语言基础?? 真的吗? 如果是那么就继续今天的话题啊!!在对CPU读取指令方面有了一个感性的了解后,我们就应该学学寄存器了,寄存器可以说是汇编代码里面必然存在的东西,不然这汇编程序就没法写了,那寄存器是什么呢?CPU到底是怎么样操作寄存器的呢???
现在的孩子真幸福啊,今天我一个18岁的朋友来象我请教如何配置电脑的问题,呵呵,想象一下啊我18岁都在做些什么呢? 不过非常不幸的是,我那朋友想买电脑来打完美世界.这不得不让我吃惊啊,现在的孩子虽然得到的东西多了,也不知道他们是否知道珍惜啊!!
好了不跟大家扯这些家常了,我本来文采就不怎么好,写这个教程权当自娱自乐啊,希望高手要求不要放太高,但是有错误是一定要提的! 上次写的那篇 汇编基础 收到了不少朋友的反馈,他们说我取的名字不好,不应该叫汇编精通啊(前两篇这个教程叫汇编精通),和我这样的写作风格不相配,想想也是哦,所以改成了现在这个名字.还有不少朋友给我提了很宝贵的意见,其中有位朋友说我写的跑题了..其实我写这个教程不打算教会你汇编,我也没有那个本事,我只是想大家对汇编有个感性的认识.. 或者是你在阅读其他书籍的时候有什么概念上的东西觉得干涩的,我给大家做个感性的介绍而已,我的想法是: 如果你想学习汇编,你手里起码得有几本书吧,比如我在如何学习汇编 那篇文章中给大家介绍那本 王爽写的 汇编语言 就非常不错,我就是靠这本书带入门的,所以希望阁下学习汇编还是以书本为主啊, 我本来技术就有限.甚至连一些概念上的东西弄错了都不知道, 惭愧惭愧啊..
上节课给大家介绍了机器语言和汇编语言,并且对CPU读取指令有了一个感性的认识,如果你没有读懂的话请给我发送邮件 或者参看王爽写的 汇编语言..其实那篇文章说的东西你不懂也没有关系,我觉得和写汇编程序关系不大,特别是写
win32汇编程序.. 既然如此就让我们了解今天的话题 CPU的工作原理.. CPU的工作原理
其实CPU从不亲自去作显卡显示图像,声卡发出声音这些事情,而是CPU在自己的逻辑存储器(这是假想中的,这个操作对我们是透明的)地址空间里通过控制总线进行操作,那些外部器件自己在逻辑存储器里面找块地方让CPU分个地址..这个说起来好像比较拗口啊,没有关系如果你不懂也关系不大,如果觉得我讲的不太明白可以参考 王爽汇编
对于一个汇编程序员来说不必要深入的了解这些东西,我们在写程序的时候主要是和寄存器打交道我们通过操作寄存器来达到控制CPU的目的.所以不了解以上讲的问题不是很大的.. 寄存器:
既然我们用汇编写程序主要打交道的是寄存器,那么我们有必要深入的了解下寄存器了,寄存器是什么呢? 它其实和内存是一样的东西,只是更加快而已,所以别被他吓倒,那么有多少个寄存器呢? 我可以非常难过的告诉你,寄存器的个数非常多,诶当初我就是看到这个才放弃学习汇编的,不过后来有幸看到了王爽的汇编语言后,才发觉原来寄存器也不过如此啊,我知道你现在想深入的了解寄存器,但是请别急慢慢来,,我们先了解4个寄存器 AX BX CX DX..这4个我们用的最多了,我知道你现在又非常的想了解寄存器到底有什么用,但是请听我说,你还需要具备一点东西,来伙计,我再给你介绍2条常见的汇编指令,非常容易理解: mov指令,add指令..它们的用法是这样的:
mov ax,19 将19送入AX AX = 19 add ax,18 将寄存器AX的值+18 AX = AX + 18
简单吧,学过高级语言的优势就出来咯,如果你还不懂高级语言赶紧去看下 尚学堂 那个视频啊! 那来考虑下我们在高级语言里面这样一段代码 int a = 10; int b = 20; int c; c = a + b;
我们用汇编该怎么来表示呢?? 我想应该是这样的 mov ax, 10
mov bx, 20 add cx, ax add cx, bx
明白了吧,寄存器是什么玩意,现在不嫌弃寄存器的个数多了吧,也不觉得寄存器多有什么问题了吧, 毛主席说:代码就能够说明一切问题啊,这应该是有道理的..那么到底有多少寄存器呢,总共只有4个AX, BX CX DX..但是对我们的编程来说一点问题也没有有了4个就够了~~~..
在8086以前的CPU都是8位的..8086是16位的机器上面的那些寄存器都是16位的(明白什么叫16位了吧),那以前8086以前的CPU呢怎么办呢?intel向了个折中的办法,就是把这些16位的寄存器再进行分家,就分成了高8位和低8位比如
AX 就分为 AH AL BX 就分为 BH BL CX 就分为 CH CL DX 就分为 DH DL
这里H 和L的意思分别表示High和Low好理解了吧,其实它们的用法也是一样的,我们就挑AX来讲讲, 比如现在有一个数字43E4储存在AX中那么AH的值为43,AL为E4为什么呢?intel的CPU是把数据按照高位到低位排列的所以AH(高8位)就存储了43,AL(低8位)就存储了E4,就那么简单,由上我们也可以看出CPU可以处理的数据只有2种,一种是字(word占16位)一种是字节(byte 8位),一个字存放在16位寄存器中,这个字的高位字节和低位字节自然就存储在这个寄存器的高8位和低8位了..比如 AX = 3454H
那么自然的 AH = 34H AL = 54H
同时我们又可以把AH和AL当作单独的两个寄存器来使用它们都互不影响的!如: AH = 42H
那么 AL还是为54H 但是AX却改变了 AX = 4254H,那么寄存器的内容就这些了,只是有些细节要注意下,请看代码: mov ax, 8F35H
add ax, 4E34H add ax, 9F45H
那么现在AX的值为多少呢? 你可能会认为是17CAF,但是我告诉你AX=7CAF,为什么呢如果一个值超过了它所能表示的范围,那么它将把进位丢弃(不是真的丢弃,但是我们现在可以这样认为)同样的事情发生在8位寄存器上,请看: mov al, 8FH add al, 4EH add al, 45H
那么AL的值是22,它同样丢失别以为他会进位到AH或者其他地方,这里我们如果进行的8位运算CPU就只认识8位寄存器,其他的不管,所以以下这些指令都是错误的:
mov ax, bl ‘把16位和8一起用是错的 mov bh, ax ‘把8位和16为一起用也是错的
mov ax, 20000000 ‘把一个大于寄存器的值赋给寄存器也是错的 add al, 10000 ‘将一个大于8位的数据加到8位寄存器也是错的 嗯,终于完了,这是一场攻坚战啊,学汇编和学C不同如果上来就Hello World的话估计大部分人都的晕,所以我们还是要先打下基础啊,虽然现在还是纸上谈兵,但是我们毕竟已经接触到了汇编指令了,再过两结课我们就可以上机写写指令了,但是现在还不行,先好好体会下..接下来我们还要讲下CPU是怎么给出物理地址..好好体会,如果觉得我讲的哪里不对和不明白一定要告诉我!! 我建议你学习的时候结合下书本,效果肯定要好很多的.
汇编教程4:寄存器CPU工作原理② 2008-11-01 15:55
最近在网上看了长篇小说<<疯狂的程序员>>。。嗯不错不错,看来这做程序员的人还大多有些相似的,不过每个人却还是有些不同的,就象我。。诶到现在还是一无所有,人财两空啊~~~~~~命苦不能怪政府。。
上一篇 寄存器CPU工作原理1,给大家介绍了几个寄存器,那几个寄存器因为
是最常用的所以也叫通用寄存器,相信大家对这寄存器还是有了一个感性的认识了,但是CPU不能够只访问寄存器的,它要做更多的事情,比如读取内存。这应该说是CPU的基本功能之一吧,所以我们不了解下CPU访问内存的方法确实有点那个啊。。。 既然这样我们还是有必要了解下的。。。。。
CPU要访问内存它必须给出内存单元的地址,同时这些单元都是一维线性的。每一个内存单元都有一个唯一的地址。。这在前面的章节有所提及,那么CPU是怎么样给出内存单元的地址呢??想要了解这个问题,我们还得看看CPU的结构。。 我们通常说的8086CPU是16位的,那么这个16位代表了什么概念呢? 这个嘛。。 概括起来的讲啊主要是这几点。。
寄存器一次最多只能处理16位的数据。 寄存器的最大宽度为16位
寄存器和运算器之间的通路为16位
但是问题就来了,8086有20位地址总线(20位地址总线的寻址能力就有1M了),而CPU内部只能够处理16位的数据那改怎么办呢??这个问题嘛,当然不可以浪费了地址总线对吧。。~~如果是地址总线也改成16位的那么我们的CPU寻址能力就只有64K了,那可是天壤之别啊。。当然的想个办法对不。。别人说intel里面的人都是天才,从这方面说的话还是有些道理的。。他们想到了在CPU内部做一个加法器来进行合成一个20位的物理地址。。那么合成过程是怎么样的呢??嗯,,,好的请听我细细道来。
首先CPU中的相关部件(这个部件我们马上要提到)提供2个16位的地址,然后送入一个叫地址加法器的部件,然后地址加法器再把两个地址合成为一个20位物理地址。。那么现在问题又来了对吧。。。他是怎么样合成物理地址的呢??没有关系这里有个公式。。。套公式总是比想问题简单些的。。。额。合成地址的规则是这样的:
物理地址 = 段地址 * 16 + 偏移地址。。
毛主席说过,实践才是硬道理啊,给大家套个公式就明白了,比如现在CPU要访问内存地址单元124C8H的内存单元,那么我们就可以让段地址为1240H,然后让偏移地址为00C8H,套用公式就比较简单了: 124C8H = 1240H * 16 + 00C8H
注意拉,这里别弄错了,这里我们讨论的数据都是16进制的,所以*16只是把小数点移动了一位而已,嗯。。是不是已经感觉到了16进制的好处了。。当你在感叹16进制是多么好之余有没有想过。。我刚才写的那公式里面讲了什么。段。。段地址。。什么的!这个段地址又是什么概念呢?? 千万别以为是一段一段的地址啊!,其实内存里面是绝对没有分段的,分段只是来自CPU自己。其实分段以后是有好处的,这样我们就可以把一些连续的内存当作一个段来使用,套用上面的公式,段地址不变。。只是改动偏移地址。。哈哈这样就方便多了。我们知道偏移地址也是16位的,那么一个段最长呢也只能有64KB而已,明白了吗? 以为偏移地址只能够表示64KB的内存而已。。。
前面我们讲到了”CPU的相关部件提供两个地址”,这么一句话。。那到底是什