|
主题 : : 段寄存器与内存地址间的赋值问题! [待解决] |
回复[ 9次 ]
点击[ 512次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-02-10 15:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
通过第三章第四节的学习,我们知道了mov、add、sub等指令的操作数有多种格式,以传送指令mov为例,我们由“mov 内存地址,寄存器“的形式推出:"mov 内存地址,段寄存器“应该是正确的形式,可是按书上的实验,当我用debug亲自测试时却得不出正确的结果,不知道是哪里出了问题,还请同学和老师给予指正:),谢谢! | | |
|
|
|
|
[第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..<
- | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-02-10 15:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
在运行完mov [0],cs指令后,地址1000:0处的值应该是81 13,才是合理的结果吧? | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-02-11 09:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
各位老师同学大家好,麻烦你们,谁能帮我解答一下,依据书中的例子,执行完,mov [0],cs指令后,为什么段寄存器cs的内容没有存到指定的内存位置(1000:0)呢??? | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-02-12 08:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
|
|
|
|
|
[第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。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-02-12 18:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
谢谢楼上朋友给予的解答,我的问题解决了,我在家里测试成功了,我发现可能是我单位的电脑有点问题,当我将cs:ip指向指令所在位置并执行时,系统尽然给出了错误提示,说是无法识别的指令强行退出debug.可是我在家里测试却顺利通过了:) | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-10-25 21:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-16 16:56 |
系统执行的是1381H处的指令,执行前需要JMP 2000:0 | | |
|
|
|
|
[第8楼]
[ 回复时间:2013-01-01 19:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-01 17:35 |
段寄存器只能和寄存器AX打交道,立即数不行,其他寄存器也不行(8086是这样但现在的CPU可能允许和其他寄存器),寄存器是物理存在的,一般人可能会把它想象成高级语言中的变量,以为BX,CX,DX是另一些变量,其实这是物理存在的硬件。比如端口操作时要用寄存器DX,你用AX就无法实现。道理是一样的。
总之,寄存器是物理存在的硬件 每一个都有专门的定义 而不是象程序中的变量一样可以任何指定
这也能体现出汇编语言是和硬件打交道的一些特征。 | | |
|
|
|
|
[第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 操作 | | |