|
主题 : : 检测点9.1-1的一个疑问 [待解决] |
回复[ 39次 ]
点击[ 1913次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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更为简单些呢? | | |
|
|
|
|
[第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 ,这个程序不就是个死循环吗?永远也跳不出来,也就是我们说的当机了? | | |
|
|
|
|
[第2楼]
[ 回复时间:2007-12-12 23:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28 |
|
|
|
|
|
[第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,。(其中?表示占位符,值未确定) | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-12-14 10:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2007-11-28 12:32 |
我按楼主的程序,编译却是出现错误!!
还有是跳不出来了!! | | |
|
|
|
|
[第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更为简单些呢? | | |
|
|
|
|
[第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个字节.这样显的更加严谨 | | |
|
|
|
|
[第7楼]
[ 回复时间:2007-12-25 14:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2007-12-13 11:02 |
|
|
|
|
|
[第8楼]
[ 回复时间:2007-12-25 15:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41 |
程序中没有返回
mov ax,4c00h
int 21h | | |
|
|
|
|
[第9楼]
[ 回复时间:2007-12-27 00:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28 |
2.jmp word ptr [bx+1]是一个字,应该占用2个字节,这一点你没说错.但bx+1却是偏移一个字节,而不是一个字
这段回答有点不理解,可否说一下,谢谢 | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-01-02 14:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28 |
|
|
|
|
|
[第11楼]
[ 回复时间:2008-01-02 15:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33 |
ds:[bx+1]指向的是一个内存地址,bx+1的取值应该是0~ffffh的任意一个值。不要被bx后面的+1迷惑了。
楼上的再好好想想。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2008-01-02 15:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33 |
楼主可以在博客里面写些学习汇编过程中的问题和感想。
并且博客中也有对发帖有新回复的"提示功能",对论坛帖子的动态也有个方便了解的途径。 | | |
|
|
|
|
[第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个字节,没有什么差别 | | |
|
|
|
|
[第14楼]
[ 回复时间:2008-01-04 17:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41 |
bx+1只是标明了一个地址的位置,jmp word ptr [..]肯定会读一个字的。 | | |
|
|
|
|
[第15楼]
[ 回复时间:2008-01-04 17:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41 |
那如果bx+1=ffffh,那jmp word ptr [..],会怎么读取一个字呢?刚想到的;-) | | |
|
|
|
|
[第16楼]
[ 回复时间:2008-01-07 17:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:117
信誉值:2
注册日期:2007-09-04 10:41 |
|
|
|
|
|
[第17楼]
[ 回复时间:2008-01-17 23:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:8
注册日期:2008-01-12 10:11 |
说跳不出来的同学不要急,本来就知道它跳不出来,你们没看见连mov ax,4c00h int 21h都没有吗? | | |
|
|
|
|
[第18楼]
[ 回复时间:2008-01-17 23:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:8
注册日期:2008-01-12 10:11 |
[bx+1]也就是用ds:1和ds:2作为偏移和段地址
所以db 0,0,0就行 | | |
|
|
|
|
[第19楼]
[ 回复时间:2008-01-29 00:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-06 17:59 |
|
|
|
|
|
[第20楼]
[ 回复时间:2008-02-01 12:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-01-17 15:56 |
各位好!我是新人我想问下!为什么jmp word ptr [bx+1] 啊?[bx+1]代表什么意思呢?默认的应该是从0开的吧!!是不是应该是bx+0呢? | | |
|
|
|
|
[第21楼]
[ 回复时间:2008-02-28 00:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:6
注册日期:2007-11-14 11:28 |
楼上的问题,这里说的是BX+1也就是把他的值加1,那个+0还有什么意义呢? | | |
|
|
|
|
[第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]这两个内存单元。 | | |
|
|
|
|
[第23楼]
[ 回复时间:2008-06-19 09:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-06-04 13:41 |
|
|
|
|
|
[第24楼]
[ 回复时间:2008-06-21 21:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-04-21 18:51 |
|
|
|
|
|
[第25楼]
[ 回复时间:2008-06-26 09:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-06-16 12:50 |
|
|
|
|
|
[第26楼]
[ 回复时间:2008-07-28 21:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-03 16:13 |
|
|
|
|
|
[第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开始的。 | | |
|
|
|
|
[第28楼]
[ 回复时间:2008-07-30 17:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-07-30 16:33 |
上面说错了,是9.1(2)不是9.2,是我错了,作者的题目没问题,但是这两个程序确实是死循环,不管你有没有程序返回 | | |
|
|
|
|
[第29楼]
[ 回复时间:2008-08-11 05:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
程序的入口是end所指示的start标号处,所以第一条指令应该是start标号处的指令。
因此9.1(2)也没有错,data段中的数据无关紧要,只要IP=0就达到题目的要求了。 | | |
|
|
|
|
[第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个字节。 | | |
|
|
|
|
[第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位置吗? | | |
|
|
|
|
[第32楼]
[ 回复时间:2008-08-26 23:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:3
注册日期:2008-06-22 20:23 |
|
|
|
|
|
[第33楼]
[ 回复时间:2009-07-21 10:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-15 10:50 |
|
|
|
|
|
[第34楼]
[ 回复时间:2009-08-15 19:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-08-02 15:49 |
|
|
|
|
|
[第35楼]
[ 回复时间:2009-09-18 21:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-15 23:24 |
|
|
|
|
|
[第36楼]
[ 回复时间:2009-10-03 00:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2009-08-27 21:35 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第38楼]
[ 回复时间:2009-11-18 13:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01 |
|
|
|
|
|
[第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的掌握,题目中的程序并不是一个完整的程序
因此对该程序是不是死循环不要去考虑 | | |