第4章 内存数据(X86汇编教程)
这一章讲的就是内存数据了.现在的电脑,内存都上G了吧.但是,你知道么?在电脑刚开机那会儿,最多能用1MB的内存!这是因为CPU其实有几个模式,实模式和保护模式,以及64位模式,(再往后的更强大的模式我就不说了,因为......我也不知道!)访问内存,就需要寻址,刚开机的时候,CPU在实模式下,什么是实模式呢?那是很久以前的CPU的16位模式,那时候的电脑内存只有1MB,也就是说寻址方式只要够寻址1MB就行了.自然不可能数G内存都用上.后来80386CPU的32位保护模式出来了(其实中间有个80286,从286开始就有保护模式了,不过似乎不是32位的),386保护模式的寄存器是32位了.能寻址4GB内存(暂时只教实模式,保护模式之类就不详细说了.以后再看看能不能也写进这教程里)现在新出现的80686有64位模式,寄存器是64位的.
嘛,说重点,实模式的寻址方式.内存是一维的,数据都按照一条线排列,访问内存需要提供一个内存地址.内存第1个字节的地址是0,(电脑数学,0是起点),恩,就是那样,第2个字节的地址是1.依次类推.寻址方式就是访问内存提供地址的方式.在实模式里,寄存器有16位,也就是说单独一个寄存器能表达的地址最多只有64KB(请自行验证,验证方法:用计算器的二进制模式,输入16个1,转10进制)
64KB啊!那明显不够用啊!所以,实模式寻址使用2个寄存器进行寻址,按照"段:偏移"的方式寻址.
前面说过段寄存器CS,DS,ES,SS,就是专门用来寻址用的,存储"段"那部分的数据.至于"偏移"部分的数据嘛...可以用寄存器BX,SI,DI,SP,IP,BP中的任何一个来表示,也可以直接用数字表示.实例:
CS:BX
CS:1234
那么,"段:偏移"又如何表达一个一维地址的呢?请看下边:
CPU 通过地址线通知内存它要操作的地方.在CPU里面有20根地址线,也就是说,"段:偏移"寻址方式只能寻址20位的地址(所以说就算2个16位寄存器合一起,想寻址32位的内存地址那也是不行的...),20位,也就是1MB.那么,把2个16位的数据转换成20位呢?
算法是这样的:
(段*16)+偏移
恩,段寄存器里面的数值乘以16(在16进制中是10)加偏移地址.
实例:
段寄存器=15
偏移地址=128
于是寻址得到的内存地址为:(15*16)+128=368
恩, 讲完寻址方式了.接着讲数据的低位高位排序.将来在学习过程中,你会碰到一些数字倒过来储存的情况,比如说五万三千二百一十七,储存在内存中却是 71235,这就是高位和低位按顺序排列了,在这个数字里,7是个位,所以在最前,1是十位所以第2.以此类推.也许你已经震惊的发现了,没错,电脑中的数字没有反,是我们现实中用的数字反了,五万三千二百一十七我们用53217表示,我们把最高的万位的5放在了最前面!在寄存器中也是如此,低位在前高位在后.
接着讲讲汇编中的数字表示方式吧.在汇编中可以输入10进制2进制16进制等数字(当然,编译生成代码后都是2进制.)这么多的进制,如果没有说明,汇编编译器一定会弄错.那么我们如何向编译器表示哪个数字是多少进制的呢?
我们可以在数字后边加个英文字母表示,2进制的数字在后边加B,实例:01110011B 16进制的数字则在后边加H,实例:1F3AH,至于10进制则不需要,所有的数字进制后边都有一个英文字母,那么其中一种进制不用也没关系的是吧?因为10进制最常用所以就把后边不用加英文字母的权利给了它,在汇编中10进制数字不用特殊表示.
另外,由于16进制涉及到了英文字母,ABCDEF,有可能和汇编代码弄混,所以,如果16进制第一个数字是英文字母,则必须在前面加个0.
实例:
A2H
必须写成:
0A2H
好了,本章就说道这里了~
内存数据X86汇编教 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)