. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  对检测点9.1的一个疑问  [待解决] 回复[ 10次 ]   点击[ 890次 ]  
woshihuo12
[帖 主]   [ 发表时间:2007-11-30 15:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-15 18:00
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


为什么db 0,0,0 只定义了3个0 而不是4 个
woshihuo12
[第1楼]   [ 回复时间:2007-11-30 16:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-15 18:00
data段内容 为 0 0 0的话 word ptr [bx+1]指向的是第 2 个 0, 代表 值是 第 2 和第 3 个0
(第2个0和第3个0合起来既是0000h)那说明第一个字节 和第4 个字节是什么内容并不重要 我这样说对么?(那摸第一个字节为什么是0)
fishboy
[第2楼]   [ 回复时间:2007-11-30 16:13 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
定义3个数据是0,是实现程序必要的最少个数。当然,你可以定义4个甚至更多。只要你在应该的位置上定义的数据正确,都不影响结果。其实,我们只要确定bx+1处的一个word型数据的值就行了,其他位置上的数据是什么对这道题来说没有什么影响的。
楼主思考一下呢?
fishboy
[第3楼]   [ 回复时间:2007-11-30 16:13 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
楼主理解的很对。可惜我回答晚了一步哟!呵呵
fishboy
[第4楼]   [ 回复时间:2007-11-30 16:15 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
那摸第一个字节为什么是0
=======
他愿意那么写的,咱管不着!既然那个位置对这道题来说没有任何意义,就不要钻牛角尖了!他要是写成1,2或者3什么,你还问:为什么写成1了啊?呵呵。
你的理解是正确的。那些问题已经没意义了。
woshihuo12
[第5楼]   [ 回复时间:2007-12-01 16:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-15 18:00
谢谢大家了/....
cqbdjy
[第6楼]   [ 回复时间:2008-08-11 12:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-08-11 12:40
db 0 就可以了,后面自动补齐为16个0

我用的就是 db 0就可以啊。
maxm
[第7楼]   [ 回复时间:2009-02-10 09:45 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:4
注册日期:2009-01-15 22:41
只要理解了问题的本质就不难:
本题目的是让cs:ip 指向code段的第一条语句
而[bx+1]即ds:[bx+1]在指令jmp word ptr [bx+1]中的含义是转移的目的偏移地址。
要使jmp 指令执行后cs:ip指向程序的第一条指令即使ds:[bx+1]里面所存放的ip值为代码段的起始偏移地址。起始偏移地址为0,那当然应该存放0了。
luccs
[第8楼]   [ 回复时间:2009-02-21 14:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-19 10:20
为什么 db 0 后,后面的自动补齐为16个0,想不明白
omycle
[第9楼]   [ 回复时间:2009-03-05 10:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-12 19:53
db 0 就可以了,后面自动补齐为16个0

我用的就是 db 0就可以啊。
------------------
回复:同楼上,为什么要自动补齐16个0呀??
有人实验过吗?
linghulg
[第10楼]   [ 回复时间:2009-03-12 08:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-04 17:25
db 0 就可以了,后面自动补齐为16个0

我用的就是 db 0就可以啊。
------------------
回复:同楼上,为什么要自动补齐16个0呀??
有人实验过吗?
------------------
回复:定义db 0看上去只有一个字节,实际上在内存中占用16个字节(前几章有个计算实际占用内存大小的公式可以验证)。对于本题来讲,只要第1位(从0算起)和第2位为0即满足要求。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved