汇编教程3:寄存器CPU工作原理1
你真的弄懂了汇编语言基础?? 真的吗? 如果是那么就继续今天的话题啊!!在对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是怎么给出物理地址..好好体会,如果觉得我讲的哪里不对和不明白一定要告诉我!! 我建议你学习的时候结合下书本,效果肯定要好很多的.