第九章:转移指令的原理02
让编程改变世界
Change the world by program
转移的目的地址在指令中的jmp指令
前面讲的jmp指令,其对应的机器码中并没有转移的目的地址,而是相对于当前IP的转移位移。指令 “jmp far ptr 标号” 实现的是段间转移,又称为远转移。
指令 “jmp far ptr 标号” 功能如下:(CS)=标号所在段的段地址;
(IP)=标号所在段中的偏移地址。
far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。 我们看下面的程序 [codesyntax lang="asm"]assume cs:codesg codesg segment start: mov ax,0 mov bx,0 jmp far ptr s db 256 dup (0) s: add ax,1 inc ax codesg ends end start[/codesyntax] 我们在Debug中将程序9.3翻译成为机器码,看到的结果如图: [caption id="attachment_359" align="aligncenter" width="300"]



指令格式:jmp 16位寄存器
功能:IP =(16位寄存器) 这种指令我们在前面的课程(参见2.11节)中已经讲过,这里就不再详述。转移地址在内存中的jmp指令有两种格式:
(1)jmp word ptr 内存单元地址(段内转移) 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。 内存单元地址可用寻址方式的任一格式给出。 示例:mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,(IP)=0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
执行后,(IP)=0123H
(2)jmp dword ptr 内存单元地址(段间转移) 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。(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。
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
执行后,
(CS)=0
(IP)=0123H
CS:IP 指向 0000:0123。