+ -
当前位置:首页 → 问答吧 → 初学汇编,请问关于jmp的问题

初学汇编,请问关于jmp的问题

时间:2010-11-19

来源:互联网

请问 jmp near ptr "标号" 这种格式的jmp是怎么用的?我看书上的怎么也看不懂,没有例子
我有这个疑问

assume cs:code
code segment
s: mov ax,20h
mov ax,0
mov ax,1
jmp s


//////////////////////////////

assume cs:code
code segment
s: mov ax,20h
mov ax,0
mov ax,1
jmp near ptr s

上面有两个代码段
第一个就是用的jmp "标号",而第二个就是用的jmp near ptr "标号",可是我比较了一下,他们实现的功能是一样的,而后面那种写起来要复杂得多,为什么还需要后面那种写法呢?


第二个问题:
assume cs:code
data segment
 .....
data ends

code segment
start: mov ax,data
  mov ds,ax
  mov bx,0
  jmp word ptr [bx + 1] //这里要跳到指令的第一句
code ends
end start

就是以上的jmp语句要跳到我们程序的开始处,请问我们应该定义data段中的数据?主要问题是我们应该把我们数据段中的数据的前四个字节,高位存代码的段地址,低位存第一条指令偏移地址,可是程序还没有编译运行,我怎么知道我的程序的段地址以及偏移地址啊?

求高手解答,谢了

作者: cwbcwb505   发布时间: 2010-11-19

第一,jmp near ptr 用于强制近距离跳转, 而只用jmp的话, 程序在编译的时候,编译器自动计算s的范围,王爽书里的附录里就有专门讲了汇编器对jmp的处理。

第二,jmp用于间接转移,转移地址在数据段中

作者: masmaster   发布时间: 2010-11-19

你回答的第一个问题我还是看不懂,能具体点吗?

第二个我知道转移地址在数据段中,而我的问题是我应该怎么去填写数据段中的数字,因为数据段中的数字照他的意思是在写程序的时候就填好的,那我在写程序的时候怎么会知道我的代码的段地址以及偏移地址呢

作者: cwbcwb505   发布时间: 2010-11-19

引用 2 楼 cwbcwb505 的回复:
你回答的第一个问题我还是看不懂,能具体点吗?

第二个我知道转移地址在数据段中,而我的问题是我应该怎么去填写数据段中的数字,因为数据段中的数字照他的意思是在写程序的时候就填好的,那我在写程序的时候怎么会知道我的代码的段地址以及偏移地址呢

near就是近的意思,使用jmp near ptr 就是跳转到离他最近的一个程序段。

下面给你贴上一段资料
——————————————————————————————————————
 无条件转移指令JMP 

 格式: JMP OPRD 
 ----

 功能: JMP指令将无条件地控制程序转移到目的地址去执行.当目的地址仍在同一个代码段 ---- 内,称为段内转移;当目标地址不在同一个代码段内,则称为段间转移.这两种情况都 将产生不同的指令代码,以便能正确地生成目的地址,在段内转移时,指令只要能提 供目的地址的段内偏移量即够了;而在段间转移时,指令应能提供目的地址的段地址 及段内偏移地址值. 
_________________________________________________________________________


说明: 1. 其中OPRD为转移的目的地址.程序转移到目的地址所指向的指令继续往下执行.
 ----
  2. 本组指令对标志位无影响.

  3. <1> 段内直接转移指令: JMP NEAR 标号 
  即: JMP NEAR 标号; (IP)<--disp16+(IP) 
  JMP SHORT 标号; (IP)<--disp8+(IP) 

  <2> 段内间接转移指令: JMP OPRD 
  例如: JMP BP ; 转向(SS):(BP) 
  JMP JNEAR[BX] ; 转向(CS):(BX)+JNEAR 
  JMP WORD PTR[BX][DI] ; 转向(CS):(BX)+(DI) 

  <3> 段间直接转移指令: JMP FAR 标号 
  由于标号之前用FAR说明为远的属性,因而只能是一条段间转移指令.执行该 指令时,将把标号所在的段的值送CS,将标号在所属段内的偏移量送IP,从而 形成新的转移地址CS:IP 

  <4> 段间间接转移指令:JMP OPRD其中的OPRD为存储器双字操作数.段间间接转 移只能通过存储器操作数来实现.
  例如:指令JMP DWORD PTR[BX],其操作数是一个双字类型的存储器操作数, 它指向数据段DS,段内偏移为(BX).从这个DS:BX开始的前两个字节中,存放 了目标地址的段内偏移值,后两个字节中,存放了目标地址所在的新的段的 段基址,分别将它们送至IP及CS,便形成了新的转移地址.

作者: kartik   发布时间: 2010-11-19