|
主题 : : 看看检测3.1第2题的答案是否正确? [待解决] |
回复[ 16次 ]
点击[ 852次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-03-12 23:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-11-03 14:23 |
指令序列↓ 寄存器→ CS IP DS AX BX
初始值→ 2000H 0000 1000H 0 0
mov ax,6622h 2000H 0003 1000H 6622H 0000
jmp 0ff0:0100 1000H 0000 1000H 6622H 0000
mov ax,2000h 1000H 0003 1000H 2000H 0000
mov ds,ax 1000H 0005 2000H 2000H 0000
mov ax,[0008] 1000H 0008 2000H C389H 0000
mov ax,[0002] 1000H 000B 2000H EA66H 0000
我通过DEBUG 后和答案不一样,主要是JMP那块有些疑惑,请高手请教! | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-03-13 00:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-07 20:58 |
我的答案是这样,供探讨:
mov ax,6622h cs=2000h ip=0003h ds=1000h ax=6622h bx=0000h
jmp 0ff0:0100 cs=0ff0h ip=0100h ds=1000h ax=6622h bx=0000h
mov ax,2000h cs=0ff0h ip=0103h ds=1000h ax=2000h bx=0000h
mov ds,ax cs=0ff0h ip=0105h ds=2000h ax=2000h bx=0000h
mov ax,[0008] cs=0ff0h ip=0108h ds=2000h ax=c189h bx=0000h
mov ax,[0002] cs=0ff0h ip=010bh ds=2000h ax=ea66h bx=0000h
我通过debug发现是一样的 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-03-13 11:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-11-03 14:23 |
噢.对了,原来网上的答案错了,我也用DEBUG调试了. | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-03-24 01:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-03-22 13:14 |
我觉得这条:mov ax,[0008] cs=0ff0h ip=0108h ds=2000h ax=c189h bx=0000h
ax应该等于e189吧?2000H+C189=E189啊 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-03-24 01:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-03-22 13:14 |
|
|
|
|
|
[第5楼]
[ 回复时间:2008-03-25 18:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-23 16:07 |
|
|
|
|
|
[第6楼]
[ 回复时间:2008-04-08 22:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-11 17:42 |
回复:[第5楼]
------------------
我是这样理解的:
首先指令从cs:ip处开始执行~本题中,CS=2000 IP=0
则从物理地址20000H处开始执行,20000H中存放的数据相应的汇编语句是:mov ax,6622H
所以首先执行mov ax,6622H 执行完后,CS不变,IP+3 IP=0003H
然后执行2000:0003中的程序:jmp 0ff0:0100 本条语句的意思是更改CS和IP的值,使CS=0ff0,IP=0100
执行完这条语句后,程序便转向物理地址为0ff00+0100=10000H处,于是执行语句mov ax,2000H ip+3=0103h;再执行mov ds,ax ip+2=0105h;此时dx变成2000H 再依次执行mov ax,[0008];mov ax,[0002]
其中ax中的值便是2000:0008即:20008中的值:c189H
以及2000:0002 即:20002中的值:ea66 | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-04-24 14:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-26 17:59 |
|
|
|
|
|
[第8楼]
[ 回复时间:2008-04-26 10:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41 |
计算机就是最好的老师,这本是原本就没有答案,现在所谓的答案也是以前的学习者做的,错误也在所难免,况且有的答案也是没有固定答案的。
相信自己,相信计算机,不知道对错,debug一下,自己写个小程序验证一下... | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-05-12 00:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-05-04 08:14 |
各位老大,我想到脑袋都爆了,那条mov bx,ax在哪里被执行的啊? | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-05-12 13:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:0
注册日期:2008-01-29 17:57 |
mov bx,ax 没有被执行到,所以就不用写执行它后的寄存器内容了。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2008-05-13 09:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34 |
debug一下就知道什么指令执行了,和不执行了:-) | | |
|
|
|
|
[第12楼]
[ 回复时间:2008-05-25 22:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-05-21 20:31 |
嗯 看了一下答案,有处明显错误。
mov ax,[0008] cs=0ff0h ip=0108h ds=2000h ax=c389h bx=0000h
--------------------------------------------------------------------------
ax=c189
其实有个难点就是 mov ax,[0008] 到这了
20008H 89
20009H c1 mov bx,ax
可能是汇编指令迷惑了大家
机器比较死板,直接把[0008]中的内容 c189 直接转入 ax
这也就是作者为什么提问: 数据和程序为什么有区别? cs:ip 没指向那里,直接作数据处理。
---------------------------------------------------------------------------------
欢迎讨论.... | | |
|
|
|
|
[第13楼]
[ 回复时间:2008-07-17 23:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-17 17:41 |
终于找到答案了,我正为这个问题犯愁呢?多谢各位!!! | | |
|
|
|
|
[第14楼]
[ 回复时间:2008-09-10 17:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
AX=EA66 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=0000 NV UP DI PL NZ AC PO CY
1000:0000 B80020 MOV AX,2000
-t
AX=2000 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=0003 NV UP DI PL NZ AC PO CY
1000:0003 8ED8 MOV DS,AX
-t
AX=2000 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=0005 NV UP DI PL NZ AC PO CY
1000:0005 A10800 MOV AX,[0008] DS:0008=C1
-t
AX=C189 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=0008 NV UP DI PL NZ AC PO CY
1000:0008 A10200 MOV AX,[0002] DS:0002=EA
-t
AX=EA66 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=000B NV UP DI PL NZ AC PO CY
1000:000B 7439 JZ 0046
-t
AX=EA66 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=000D NV UP DI PL NZ AC PO CY
1000:000D 3CCC CMP AL,CC
-t
AX=EA66 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=000F OV UP DI NG NZ AC PE CY
1000:000F 7455 JZ 0066
-t
AX=EA66 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=0011 OV UP DI NG NZ AC PE CY
1000:0011 3CCD CMP AL,CD
-
我晕了。。执行到mov ax,[0002] 你们的AX=6622,而我认为是ax=ea66,DEBUG 出来也如我想的。。。。怎么会这样? | | |
|
|
|
|
[第15楼]
[ 回复时间:2008-09-10 17:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
1000:0005 A10800 MOV AX,[0008] DS:0008=C189(复制时没复制出来)
-t
AX=C189 BX=5D24 CX=FF20 DX=0001 SP=FFE2 BP=0000 SI=0000 DI=0002
DS=2000 ES=1481 SS=1481 CS=1000 IP=0008 NV UP DI PL NZ AC PO CY
1000:0008 A10200 MOV AX,[0002] DS:0002=EA66(复制时没复制出来)
-t
造成的结果就是,执行完mov ax,[0002],继续执行的CS=1000,IP=0008后续代码 = =~ | | |
|
|
|
|
[第16楼]
[ 回复时间:2008-09-10 17:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
问题找到了 = =
CS初试值是2000,我是从1000开始执行的。。。。 | | |