汇编语言7跳转指令
2015-06-03 17:57
302 查看
用法1:: jmp short 标号(转到标号处执行指令)
这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。
段内转移,只修改IP,比如jmp ax
段间转移,同时修改CS和IP,比如jmp 1000:200
短转移,IP取值范围-128-127, 8位
近转移,IP取值范围-32768-32767,16位
offset是伪指令,它的功能是取标号的偏移地址
代码:
Debug中:
1467:0000 0000 ADD [BX+SI],AL
1467:0002 0000 ADD [BX+SI],AL
1467:0004 0000 ADD [BX+SI],AL
1467:0006 0000 ADD [BX+SI],AL
1467:0008 0000 ADD [BX+SI],AL
1467:000A B8FFFF MOV AX,FFFF
1467:000D EBFB JMP 000A
1467:000F EB01 JMP 0012
1467:0011 90 NOP
1467:0012 90 NOP
1467:0013 B8004C MOV AX,4C00
1467:0016 CD21 INT 21
分析: EB对应jmp short, FB对应-5, -5表示向上跳5个字节, 取jmp指令结束的地址000F,000F-5=000A
分析: EB对应jmp short, 01对应1, 1表示向下跳1个字节, 取jmp指令结束的地址0011, 0011+1=0012
018EAEB3 E9 7CF4FFFF jmp 018EA334 // 机器码 E9对应长跳转jmp, 7CF4FFFF 表示相对偏移 AEB3- A334 =B7F,向上跳转B7F
018EAEB3 EB FE jmp short 018EAEB3 // 机器码 EB 对应段跳转jmp short , FE表示相对偏移0
018EAEB3 EB 00 jmp short 018EAEB5 // 机器码 EB 对应段跳转jmp short , 00表示相对偏移2, 向下跳转2
[b]注意:机器码中不包含转移的目的地址,这意味着CPU并不知道转移目的地址, 只需知道相对偏移, [/b]
jmp 跳转地址, 这个的[b]跳转地址不是定死的,只是相对偏移地址, 对着机器码看 一目了然[/b]
1.分析下面程序 这个程序能否正确运行到
mov ax,4c00h
int 21h
吗????
在Debug中分析:
1467:0000 B8004C MOV AX,4C00
1467:0003 CD21 INT 21
1467:0005 B80000 MOV AX,0000
1467:0008 90 NOP
1467:0009 90 NOP
1467:000A BF0800 MOV DI,0008
1467:000D BE2000 MOV SI,0020
1467:0010 2E CS:
1467:0011 8B04 MOV AX,[SI]
1467:0013 2E CS:
1467:0014 8905 MOV [DI],AX //这里把1467:0020处指令 EBF6复制到1467:0008
1467:0016 EBF0 JMP 0008 //跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000
1467:0018 B80000 MOV AX,0000
1467:001B CD21 INT 21
1467:001D B80000 MOV AX,0000
1467:0020 EBF6 JMP 0018
1467:0022 90 NOP
分析:1.这里把1467:0020处指令 EBF6复制到1467:0008
2.跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000, 跳转到0000,执行MOV AX,4C00, INT 21
程序正常退出
灵活应用:
如何加一条指令,让程序跳过MOV AX,4C00,执行 INT 21了
在mov ax,cs:[si]
;mov ah,-7 加上这条指令就ok了
mov cs:[di],ax
这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。
段内转移,只修改IP,比如jmp ax
段间转移,同时修改CS和IP,比如jmp 1000:200
短转移,IP取值范围-128-127, 8位
近转移,IP取值范围-32768-32767,16位
offset是伪指令,它的功能是取标号的偏移地址
代码:
assume cs:code code segment db 10 dup(0) s: mov ax,0ffffh start: jmp short s jmp short s1 nop s1: nop mov ax,4c00h int 21h code ends end start
Debug中:
1467:0000 0000 ADD [BX+SI],AL
1467:0002 0000 ADD [BX+SI],AL
1467:0004 0000 ADD [BX+SI],AL
1467:0006 0000 ADD [BX+SI],AL
1467:0008 0000 ADD [BX+SI],AL
1467:000A B8FFFF MOV AX,FFFF
1467:000D EBFB JMP 000A
1467:000F EB01 JMP 0012
1467:0011 90 NOP
1467:0012 90 NOP
1467:0013 B8004C MOV AX,4C00
1467:0016 CD21 INT 21
分析: EB对应jmp short, FB对应-5, -5表示向上跳5个字节, 取jmp指令结束的地址000F,000F-5=000A
分析: EB对应jmp short, 01对应1, 1表示向下跳1个字节, 取jmp指令结束的地址0011, 0011+1=0012
018EAEB3 E9 7CF4FFFF jmp 018EA334 // 机器码 E9对应长跳转jmp, 7CF4FFFF 表示相对偏移 AEB3- A334 =B7F,向上跳转B7F
018EAEB3 EB FE jmp short 018EAEB3 // 机器码 EB 对应段跳转jmp short , FE表示相对偏移0
018EAEB3 EB 00 jmp short 018EAEB5 // 机器码 EB 对应段跳转jmp short , 00表示相对偏移2, 向下跳转2
[b]注意:机器码中不包含转移的目的地址,这意味着CPU并不知道转移目的地址, 只需知道相对偏移, [/b]
jmp 跳转地址, 这个的[b]跳转地址不是定死的,只是相对偏移地址, 对着机器码看 一目了然[/b]
1.分析下面程序 这个程序能否正确运行到
mov ax,4c00h
int 21h
吗????
assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:[si] mov cs:[di],ax s0: jmp short s s1: mov ax,0 int 21h mov ax,0 s2: jmp short s1 nop codesg ends end start
在Debug中分析:
1467:0000 B8004C MOV AX,4C00
1467:0003 CD21 INT 21
1467:0005 B80000 MOV AX,0000
1467:0008 90 NOP
1467:0009 90 NOP
1467:000A BF0800 MOV DI,0008
1467:000D BE2000 MOV SI,0020
1467:0010 2E CS:
1467:0011 8B04 MOV AX,[SI]
1467:0013 2E CS:
1467:0014 8905 MOV [DI],AX //这里把1467:0020处指令 EBF6复制到1467:0008
1467:0016 EBF0 JMP 0008 //跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000
1467:0018 B80000 MOV AX,0000
1467:001B CD21 INT 21
1467:001D B80000 MOV AX,0000
1467:0020 EBF6 JMP 0018
1467:0022 90 NOP
分析:1.这里把1467:0020处指令 EBF6复制到1467:0008
2.跳转到 1467:0008 执行指令 EBF6, F6等于-10,10的16进制A,000A-A=0000, 跳转到0000,执行MOV AX,4C00, INT 21
程序正常退出
灵活应用:
如何加一条指令,让程序跳过MOV AX,4C00,执行 INT 21了
在mov ax,cs:[si]
;mov ah,-7 加上这条指令就ok了
mov cs:[di],ax
相关文章推荐
- 软件工程课程改进建议
- jsp借助了ajaxfileupload实现上传文件
- 百度整合搜索的那些事
- 代码中修改TextView的DrawableLeft图片
- 第二次冲刺(7)
- 查看 OS
- App适配iPhone 6/ Plus和iOS 8:10条小秘诀
- 杂想
- BZOJ 4103~4105 THUSC2015 题解
- BZOJ - 2957 楼房重建(分块)
- iOS 截取图片,并且保持图片原有比例,同时填充imageView
- 面试中自我介绍技巧
- 服务器运维。。
- [Erlang]整数与浮点数转换、进制转换
- 百度地图创建InfoWindow自定义View显示
- Java学习篇之---java获取cpu、内存、硬盘信息
- Android Studio怎样提示函数使用方法
- 似然函数
- 南邮算法分析与设计实验3 回溯法
- sql 读取本地txt文件批量插入数据库