初学汇编,请问关于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段中的数据?主要问题是我们应该把我们数据段中的数据的前四个字节,高位存代码的段地址,低位存第一条指令偏移地址,可是程序还没有编译运行,我怎么知道我的程序的段地址以及偏移地址啊?
求高手解答,谢了
我有这个疑问
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用于间接转移,转移地址在数据段中
第二,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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28