汇编语言-其他转移指令CALL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言-其他转移指令CALL相关的知识,希望对你有一定的参考价值。

参考技术A jcxz

指令格式: jcxz标号

功能: 如果cx=0 则转移标出处执行

       当cx!=0 什么也不做(程序向下执行)

根据位移进行相对转移的意义

    jmp short标号

    jmp near ptr标号

    jcxz标号

    loop标号

在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移。

1、如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制,易引发错误。

2、当机器码中包含的是转移的位移,无论s处的指令地址是多少,loop指令转移的相应位移是不变的。

mov ax,0

call s

mov ax,4c00h

int 21h

s:add ax,1

ret

调用子程序call指令

返回 ret指令

实质: 流程转移指令,它们都修改IP,或同时修改CS和IP

格式call 标号

cpu执行call指令,进行两步操作,call指令调用之后话牵扯到一个返回(ret)的问题,执行完标号处指令,怎么返回到当前调用的call 标号 处去执行下一条指令呢?

(1)将当前的ip或cs和ip压入栈中

(2)转移到标出执行指令

    16位位移= “标号”处的地址-call指令后的第一个字节的地址

    16位位移的范围为[-32768,32767] 用补码表示

    16位移由编译程序在编译时算法。

call word ptr内存单元地址word = 字(16位)

相当于push ip

       jmp word ptr内存单元地址

mov sp,10h

mov ax,0123h

mov ds:[0],ax

call word ptr ds:[0]

执行后(ip)=0123H (sp)=0EH

call dword ptr内存单元地址dword双字(32位)

返回指令ret和retf

call和ret和retf配合使用 

例:计算2的n次方,计算前n的值由cx提供。

assume cs:code

codeseg ment 

start:

    mo ax,2

    mov cx,3

    call s

    mov bx,ax

    mov ax,4c00h

    int 21h

s:add ax,ax

    loop s

    ret

这个例子虽然可以完成功能,但是没有栈这样会产生安全问题,而且ret是用于栈中的

例: 为call和ret指令设置栈

assume cs:code,ss:stack

stack segment

    db 8 dup(0)

    db 8 dup(0)

stack ends

code segment

start:

    mov ax,stack

    mov ss,ax

    mov sp,16

    mov ax,1000

    call s

    mov ax,4c00h

    int 21h

s:add ax,ax

    ret

code ends

end start

8086汇编 call 指令

8086汇编 call 指令

字面意思:调用子程序
实质:流程转移指令,它们都修改IP,或同时修改CS和IP
call指令实现转移的方法和 jmp 指令的原理相似
格式:call 标号

返回指令:ret、retf

call 指令说明

CPU执行call指令,进行两步操作:
  (1)将当前的 IP 或 CS和IP 压入栈中;
  (2)转移到标号处执行指令。

call 标号:

  • 16位位移=“标号”处的地址-call指令后的第一个字节的地址;
  • 16位位移的范围为 -32768~32767,用补码表示;
  • 16位位移由编译程序在编译时算出。

CPU执行“call far ptr 标号”时的操作:

  (1) (sp) = (sp) – 2
       ((ss) ×16+(sp)) = (CS)
       (sp) = (sp) – 2
            ((ss) ×16+(sp)) = (IP)
      (2) (CS) = 标号所在的段地址
            (IP) = 标号所在的偏移地址

CPU执行“call near ptr 标号”时的操作:

“call 标号”类似”jmp near ptr 标号”,对应的机器指令中为相对于当前IP的转移位移,而不是转移的目的地址,实现段内转移。指令“call far ptr 标号”实现的是段间转移!

ret、retf

技术图片

使用案例

1、案例模板

说明:在程序走到call s时会直接跳转到 s: add ax, 1 这里列处理返回值ret以上指令当遇到ret后会返回到 mov ax, 4c00h 行接着往下执行。

技术图片
    mov ax, 0
    ; 使用主程序 s
    call s
    mov ax, 4c00h
    int 21h
; 创建主程序s
s: add ax, 1
    ; 返回
    ret
技术图片

 

以上是关于汇编语言-其他转移指令CALL的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言——call 和 ret 指令

8086汇编 call 指令

汇编语言流程转移与子程序篇--05

汇编10:CALL和RET指令

8086汇编之 CALL 和 RET指令

汇编-10.0-CALL和RET指令