|
主题 : : jmp far ptr s 是如何确定地址的? [待解决] |
回复[ 14次 ]
点击[ 1095次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-11-04 13:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
如果DISP在[-32768,32767] JMP FAR PTR S 对应的机器码是EA(3701D013)(后面是具体的地址),但是程序并不知道它会加载到什么地方去,那这个具体的地址是如何确定的呢? | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-11-04 14:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06 |
是不是当遇到标号时记录标号的段地址和偏移地址,然后遇到jmp far ptr s指令的时候,可以确定跳的目的地址啊? | | |
|
|
|
|
[第2楼]
[ 回复时间:2007-11-04 14:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06 |
|
|
|
|
|
[第3楼]
[ 回复时间:2007-11-04 15:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:6
注册日期:2007-06-26 16:56 |
我这么看,指令是cpu执行的,jmp far ptr S ,无非就是EA XXXX XXXX 是执行后修改cs ,ip 。这是cpu支持的,而jmp far ptr s 这种形式是在怎么变成EA XXXX XXXX它的呢,我想楼主的困惑在这里,对吧?
源程序 如mp far ptr S … 此形式经过编译,连接,而成为可执行的程序。继而由操作系统加载到内存并执行,在执行的时候必然是EA XXXX XXXX 这个容易理解吧,既然已经倒了内存那“具体地址”自然能够得到了。
至于之前的编译 连接 过程中它是个什么,意义不大吧,因为在没有加载到内存之前是不会知道“具体地址”是多少的,不过是一个中间结果罢了。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-11-07 11:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00 |
|
|
|
|
|
[第5楼]
[ 回复时间:2007-11-07 15:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18 |
补充3楼的一点,jmp far ptr s 的偏移地址是在编译的时候确定的段地址是在装载的时候给出的. | | |
|
|
|
|
[第6楼]
[ 回复时间:2007-11-08 14:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:6
注册日期:2007-06-26 16:56 |
|
|
|
|
|
[第7楼]
[ 回复时间:2007-11-08 15:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:2
注册日期:2007-10-18 10:43 |
我也有这样的疑惑,我觉得偏移地址在编译的时候编译器可以给出,因为毕竟是在一个程序段内相对的偏移地址已经固定,
段地址应该是在装载的时候给出的,不知道是加载程序给出的还是操作系统给出的?通过什么途径给出的(被加载程序是怎样和加载程序或操作系统交互的)?
好多疑问... | | |
|
|
|
|
[第8楼]
[ 回复时间:2007-12-03 01:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32 |
知道EA后面是目标地址我就知足了,我不想知道它是怎么来~,我就想知道它是怎么执行地~ | | |
|
|
|
|
[第9楼]
[ 回复时间:2007-12-05 09:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33 |
楼上的要求更简单了,这个书上的内容就告诉你了.p168 9.4转移的目的地址在指令中的jmp指令
jmp far ptr 标号
..
..
建议楼上把即类jmp指令用法对照总结一下,找到了它们的不同才更容易被我们记在大脑里,用的时候也能找到合适的指令~ | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-08-22 19:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-06-13 10:30 |
应该是编译时,系统会给S分配一个内存地址CS:IP,然后把jmp far ptr S编译成“EX XXXX:XXXX”
猜想~ | | |
|
|
|
|
[第11楼]
[ 回复时间:2011-02-23 13:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-02-07 15:40 |
|
|
|
|
|
[第12楼]
[ 回复时间:2011-06-30 09:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
|
|
|
|
|
[第13楼]
[ 回复时间:2011-06-30 10:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
我这么看,指令是cpu执行的,jmp far ptr S ,无非就是EA XXXX XXXX 是执行后修改cs ,ip 。这是cpu支持的,而jmp far ptr s 这种形式是在怎么变成EA XXXX XXXX它的呢,我想楼主的困惑在这里,对吧?
源程序 如mp far ptr S … 此形式经过编译,连接,而成为可执行的程序。继而由操作系统加载到内存并执行,在执行的时候必然是EA XXXX XXXX 这个容易理解吧,既然已经倒了内存那“具体地址”自然能够得到了。
至于之前的编译 连接 过程中它是个什么,意义不大吧,因为在没有加载到内存之前是不会知道“具体地址”是多少的,不过是一个中间结果罢了。
------------------
如下程序所示:
assume cs:code
code segment
jmp s
jmp near ptr s
jmp far ptr s
db 100 dup (0b8h,0,0)
s:mov ax,2
mov ax,4c00h
int 21h
code ends
end
=============================
回复:可以用winhex打开生成的可执行文件,发现EA XXXX BBBB这条指令实际上为EA XXXX 0000的形式。XXXX=标号的处的AC值(偏移地址)(AC是编译器一个计数器,在编译时每读到一个字节,AC就加1,很明显这里的标号偏移地址就是这样计算得到的),而段地址BBBB此时还为0,也就是说,在CPU加载程序之前,段地址还是未知的。应该是在程序加载后,根据实际内存环境,得到段地址。 | | |
|
|
|
|
[第14楼]
[ 回复时间:2011-06-30 11:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
接楼上回复:这就应证了书上180页9.4节所讲,EA XXXX BBBB,BBBB是就是标号所在段的段地址。 | | |