. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  jmp far ptr s 是如何确定地址的?  [待解决] 回复[ 14次 ]   点击[ 1095次 ]  
abc58139966
[帖 主]   [ 发表时间:2007-11-04 13:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00
如果DISP在[-32768,32767] JMP FAR PTR S 对应的机器码是EA(3701D013)(后面是具体的地址),但是程序并不知道它会加载到什么地方去,那这个具体的地址是如何确定的呢?
happy
[第1楼]   [ 回复时间:2007-11-04 14:57 ]   [引用]   [回复]   [ top ] 
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06
是不是当遇到标号时记录标号的段地址和偏移地址,然后遇到jmp far ptr s指令的时候,可以确定跳的目的地址啊?
happy
[第2楼]   [ 回复时间:2007-11-04 14:57 ]   [引用]   [回复]   [ top ] 
荣誉值:32
信誉值:0
注册日期:2007-07-14 19:06
不知道,猜的。
cat442
[第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 这个容易理解吧,既然已经倒了内存那“具体地址”自然能够得到了。
至于之前的编译 连接 过程中它是个什么,意义不大吧,因为在没有加载到内存之前是不会知道“具体地址”是多少的,不过是一个中间结果罢了。
abc58139966
[第4楼]   [ 回复时间:2007-11-07 11:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-24 17:00
谢谢你们的回复
cxn
[第5楼]   [ 回复时间:2007-11-07 15:49 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
补充3楼的一点,jmp far ptr s 的偏移地址是在编译的时候确定的段地址是在装载的时候给出的.
cat442
[第6楼]   [ 回复时间:2007-11-08 14:56 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:6
注册日期:2007-06-26 16:56
哦,学习了!
lovemhome
[第7楼]   [ 回复时间:2007-11-08 15:57 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:2
注册日期:2007-10-18 10:43
我也有这样的疑惑,我觉得偏移地址在编译的时候编译器可以给出,因为毕竟是在一个程序段内相对的偏移地址已经固定,
段地址应该是在装载的时候给出的,不知道是加载程序给出的还是操作系统给出的?通过什么途径给出的(被加载程序是怎样和加载程序或操作系统交互的)?
好多疑问...
philmei
[第8楼]   [ 回复时间:2007-12-03 01:06 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
知道EA后面是目标地址我就知足了,我不想知道它是怎么来~,我就想知道它是怎么执行地~
zhuzhu
[第9楼]   [ 回复时间:2007-12-05 09:25 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33
楼上的要求更简单了,这个书上的内容就告诉你了.p168 9.4转移的目的地址在指令中的jmp指令

jmp far ptr 标号
..
..

建议楼上把即类jmp指令用法对照总结一下,找到了它们的不同才更容易被我们记在大脑里,用的时候也能找到合适的指令~
debugk
[第10楼]   [ 回复时间:2008-08-22 19:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-06-13 10:30
应该是编译时,系统会给S分配一个内存地址CS:IP,然后把jmp far ptr S编译成“EX XXXX:XXXX”

猜想~
jikeyuan1
[第11楼]   [ 回复时间:2011-02-23 13:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-07 15:40
这个问题复杂啊  我也不懂  顶!!
vs9841
[第12楼]   [ 回复时间:2011-06-30 09:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29
可以看一下书上的330页的,附注3。
vs9841
[第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加载程序之前,段地址还是未知的。应该是在程序加载后,根据实际内存环境,得到段地址。
vs9841
[第14楼]   [ 回复时间:2011-06-30 11:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29
接楼上回复:这就应证了书上180页9.4节所讲,EA XXXX BBBB,BBBB是就是标号所在段的段地址。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved