. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  段寄存器与内存地址间的赋值问题!  [待解决] 回复[ 9次 ]   点击[ 512次 ]  
cfcxg
[帖 主]   [ 发表时间:2009-02-10 15:19 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
通过第三章第四节的学习,我们知道了mov、add、sub等指令的操作数有多种格式,以传送指令mov为例,我们由“mov 内存地址,寄存器“的形式推出:"mov 内存地址,段寄存器“应该是正确的形式,可是按书上的实验,当我用debug亲自测试时却得不出正确的结果,不知道是哪里出了问题,还请同学和老师给予指正:),谢谢!
cfcxg
[第1楼]   [ 回复时间:2009-02-10 15:24 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
这是测试结果:
-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1381  ES=1381  SS=1381  CS=1381  IP=0100   NV UP EI PL NZ NA PO NC
1381:0100 0000          ADD     [BX+SI],AL                         DS:0000=CD
-r ds
DS 1381
:1000
-a 2000:0
2000:0000 mov [0],cs
2000:0004
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1000  ES=1381  SS=1381  CS=1381  IP=0102   NV UP EI PL NZ NA PE NC
1381:0102 0000          ADD     [BX+SI],AL                         DS:0000=48
-d 1000:0
1000:0000  48 00 B0 2C AA A0 A8 56-BE 84 3C 80 3E A6 56 01   H..,...V..<.>.V.
1000:0010  75 03 BE 94 3C 98 03 F0-03 F0 A5 C3 D0 E8 D0 E8   u...<...........
1000:0020  D0 E8 24 03 BE A4 3C EB-EC 24 07 EB E5 C6 06 A6   ..$...<..$......
1000:0030  56 01 E8 15 00 B0 2C AA-A0 A8 56 EB E5 E8 0D FF   V.....,...V.....
1000:0040  E8 DF FF C6 06 A6 56 01-EB 10 E8 00 FF EB 0E C6   ......V.........
1000:0050  06 A6 56 01 E8 F6 FE E8-AB FF B0 2C AA 80 3E A9   ..V........,..>.
1000:0060  56 03 A0 A7 56 74 A1 33-DB C6 06 AA 56 03 C6 05   V...Vt.3....V...
1000:0070  5B 47 3C 06 75 07 80 3E-A9 56 00 74 54 8A D0 3C   [G<.u..>.V.tT..<
-
cfcxg
[第2楼]   [ 回复时间:2009-02-10 15:25 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
在运行完mov [0],cs指令后,地址1000:0处的值应该是81 13,才是合理的结果吧?
cfcxg
[第3楼]   [ 回复时间:2009-02-11 09:21 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
各位老师同学大家好,麻烦你们,谁能帮我解答一下,依据书中的例子,执行完,mov [0],cs指令后,为什么段寄存器cs的内容没有存到指定的内存位置(1000:0)呢???
cfcxg
[第4楼]   [ 回复时间:2009-02-12 08:57 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
为什么没人回签我呢?,是问题不明确吗!
mess
[第5楼]   [ 回复时间:2009-02-12 10:09 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
-r ds 
DS 1381 
:1000 
-a 2000:0 
2000:0000 mov [0],cs 
2000:0004
-------------
这里设置ds=1000H,后面的查看结果相对应,这个是对的。
这里把mov [0],cs放在了2000:0处,但是下面执行t命令并不是执行的这个代码(t命令前可以用r查看一下)。要想从2000:0开始执行,需要让cs:ip指向20000H。
cfcxg
[第6楼]   [ 回复时间:2009-02-12 18:22 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
谢谢楼上朋友给予的解答,我的问题解决了,我在家里测试成功了,我发现可能是我单位的电脑有点问题,当我将cs:ip指向指令所在位置并执行时,系统尽然给出了错误提示,说是无法识别的指令强行退出debug.可是我在家里测试却顺利通过了:)
xuer2016
[第7楼]   [ 回复时间:2012-10-25 21:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-10-16 16:56
系统执行的是1381H处的指令,执行前需要JMP 2000:0
mengdana
[第8楼]   [ 回复时间:2013-01-01 19:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35
段寄存器只能和寄存器AX打交道,立即数不行,其他寄存器也不行(8086是这样但现在的CPU可能允许和其他寄存器),寄存器是物理存在的,一般人可能会把它想象成高级语言中的变量,以为BX,CX,DX是另一些变量,其实这是物理存在的硬件。比如端口操作时要用寄存器DX,你用AX就无法实现。道理是一样的。

总之,寄存器是物理存在的硬件 每一个都有专门的定义 而不是象程序中的变量一样可以任何指定

这也能体现出汇编语言是和硬件打交道的一些特征。
stop1204
[第9楼]   [ 回复时间:2013-04-23 21:46 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
mov 内存地址,寄存器      →  这样写是错误的 , 或许是你打错了 
其实是  mov 内存单元,寄存器           mov [0],ax
而  [0] 的段地址 是取自 DS 的值  

如果 DS =1000      而 1000:50   单元处的值是 FFFF
则  mov [50],ax      (解释为:mov 1000:50,ax,但不可这样写)     ax = FFFF

内存地址只能用于单个对象操作,现在就知道 jmp 1000:50  这样的, 
mov add sub 必须使用 [] 中括号格式,根据DS  操作
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved