. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  【检测点】9.1我的理解  [待解决] 回复[ 4次 ]   点击[ 792次 ]  
regex
[帖 主]   [ 发表时间:2010-01-18 14:28 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
题目是定义data, 让jmp后cs:ip指向程序第一条指令
1, 我理解第一条指令时mov ax,data, start为标号,CS:IP=CS:0000
2, 要想满足题目, jmp word ptr [bx+1], 此指令中地内存地址装的必须是0000
3, 所以, data如下定义
data segment
dw   0     ;定义成一个为0的字, 因为jmp word ptr 要求是一个字。
data ends
4, 用debug实验结果:
d:\asm>debug j91.exe
-r 
AX=0000  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C9  ES=14C9  SS=14D9  CS=14DA  IP=0000   NV UP EI PL NZ NA PO NC
14DA:0000 B8D914        MOV     AX,14D9   ;CS=14da, IP=0000
-t

AX=14D9  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C9  ES=14C9  SS=14D9  CS=14DA  IP=0003   NV UP EI PL NZ NA PO NC
14DA:0003 8ED8          MOV     DS,AX     
-t

AX=14D9  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14D9  ES=14C9  SS=14D9  CS=14DA  IP=0005   NV UP EI PL NZ NA PO NC
14DA:0005 BB0000        MOV     BX,0000
-t

AX=14D9  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14D9  ES=14C9  SS=14D9  CS=14DA  IP=0008   NV UP EI PL NZ NA PO NC
14DA:0008 FF6701        JMP     [BX+01]                            DS:0001=0000 
;段内跳转, 地址为0000, 即程序开始第一条指令指向。
-t                                                                            

AX=14D9  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14D9  ES=14C9  SS=14D9  CS=14DA  IP=0000   NV UP EI PL NZ NA PO NC
14DA:0000 B8D914        MOV     AX,14D9
-t
;结果正确。
csusuntao
[第1楼]   [ 回复时间:2010-01-27 21:40 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:2
注册日期:2010-01-04 23:00
2, 要想满足题目, jmp word ptr [bx+1], 此指令中地内存地址装的必须是0000 
3, 所以, data如下定义 
data segment 
dw   0     ;定义成一个为0的字, 因为jmp word ptr 要求是一个字。 
data ends 
4, 用debug实验结果: 
d:\asm>debug j91.exe 
-r  
AX=0000  BX=0000  CX=001B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000 
DS=14C9  ES=14C9  SS=14D9  CS=14DA  IP=0000   NV UP EI PL NZ NA PO NC 
14DA:0000 B8D914        MOV     AX,14D9   ;CS=14da, IP=0000 

从楼主的实验可以看出:DS=14C9H , SS=14D9H , CS=14DAH
其中14D9H --- 14DAH两个段之间的16个字节为数据段(虽然仅定义了一个dw,但是需要填充到16字节)

题目要求jmp word ptr [bx+1]。而[bx+1]去取的实际是[1]和[2]内存值,所以楼主的数据定义不对,但是结果正确,就是因为那些填充的字节存在。

我的建议是:

data segment 
  db   0, 0, 0  ;虽然仅仅定义了3个字节,但是此段还是需要16字节。
data ends
yds
[第2楼]   [ 回复时间:2010-03-21 10:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-20 16:27
2楼的分析很有道理,我定义的是dw 0,0
canmover
[第3楼]   [ 回复时间:2010-03-28 20:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-24 23:32
2楼正解。
guogo
[第4楼]   [ 回复时间:2010-03-31 11:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-31 07:34
db 0,0不就是16个字节吗,为什么还要多定义个0呢
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved