首页
社区
课程
招聘
[旧帖] 一个内存单元的长度究竟是多少 0.00雪花
发表于: 2011-2-11 08:58 17103

[旧帖] 一个内存单元的长度究竟是多少 0.00雪花

2011-2-11 08:58
17103
最近看王爽的汇编语言,发现里面很多讲得不清不楚的,内存是都有地址编号吗?这个编号是怎么实现的?地址长度是多少?一个内存单元的长度究竟是多少啊?
mov ax,[0]
mov al,[0]
这两个指令书上说第一个是把DS:0开头的内容放入AX中,长度是一个字,这意思是不是就是把两个连续的内存单元数据送入ax?
汇编编辑器是不是能自动判断该把几个内存单元送入ax?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=wulfalone;923849]最近看王爽的汇编语言,发现里面很多讲得不清不楚的,内存是都有地址编号吗?这个编号是怎么实现的?地址长度是多少?一个内存单元的长度究竟是多少啊?
mov ax,[0]
mov al,[0]
这两个指令书上说第一个是把DS:0开头的内容放入AX中,长度是一个字,这意思是不是就是把两个连续的内存单元...[/QUOTE]

我看不是没讲清楚,而是你基础不好吧。想学汇编,最好能懂门高级语言,尤其是C语言。
内存没有地址你怎么访问啊?实现方式你去计算机组成原理吧。地址长度是由CPU决定的,比如32位,有4G的寻址空间,当然,内存不一定这么大。
mov ax,[0]。你就不想想ax是几个字节,[0]中的0本身是个地址,[0]是取地址0开始的值,至于取几个字节,得看ax了,ax是两字节的,所以mov ax,[0],会取2个字节的值到AX,要是取了4个字节,怎么放啊?
mov al,[0],就更不用说了,取一个字节。
mov eax,[0],这个就取4个字节。
2011-2-11 09:12
0
雪    币: 379
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
楼上正解。
其实不是王爽老师的书讲的不清楚,而是因为讲清楚了更加难以看明白。汇编语言更接近硬件,很多东西是要从其他的课程的学习中自己领会,再融汇贯通的……
内存的寻址有一些是通过硬件实现的,而不是说手动去设定什么。内存的编号也不是1、2、3、4之类的编号,而是各个线路的选通和截止来实现取某个字节或者某几个字节。
本来课本屏蔽了这些细节,方便让你掌握汇编。如果你真想知道,就像楼上说的,去看计算机组成原理便是。我们的教材是清华的,里面有很多细节容易忽略,也有几处前后矛盾的错误,建议你下载视频教程,自己看书确实会漏掉很多东西,外加书上的各种电路图也比较纠结。
而且,看这本书的电路图还需要些电路方面的基础知识,图符,电容的结构之类的,还是挺简单的……
祝楼主好运^_^)Y
2011-2-11 10:16
0
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=wulfalone;923849]最近看王爽的汇编语言,发现里面很多讲得不清不楚的,内存是都有地址编号吗?这个编号是怎么实现的?地址长度是多少?一个内存单元的长度究竟是多少啊?
mov ax,[0]
mov al,[0]
这两个指令书上说第一个是把DS:0开头的内容放入AX中,长度是一个字,这意思是不是就是把两个连续的内存单元...[/QUOTE]

内存是都有地址编号吗?
是的,都有编号,即内存地址。

这个编号是怎么实现的?
这个要去看《计算机组成原理》。

地址长度是多少?
你问的这个问题本身就有问题,现在的计算机都是16/32/64位的,地址长度是就可以是2/4/8字节。

一个内存单元的长度究竟是多少啊?
标准的基础问题,一个内存单元的可见长度是8bits,即一个字节。

mov ax,[0]
mov al,[0]
al,ax,eax实际上是同一个寄存器,eax是全长度32位,ax是指eax的低16位,al是指eax的低8位,汇编编译器会自动分析mov后面是ax还是al,从而决定从内存中取出几个字节。如果是al,就从0开始取出1个字节(内存单元0),如果是ax,就从0开始取出2个字节(内存单元0和1),如果是eax,就从0开始取出4个字节(内存单元0,1,2,3)。

这意思是不是就是把两个连续的内存单元...
这也是一个基础问题,可以参照《计算机体系结构》。现代计算机普遍是32位,所以一次存取必然是从偶数内存地址读取连续的32位(即连续的4个字节)比如说从地址0开始,一次将单元0,1,2,3全部读出,即使你只想要单元2,3组成的2字节,计算机还是会从单元0,1,2,3全部读出,再屏蔽掉单元0,1数据。

1楼说得很对,汇编涉及到很多底层知识,不像是高级语言一学就会,所以要学很多基础课程才能真正的理解和用好汇编语言。
2011-2-11 13:44
0
雪    币: 76
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主去学习一下《计算机组成原理》吧
2011-2-11 15:52
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很久以前学过。忘得差不多了。
2011-2-12 09:28
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上所有都为正解
看来还有基础比我还差的人混看雪啊,找到自信了,哈哈
2011-2-14 16:25
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
8
楼主成才的难度很大,你的老师肯定很辛苦。
2011-2-14 18:01
0
雪    币: 316
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=wulfalone;923849]最近看王爽的汇编语言,发现里面很多讲得不清不楚的,内存是都有地址编号吗?这个编号是怎么实现的?地址长度是多少?一个内存单元的长度究竟是多少啊?
mov ax,[0]
mov al,[0]
这两个指令书上说第一个是把DS:0开头的内容放入AX中,长度是一个字,这意思是不是就是把两个连续的内存单元...[/QUOTE]

1. 每个内存都有特定的地址编号,cpu的 cs ip 能映射到对应的内存地址。
2. 每个内存单元的的长度都是一个字节,就是8个二进制数,地址长度是由20个二进制数组成的(5个16进制数)。
每一个地址对应一个内存单元:比如 10000H表示一个字节的内存单元,10001H表示另一个内存单元节
3.ax是十六位的就是16个二进制数两个字节。 所以需要两个连续的内存单元也是两个字节。
  
我是新手,说错了不要喷我。。。。
2011-2-15 23:01
0
雪    币: 467
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼上说的很对呀
2011-2-15 23:17
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个说的很对。
2011-2-16 19:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
现在是DDR3 用不了几个月就是DDR4了
2011-2-16 21:03
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主用现在明白了吗

我也没看组成原理 这些很基础的 多看看就知道了
2011-2-16 23:52
0
游客
登录 | 注册 方可回帖
返回
//