汇编语言之转移指令

欢迎关注博主的公众号:薛定谔的小鱼儿

转移指令:可以修改IP或同时修改CS和IP的指令统称为转移指令。

短转移IP的修改范围:-128——127

近转移IP的修改范围:-32768——32767

1.操作符offset

操作符offset作用:取得标号的偏移地址

例:

assume cs:codesg

codesg segment

    start: mov ax,offset start  //相当于 mov ax,0

        s:   mov ax,offset s       //相当于 mov ax,3

codesg ends

end start

2.jmp指令

jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP

jmp指令要给出两种信息:

(1)转移的目的地址

(2)转移的距离(段间转移,段内短转移,段内近转移)

1)jmp short 标号(转移到标号位置执行指令)

例:

assume cs:codesg

codesg segment

    start : mov ax,0

              jmp short,s

             add ax,1

         s:  inc ax

codesg ends

end start

上面的程序执行完,ax=1,因为执行了jmp short,s,直接跳到inc ax,不会执行add ax,1

2)转移的目的地址在指令中的jmp指令

“jmp far ptr 标号”实现的是段间转移,又称为远转移。far ptr指明了用标号的段地址和偏移地址修改CS和IP

例子:

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

3)jmp word ptr 内存单元地址(段内转移)

从内存单元地址处开始存放一个字,是转移的目的偏移地址

例:

mov ax,0123H

mov ds:[0],ax

jmp word ptr ds:[0]

执行后,(IP)=0123H

4)jmp dword ptr 内存单元地址(段间地址)

从内存单元地址处开始存放两个字,高地址的字是转移的目的段地址,低地址处是转移的目的偏移地址。

mov ax,0123H

mov ds:[0],ax

mov word ptr ds:[2],0

jmp dword ptr ds:[0]

执行后,(CS)=0,(IP)=0123H

3.jcxz指令

jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,对IP的修改范围为:-128——127

jcxz 标号

相当于 if ((cx)==0) jmp short 标号;

例(本实例利用jcxz实现在内存2000H段中查找第一个值为0的字节,找到后把它的偏移地址存储在dx中。

asuume cs:code

code segment

start: mov ax,2000H

         mov ds,ax

         mov bx,0

     s:  mov cl,[bx]

         mov ch,0

         jcxz ok

         inc bx

        jmp short s

 ok : mov dx,bx

        mov ax,4c00H

        int 21H

code ends

end start

猜你喜欢

转载自blog.csdn.net/weixin_38635069/article/details/80600557
今日推荐