. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我狂郁闷啊 有没有比较了解cpu的高手进来指点下最好是老师级别的。。。。!!!  [待解决] 回复[ 9次 ]   点击[ 561次 ]  
zhenglxd
[帖 主]   [ 发表时间: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个指令 导致接下去的指令全乱了 请问这是什么原因啊???
mess
[第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
zhenglxd
[第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字节。
zhenglxd
[第3楼]   [ 回复时间:2009-04-20 17:19 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
这个问题是在是不好讨论 我自己想了下 你说的有道理 我说的也不矛盾
王爽老师的教材上这个部分一直都是矛盾不明确的,不同的角度去看答案也不同估计王爽老师来了也搞不清楚了。 记得有一道检测题答案是 一个段的最小长度是16 以这个角度去看 每个段则必须是16的倍数
自然 一个长度为16段是不可能被拆分为2个段的
bade90
[第4楼]   [ 回复时间:2009-05-02 20:58 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2009-01-24 20:56
晕 我看的都有点头晕了,这什么跟什么啊 有这么理解的么

什么每个段必须是16的倍数,不要深刻去理解这东西 没用

段是自己设置的比如说
mov ax,立即数 ←这里的立即数不一定要16的倍数,任何数都可以
mov ds,ax 这样段就设置好了....
zhang898600
[第5楼]   [ 回复时间:2012-07-09 15:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-06-11 21:15
一看楼主的标题就知道楼主是个自大的家伙,看了叙述果然如此,说了一堆听不懂的话,还侮辱王爽老师,自以为是,没有一点自知之明,我觉得楼主还是去学习文科的东西比较合适
jhting
[第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的段地址相同就会报错。
jhting
[第7楼]   [ 回复时间:2012-07-18 00:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-28 13:28
我晕,回答到一个2009年的贴子
110011001110
[第8楼]   [ 回复时间:2012-07-19 21:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-07-18 22:23
楼主思想不错,可以去写花指令了
mengdana
[第9楼]   [ 回复时间:2013-01-01 19:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35
一个段最大有65536个字节,也就是64K,每个段址相差1的话则内存地址相差16字节,也就是段是可重叠的
段的开始位址的内存地址必须是16的整数倍
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved