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

jcxz

指令格式: jcxz标号

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

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

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

    jmp short标号

    jmp near ptr标号

    jcxz标号

    loop标号

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

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

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

CALL指令

mov ax,0

call s

mov ax,4c00h

int 21h

s:add ax,1

ret


call指令流程图

调用子程序call指令

返回 ret指令

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

格式call 标号

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

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

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


call 标号

call 标号

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

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

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

指令call far ptr标号 实现的段间转移


call far ptr标号


转移地址在寄存器中call指令


寄存器中call


转移地址在内存中的call指令


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位)


call dword  ptr

返回指令ret和retf


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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容