汇编语言之转移指令

拜拜、爱过 提交于 2020-02-11 01:48:17

汇编语言–转移指令

操作符 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

start和s是代码段中的标号,offset操作符取得了标号start和s的偏移地址0和3。

jmp指令的用法

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

1. 依据位移进行转移

  • 段内短转移格式:jmp short 标号
    作用:转到标号处执行指令,即(IP)=(IP)+8位位移,它对IP的修改范围为-128~127。
    程序:
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后越过了add ax,1, IP指向了标号s处的
inc ax。也就是说,程序只进行了一次ax加1操作。

  • 段内近转移格式:jmp near ptr 标号
    作用:与“jmp short 标号”功能相近,不同之处在于(IP)=(IP)+16位位移,它对IP的修改范围为-32768~32767

2. 转移的目的地址在指令中
前面讲解的jmp指令,其对应的机器指令中并没有转移的目的地址,而是相对于当前IP的转移位移。

  • 段间转移格式: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

此处jmp far ptr s所对应的机器码:EA 0B 01 BD 0B。其中包含转移的目的地址。“0B 01 BD 0B”的目的地址在指令中的存储顺序,高地址的“BD 0B”是转移的段地址:0BBDH,低地址的“0B 01”是偏移地址:010BH。

3. 转移地址在寄存器中
指令格式:jmp 16位 reg
功能:(IP)=(16位reg)
这里不详述。

4. 转移地址在内存中
转移地址在内存中的jmp指令有两种格式:

  • jmp word ptr 内存单元地址(段内地址)
    功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
    程序:
mov ax, 0123H
mov ds:[0], ax
jmp word ptr ds:[0]

执行后,(IP)=0123H。

  • jmp dword ptr 内存单元地址(段间地址)
    功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
    (CS)=(内存单元地址+2)
    (IP)=(内存单元地址)
    程序:
mov ax, 0123H
mov ds:[0],ax
mov word ptr ds:[2], 0
jmp dword ptr ds:[0]

注:mov word ptr ds:[2], 0 的意思是把0作为word类型放进地址ds:[2]中。
执行后,(CS)=0, (IP)=0123H, CS:IP指向0000:0123。

jcxz指令

功能:“jcxz 标号”相当于if ((cx)==0) jmp short 标号;
程序:

assume cs:code
code segment
  start:mov ax,2000H
        mov ds,ax
        mov bx,0
      s:mov ch,0
        mov cl,[bx]
        jcxz ok
        inc bx
        jmp short s
      ok:mov dx,bx
        mov ax,4c00h
        int 21h
code ends
end start

该程序实现了利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节

## loop指令
功能:“loop 标号”相当于:
(cx)–;
if((cx) != 0) jmp short 标号;
程序:

assume cs:code
code segment
  start:mov ax,2000H
        mov ds,ax
        mov bx,0
      s:mov cl,[bx]
        mov ch,0
        inc cx
        inc bx
        loop s
      ok:dec bx
        mov dx,bx
        mov ax,4c00h
        int 21h
code ends
end start

该程序实现了利用loop指令,实现在内存2000H段中查找第一个值为0的字节

总结

jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
等几种汇编指令,它们对IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!