注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

call jmp 与机器码  

2013-03-08 16:04:37|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
;示例一  CALL立即数  CALL后面跟一个32位立即数
;===================================
     1                                  [bits 32]
     2                                            test:
     3 00000000 90                      nop
     4 00000001 90                      nop
     5 00000002 90                      nop
     6 00000003 E8F8FFFFFF    call test
     7 00000008 90                      nop
     8 00000009 90                      nop
     9 0000000A 90                      nop
;===================================
CALL后面跟一个立即数,也就是32位偏移量时,机器码为 0XE8   后面的32位立即数是偏移量.
偏移量的计算:  目标偏移地址 减  CALL 指令后的下一条指令的地址 在当前的例子中,test是目标偏移地址,地址是0 CALL指令后的地址为 08 , 0-08=FFFFFFF8  注意,在内存中,低字在前,高字在后,所以是 0XE8 F8 FF FF FF

偏移量计算的公式二:   目标偏移-CALL指令的起始偏移-CALL指令的大小

;示例二 CALL [内存地址]
;=====================================
     1                                  [bits 32]
     2                                  
     3 00000000 90                      nop
     4 00000001 90                      nop
     5 00000002 90                      nop
     6 00000003 FF15[0B000000]          call [test]
     7 00000009 90                      nop
     8 0000000A 90                      nop
     9                                  test:
    10 0000000B 90                      nop
;======================================
机器码是0XFF15 后面跟的是内存地址.  test的内存地址是 0B ,所以后面跟的是0B 同样是低字在前,高字在后

示例三 call far [内存地址]
;=======================================
     1                                  [bits 32]
     2                                  
     3 00000000 90                      nop
     4 00000001 90                      nop
     5 00000002 90                      nop
     6 00000003 FF1D[0B000000]          call far [test]
     7 00000009 90                      nop
     8 0000000A 90                      nop
     9                                  test:
    10 0000000B 90                      nop
;=======================================
CALL FAR 内存地址,机器码是 0XFF1D 后面内存地址的表示是相同的,但执行不同. 会同时改变CS 与 IP.

;示例四 JMP 立数数
;=======================================
     1                                  [bits 32]
     2                                  
     3 00000000 90                      nop
     4 00000001 90                      nop
     5 00000002 90                      nop
     6 00000003 E902000000              jmp test
     7 00000008 90                      nop
     8 00000009 90                      nop
     9                                  test:
    10 0000000A 90                      nop
;=======================================
JMP 立即数,机器码是 E9 ,后面跟一个偏移量. 偏移量计算与上面CALL相同.   test 地址是 0A,JMP指令后下一条指令地址是 08 ,0A-08=2

;JMP 内存地址
;=======================================
     1                                  [bits 32]
     2                                  
     3 00000000 90                      nop
     4 00000001 90                      nop
     5 00000002 90                      nop
     6 00000003 FF25[0B000000]          jmp  [test]
     7 00000009 90                      nop
     8 0000000A 90                      nop
     9                                  test:
    10 0000000B 90                      nop
;=======================================
JMP 内存地址,机器码是 0XFF25 后面跟的是内存地址. 注意,是从后面的内存地址取出目标数值来改变EIP.

;JMP FAR 内存地址
;========================================
     1                                  [bits 32]
     2                                  
     3 00000000 90                      nop
     4 00000001 90                      nop
     5 00000002 90                      nop
     6 00000003 FF2D[0B000000]          jmp  far [test]
     7 00000009 90                      nop
     8 0000000A 90                      nop
     9                                  test:
    10 0000000B 90                      nop
;========================================
JMP FAR 机器地址是 0XFF2D 后面同样是内存地址.

;============================================================
 直接远跳转与直接远调用
;============================================================
     1                                  [bits 32]
     2 00000000 EA007C00000800          jmp 0x8:0x7c00
     3 00000007 9A007C00000800          call 0x8:0x7c00
JMP直接远跳,机器码是0XEA 32位的偏移在前,16位的段选择子在后.
CALL直接远跳,机器码是0X9A 32位的偏移在前,16位的段选择子在后.
  评论这张
 
阅读(1609)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017