首页
社区
课程
招聘
[求助]王爽汇编问题?
发表于: 2010-1-21 12:47 4531

[求助]王爽汇编问题?

2010-1-21 12:47
4531
图中CS=2000H,IP=0000H 所指向的物理地址是20000H
为什么取回的指令却是20000H到20002H之间的内容?
在寻址之前并不知道具体是哪条指令也就不知道这指令的长度了,这里是怎么确定所要返回的指令内容就是20000H到20002H之间的内容?而不是20000H到20001H之间或20000H到20004H之间内容呢?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
  • 1.JPG (41.71kb,154次下载)
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
其实问题就是CPU如何知道它要从内存中起始地址CS:IP到哪个地址结束之间的内容.

这里CPU计算出指令的物理地址但它并不知道这条指定在哪里结束.
2010-1-21 12:57
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你认真看课本  好像还是容易弄懂的   我也刚看到 这里........

只不过,工作忙  看了一遍   又忘了前面  
2010-1-21 13:37
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好像指令的第一个字节可以确定自身长度
2010-1-21 16:05
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
这个机器码是已定义好的了,比如说b8表示什么等,,比如你写了一句mov ax,0123h 那么,编译时,他会把这句鄱译成相应的机器码,cs:ip指向它的时候,cpu会根据它可以识别的机器码从而执行,因为cpu执行到be 23 01[因为机器码以十六进制在内存中存放,那当然有长度了。]这样的机器码时,cpu自动把0123h这个数值传到ax寄存器中,
比如以上所说为什么要到200002h结束?其实cpu没有计算要到那里结束,它一直运行着cs:ip所指的地址中,执行里面的机器码。如上面的be 23 01,他执行后的动作是把0123存到ax中,在我们看来是一个动作完成,可以说是一条指令完成
2010-1-21 16:17
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
或者是前缀码?
2010-1-26 22:18
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
为什么取回的指令却是20000H到20002H之间的内容?

是这样的,我们现在的这种x86指令是不等长的

有些指令只有一个字节,有些指令却有6个字节

CPU只需要看第一个字节就知道这条指令有多长(那不是废话吗,他都不知道那怎么执行)

我这样说,让你去理解

汇编代码的第一个字节决定了这条指令的长度,有部分决定不了的接着取第二字节,这是固定的

比如现在这个例子中(你的例子是16位的)

CPU一看到20000H这个地址的指令是B8,他就自动取20000H~20002H三个字节的指令

你往后看书的时候随便看到以B8字节开头的代码你就会发现,他都是3字节

我的回答应该跟实际有点偏差,但不影响你去理解这个问题,就是看开头就知道这条代码有多长,固定的,不同开头不同的长度
2010-1-27 20:03
0
雪    币: 21
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个应该是固定的。。固定就是这样。我也是刚看过这里!
2010-1-30 00:28
0
游客
登录 | 注册 方可回帖
返回
//