在本章中,涉及到jmp转移指令,相对复杂,为此画了一个思维导图。需要注意的是:
1、jmp指令中的“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令。
2、在依据位移进行转移的时候,CPU并不需要转移的目的地址,但却需要转移的位移。这个位移,是编译器根据汇编指令中的“标号”计算出来的。
3、jmp short 标号 的功能:(ip) = (ip) +8位位移 。8位位移的范围是 -128 ~ 127
4 、jmp near ptr 标号 的功能:(ip) = (ip) + 16 位位移。16 位位移的范围是 -32768~32767
5、在依据位移进行转移的时候,段内转移(jmp short 标号 和 jmp near ptr 标号)只修改IP;段间转移(jmp far ptr 标号),既要修改CS,又要修改IP,jmp far ptr 标号 所对应的机器码,高地址是转移的段地址(CS),低地址是偏移地址(IP)。
6、当转移地址在内存中时,段内转移(jmp word ptr 内存单元)只修改IP的值,从内存单元地址处开始放一个字,是转移的目的偏移地址。
比如指令:
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,(IP)=0123H
jmp word ptr ds:[0] ,相当于 mov ip ds:[0]
7、当转移地址在内存中时,段间转移(jmp dword ptr 内存单元),既要修改CS,又要修改IP,从内存单元地址处开始放两个字,高地址处的字是转移的目的段地址(CS),低地址处是转移的偏移地址(IP)。
(CS)=(内存单元地址+2),(IP)=(内存单元地址)
比如指令:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后,(CS) = 0 ,(IP)= 0123H ,CS:IP指向 0000:0123
jmp dword ptr ds:[0],相当于:
1)mov ip ds:[0]
2)mov cs ds:[2]
8、转移地址在寄存器中
这个相对比较简单,其作用仅仅是修改IP的值,可用形如“jmp 某一合法寄存器”的指令完成。
如:jmp ax,执行前ax=437aH,CS=17f0H,IP=423cH,执行后,CS不变,IP=437aH。即将原IP值 "423cH"修改为ax里的值"437aH"。
“jmp 某一合法寄存器”指令的功能为:用现有寄存器中的值来修改IP。
为什么叫“某一合法寄存器”呢?因为并不是所有寄存器都可以修改IP。