. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点9.1-1的一个疑问  [待解决] 回复[ 39次 ]   点击[ 1913次 ]  
cdzjf
[帖 主]   [ 发表时间:2007-12-06 20:34 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
1)若要使jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据? 
完整程序如下: 

assume cs:code,ds:data 
data segment 
    (db 0,0,0 )
data ends 
code segment 
start:  mov ax,data 
    mov ds,ax 
    mov bx,0 
    jmp word ptr [bx+1]
 code ends 
end start

1.CS:IP指向程序的第一条指令,第一条指令是从那里开始算的啊?都是从code segment开始算的吗?

2.开始定义了3个为0的字节数据,而后jmp word ptr [bx+1]又是一个字,应该占用2个字节,当仅仅是bx的时候应该是0000H(前面的两个0)bx+1以后则为00?(应该为第3和第4个0)怎么程序中只有3个0?

3.既然jmp word ptr [bx+1]是一个字,那为什么开头不用dw 0,0或者dd 0更为简单些呢?
cdzjf
[第1楼]   [ 回复时间:2007-12-06 20:49 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
还有一个问题,假设这是一个完整的程序,程序的第4行就是jmp word ptr [bx+1],也就是说他将CS:IP指向了第一条mov ax,data ,这个程序不就是个死循环吗?永远也跳不出来,也就是我们说的当机了?
cdzjf
[第2楼]   [ 回复时间:2007-12-12 23:11 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
?????
goal00001111
[第3楼]   [ 回复时间:2007-12-13 22:38 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16
确实是死机了!
很明显,我们只要让[bx+1]=0就可以使ip=0,从而让CS:IP指向程序的第一条指令。
所以data段中应该定义位:dd 0或者dw 0, 0或者db ?, 0, 0,。(其中?表示占位符,值未确定)
gdongyong
[第4楼]   [ 回复时间:2007-12-14 10:14 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-11-28 12:32
我按楼主的程序,编译却是出现错误!!
还有是跳不出来了!!
cdzjf
[第5楼]   [ 回复时间:2007-12-17 12:22 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
1.CS:IP指向程序的第一条指令,第一条指令是从那里开始算的啊?都是从code segment开始算的吗? 

2.开始定义了3个为0的字节数据,而后jmp word ptr [bx+1]又是一个字,应该占用2个字节,当仅仅是bx的时候应该是0000H(前面的两个0)bx+1以后则为00?(应该为第3和第4个0)怎么程序中只有3个0? 

3.既然jmp word ptr [bx+1]是一个字,那为什么开头不用dw 0,0或者dd 0更为简单些呢?
32424
[第6楼]   [ 回复时间:2007-12-18 00:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-12 16:30
1.第一条指令是从mov ax,data开始算
2.jmp word ptr [bx+1]是一个字,应该占用2个字节,这一点你没说错.但bx+1却是偏移一个字节,而不是一个字
3.开头用dw 0,0或者dd 0也是可以的,但这样要占用4个字节的空间,而db 0,0,0看似麻烦却只占用3个字节.这样显的更加严谨
linux
[第7楼]   [ 回复时间:2007-12-25 14:33 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-13 11:02
楼上正解!
huibian
[第8楼]   [ 回复时间:2007-12-25 15:20 ]   [引用]   [回复]   [ top ] 
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41
程序中没有返回

mov ax,4c00h
int 21h
cdzjf
[第9楼]   [ 回复时间:2007-12-27 00:36 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
2.jmp word ptr [bx+1]是一个字,应该占用2个字节,这一点你没说错.但bx+1却是偏移一个字节,而不是一个字 

这段回答有点不理解,可否说一下,谢谢
cdzjf
[第10楼]   [ 回复时间:2008-01-02 14:32 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
可否说一下
zhuzhu
[第11楼]   [ 回复时间:2008-01-02 15:46 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33
ds:[bx+1]指向的是一个内存地址,bx+1的取值应该是0~ffffh的任意一个值。不要被bx后面的+1迷惑了。

楼上的再好好想想。
zhuzhu
[第12楼]   [ 回复时间:2008-01-02 15:55 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33
楼主可以在博客里面写些学习汇编过程中的问题和感想。

并且博客中也有对发帖有新回复的"提示功能",对论坛帖子的动态也有个方便了解的途径。
cdzjf
[第13楼]   [ 回复时间:2008-01-03 15:48 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
也就是说jmp word ptr [bx+1]是一个字,应该占用2个字节,与jmp word ptr [bx]在占用上都是2个字节,没有什么差别
huibian
[第14楼]   [ 回复时间:2008-01-04 17:39 ]   [引用]   [回复]   [ top ] 
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41
bx+1只是标明了一个地址的位置,jmp word ptr [..]肯定会读一个字的。
huibian
[第15楼]   [ 回复时间:2008-01-04 17:40 ]   [引用]   [回复]   [ top ] 
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41
那如果bx+1=ffffh,那jmp word ptr [..],会怎么读取一个字呢?刚想到的;-)
huibian
[第16楼]   [ 回复时间:2008-01-07 17:26 ]   [引用]   [回复]   [ top ] 
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41
没人给做个小实验啊 ;)
zkkpkk
[第17楼]   [ 回复时间:2008-01-17 23:34 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:8
注册日期:2008-01-12 10:11
说跳不出来的同学不要急,本来就知道它跳不出来,你们没看见连mov ax,4c00h int 21h都没有吗?
zkkpkk
[第18楼]   [ 回复时间:2008-01-17 23:42 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:8
注册日期:2008-01-12 10:11
[bx+1]也就是用ds:1和ds:2作为偏移和段地址
所以db 0,0,0就行
wesom
[第19楼]   [ 回复时间:2008-01-29 00:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-01-06 17:59
db 0
dw start
该方式也可以
huibinfog
[第20楼]   [ 回复时间:2008-02-01 12:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-01-17 15:56
各位好!我是新人我想问下!为什么jmp word ptr [bx+1] 啊?[bx+1]代表什么意思呢?默认的应该是从0开的吧!!是不是应该是bx+0呢?
cdzjf
[第21楼]   [ 回复时间:2008-02-28 00:37 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28
楼上的问题,这里说的是BX+1也就是把他的值加1,那个+0还有什么意义呢?
tomato
[第22楼]   [ 回复时间:2008-03-14 18:24 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
To 20楼:
jmp word ptr [bx+1]这条指令中word说明是近转移 这句话的意思是指将[bx+1]内存单元的字数据也就是[bx+1][bx+2]这两个字节单元,给了ip,也就是要跳转到的内存单元的偏移地址。20楼是不是认为是[bx+0][bx+1]这两个单元呢?那就理解错了,应该是[bx+1][bx+2]这两个内存单元。
cx_jin
[第23楼]   [ 回复时间:2008-06-19 09:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-06-04 13:41
支持第6楼、第22楼
win_h
[第24楼]   [ 回复时间:2008-06-21 21:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-04-21 18:51
用心学习!支持!支持!
love710510
[第25楼]   [ 回复时间:2008-06-26 09:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-06-16 12:50
也可以用 db 3 dup (0) 的
zzxjypm
[第26楼]   [ 回复时间:2008-07-28 21:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-03 16:13
樓上的,不拘一格降人才。

確實可以
yesialy
[第27楼]   [ 回复时间:2008-07-30 16:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-07-30 16:33
如果说第一条指令是从mov ax,data开始算的话,LZ给出来的程序就是错的,当运行到jmp word ptr [bx+1]
(BX+1)是等于0的,也就是说程序跳到了data segment, 所以data segment应该为db 0,3,0这个程序最终确实是死循环,并且9.2没办法解出来。假设作者的题目没有出错,并且LZ的答案是正确的话,唯一合理的解释就是第一条指令是从data segment开始的。
yesialy
[第28楼]   [ 回复时间:2008-07-30 17:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-07-30 16:33
上面说错了,是9.1(2)不是9.2,是我错了,作者的题目没问题,但是这两个程序确实是死循环,不管你有没有程序返回
fontomas
[第29楼]   [ 回复时间:2008-08-11 05:27 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
程序的入口是end所指示的start标号处,所以第一条指令应该是start标号处的指令。
因此9.1(2)也没有错,data段中的数据无关紧要,只要IP=0就达到题目的要求了。
debugk
[第30楼]   [ 回复时间:2008-08-22 19:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-06-13 10:30
data段的数据无所谓,只要第2、3个数据为0即可,你定义db 0或者db 16 dup (0)效果一样,因为系统会自动用0填充剩下的15个字节。
hino
[第31楼]   [ 回复时间:2008-08-26 23:12 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:3
注册日期:2008-06-22 20:23
To 11楼
ds:[bx+1]指向的是一个内存地址,bx+1的取值应该是0~ffffh的任意一个值。不要被bx后面的+1迷惑了。

楼上的再好好想想。

------------------------------------
我的答案是 db 3 dup (0)

不知道你的 "bx+1的取值应该是0~ffffh的任意一个值"是什么意思? 
bx=0,bx+1=1。不是跳到ds:[1]开始的两个字节指定的IP位置吗?
hino
[第32楼]   [ 回复时间:2008-08-26 23:14 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:3
注册日期:2008-06-22 20:23
另外这些题目差不多全是死循环,不正常是正常的。
394196727
[第33楼]   [ 回复时间:2009-07-21 10:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-15 10:50
经调试,30楼的是正解。
largeboss
[第34楼]   [ 回复时间:2009-08-15 19:31 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-08-02 15:49
学习!
springaccount
[第35楼]   [ 回复时间:2009-09-18 21:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-15 23:24
dd 0可以执行 我试过了
asmzzj1
[第36楼]   [ 回复时间:2009-10-03 00:06 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2009-08-27 21:35
支持第6楼、第22楼、第30楼
hdming88
[第37楼]   [ 回复时间:2009-10-03 22:47 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:8
注册日期:2009-09-30 22:35
偏移地址是字节的偏移,但是这道题中jmp word ptr [bx+1],意思这里的偏移地址已经变为以bx+1为起始的一个字,bx+1和bx+2.而bx+0没有改变为一个字节。所以我们定义为db 0,0,0
heiok.com
[第38楼]   [ 回复时间:2009-11-18 13:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
我填的是:dw 10

也调试成功.不是吗?
heroyi07
[第39楼]   [ 回复时间:2009-12-07 00:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-11 09:16
mov bx,0 
说明bx=0了
 jmp word ptr [bx+1] 中[bx+1]就是[1],是一个字,它们由两个字节组成:ds:[1],和ds[2]
ds:[1],和ds[2]内存中的数据就是做为跳到地址的偏移地址,很明显在定义中这两个字节中的内容都为0
所以CS:IP将指向第一条指令
因此我们在定义的时候只要保证第二和第三字节中的数据时0就可以了
如db ?,0,0,?,?也行,问号表明这个字节中的数据随便取
还有这些检测考的是对JMP的掌握,题目中的程序并不是一个完整的程序
因此对该程序是不是死循环不要去考虑
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved