JMP CALL 二进制指令计算公式

;示例一 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位的段选择子在后.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值