|
主题 : : 我狂郁闷啊 有没有比较了解cpu的高手进来指点下最好是老师级别的。。。。!!! [待解决] |
回复[ 9次 ]
点击[ 561次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-04-20 13:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05 |
内存中的一个段是16个字节的 实际上是由2个 8字节的 小段组成的
比如 00 01 02 03 04 05 06 07-08 09 0a 0b 0c 0d 0e 0f
问题来了
我发现我写的汇编指令 每个指令的范围是0~7 也就8个字节
那么如果 我写了3个连续汇编指令 每个指令大小是三个字节 即按数序占9个字节大小
那么问题就来了
指令一 的指令内存地址是 0~3
指令二 的指令内存地址是 0~6
指令三 的指令内存地址是 7~8
指令四 的指令内存地址是 9
而原本7~9是一个整体指令 现在被分成2个指令 导致接下去的指令全乱了 请问这是什么原因啊??? | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-04-20 16:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
内存中的一个段是16个字节的 实际上是由2个 8字节的 小段组成的
比如 00 01 02 03 04 05 06 07-08 09 0a 0b 0c 0d 0e 0f
-----------------
首先是楼主对段的概念理解错了。段大小只能是16字节码?
在屏幕上,一行总要显示一定数目的字符(太多了无法显示),debug下一行显示16个字节,中间的“-”不过是为了观看方便而已。
下面是debug的截图:
-a
0C2F:0100 mov ax,0
0C2F:0103 mov bx,1
0C2F:0106 mov cx,2
0C2F:0109
-d
0C2F:0100 B8 00 00 BB 01 00 B9 02-00 21 C6 06 D1 96 00 E9 .........!......
0C2F:0110 57 FA E9 AE FE 24 0C 7A-10 50 24 08 34 00 1E 0C W....$.z.P$.4...
0C2F:0120 24 04 A2 D8 99 08 06 D2-99 A0 D8 99 0A C0 C3 80 $...............
0C2F:0130 3E B7 98 FF 75 0C BF E1-94 BD B7 98 E8 11 01 E8 >...u...........
0C2F:0140 74 E4 32 C0 86 06 16 99-0A C0 75 03 E9 8C 00 8B t.2.......u.....
0C2F:0150 36 B9 98 BF 76 97 B8 00-29 CD 21 80 3C 00 74 06 6...v...).!.<.t.
0C2F:0160 BA 92 8A E9 53 FF A1 BC-98 80 FC 3A 74 02 B0 40 ....S......:t..@
0C2F:0170 8A 0E D8 99 0C 20 2C 60-A2 76 97 A0 BB 98 8A 26 ..... ,`.v.....&
-u
0C2F:0100 B80000 MOV AX,0000
0C2F:0103 BB0100 MOV BX,0001
0C2F:0106 B90200 MOV CX,0002 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-04-20 17:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05 |
我觉得你的观点也不对。
段是人管理内存的方式,通过寄存器调用,让cpu对不同段的二进制信息采取不同的处理方式,内存自然是不分段的。
但我说的段 是cpu对内存的分段,他就默认一个段是16字节的并且每个段都是16的倍数
我出个题目来证明
你能把 10000H~10007H 和10008H~1000FH“这2段地址"分别 送入ds和ss吗
如果你能 那么我承认 段是不分大小的
如果不能 那么你要承认 段是分大小的!!!!而且必须是16的倍数最小段为16字节。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-04-20 17:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05 |
这个问题是在是不好讨论 我自己想了下 你说的有道理 我说的也不矛盾
王爽老师的教材上这个部分一直都是矛盾不明确的,不同的角度去看答案也不同估计王爽老师来了也搞不清楚了。 记得有一道检测题答案是 一个段的最小长度是16 以这个角度去看 每个段则必须是16的倍数
自然 一个长度为16段是不可能被拆分为2个段的 | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-05-02 20:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-01-24 20:56 |
晕 我看的都有点头晕了,这什么跟什么啊 有这么理解的么
什么每个段必须是16的倍数,不要深刻去理解这东西 没用
段是自己设置的比如说
mov ax,立即数 ←这里的立即数不一定要16的倍数,任何数都可以
mov ds,ax 这样段就设置好了.... | | |
|
|
|
|
[第5楼]
[ 回复时间:2012-07-09 15:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-06-11 21:15 |
一看楼主的标题就知道楼主是个自大的家伙,看了叙述果然如此,说了一堆听不懂的话,还侮辱王爽老师,自以为是,没有一点自知之明,我觉得楼主还是去学习文科的东西比较合适 | | |
|
|
|
|
[第6楼]
[ 回复时间:2012-07-18 00:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-28 13:28 |
你能把 10000H~10007H 和10008H~1000FH“这2段地址"分别 送入ds和ss吗
如果你能 那么我承认 段是不分大小的
如果不能 那么你要承认 段是分大小的!!!!而且必须是16的倍数最小段为16字节。
不太明白楼主的意思,16位的段地址当然会是16的倍数,不然怎么去移位求实际上的地址?
但段所谓的大小(大于16字节和小于64kb(设在16位机上))只要在这个范围内,你自己代码里认为是多大的空间就是多大吧?
把 10000H~10007H 和10008H~1000FH“这2段地址"分别 送入ds和ss
这个为什么不能?
以下我试了,
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1418 ES=1418 SS=1418 CS=2000 IP=0000 NV UP EI PL NZ NA PO NC
2000:0000 B80010 MOV AX,1000
-t
AX=1000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1418 ES=1418 SS=1418 CS=2000 IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 8ED8 MOV DS,AX
-t
AX=1000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1000 ES=1418 SS=1418 CS=2000 IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 B80010 MOV AX,1000
-t
AX=1000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1000 ES=1418 SS=1418 CS=2000 IP=0008 NV UP EI PL NZ NA PO NC
2000:0008 8ED0 MOV SS,AX
-t
AX=1000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1000 ES=1418 SS=1000 CS=2000 IP=000C NV UP EI NG NZ NA PE NC
2000:000C 0000 ADD [BX+SI],AL DS:0000=E8
最后 ds=1000, ss=1000的段地址,两个段地址是一样的,
如果DS与CS的段地址相同就会报错。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-07-18 00:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-28 13:28 |
|
|
|
|
|
[第8楼]
[ 回复时间:2012-07-19 21:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-07-18 22:23 |
|
|
|
|
|
[第9楼]
[ 回复时间:2013-01-01 19:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35 |
一个段最大有65536个字节,也就是64K,每个段址相差1的话则内存地址相差16字节,也就是段是可重叠的
段的开始位址的内存地址必须是16的整数倍 | | |