微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第4章 内存数据(X86汇编教程)

第4章 内存数据(X86汇编教程)

时间:12-01 来源:互联网 点击:
内存,储存临时数据的地方.在运行中的程序.正在看的图片,正在编辑的文本,你现在在看的这章教程,一律都被拷贝一份在内存里.

这一章讲的就是内存数据了.现在的电脑,内存都上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

好了,本章就说道这里了~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top