call和ret指令

call和ret指令都是转移指令,它们都修改ip,或同时修改cs和ip。

 

1、ret和retf

ret指令用栈中的数据修改ip的内容,从而实现近转移。

CPU执行ret指令时,进行下面两步操作:

(ip)=((ss)*16+sp)

(sp)=(sp)+2

相当于pop ip

 

retf指令用栈中的数据修改cs和ip的内容,从而实现远转移

CPU执行retf指令时,进行操作:

(ip)=((ss)*16+(sp))

(sp)=(sp)+2

(cs)=((ss)*16+(sp))

(sp)=(sp)+2

相当于pop ip

           pop cs

2、call指令

call指令经常跟ret指令配合使用,因为CPU执行call指令进行两步操作:

  • 将当前ip或cs和ip压入栈中
  • 转移jmp

call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令原理相同。

 

call 标号

将当前ip压入栈中后,转到标号处执行指令

CPU执行操作

(sp)=(sp)-2

((ss)*16+sp)=(ip)

(ip)=(ip)+16位位移

相当于 push ip

            jmp near ptr 标号

 

call  far ptr 标号  (段间转移)

CPU操作:

(sp)=(sp)-2

((ss)*16+(sp))=(cs)

(sp)=(sp)-2

((ss)*16+(sp))=(ip)

相当于 push cs

            push ip

            jmp far ptr 标号

 

call 16位寄存器

功能:

(sp)=(sp)-2

((ss)*16+(sp))=(ip)

(ip)=(16位寄存器)

相当于  push ip

             jmp 16位寄存器

 

call word ptr 内存单元地址

相当于 push ip

            jmp word ptr 内存单元地址

call dword ptr 内存单元地址

相当于 push cs

            push ip

            jmp dword ptr 内存单元地址

 

3、call和ret的配合使用

assume cs:code
code segment 
start : mov ax,1
        mov cx,3
        call s
        mov bx,ax
        mov ax,4c00h
        int 21h
      s:add ax,ax
        loop s
        ret
code ends
end

可以利用call和ret来实现子程序的机制。

4、mul指令

mul是乘法指令。

相乘的两个数:要么都是8位,要么都是16位

8位:al中和8位寄存器或内存字节单元

16位:ax中和16位寄存器或内存字单元中

结果:

8位:ax中

16位:DX(高位)和AX(低位)中

格式:

mul reg

mul 内存单元

例: mul byte ptr ds:[0]

含义:(ax)=(al)*((ds)*16+0)

 

5、模块化程序设计

call与ret指令共同支持了汇编语言编程中的模块化设计。

因为现实问题比较复杂,对现实问题进行分析时,把它转换称为相互联系、不同层次的子问题,是必须的解决问题方法。

 

6、参数和结果传递的问题

应该如何储存子程序需要的参数和产生的返回值。

用寄存器来存储参数

调用者将参数送入参数寄存器,从结果寄存器中取得返回值。

子程序从参数寄存器中取到参数,将返回值送入结果寄存器。

例:

assume cs:code
data segment 
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
data ends

start : mov ax,data
        mov ds,ax
        mov si,0
        mov di,16
        
        mov cx,8
      s:mov bx,[si]
        call cube
        mov [di],ax
        mov [di].2,dx
        add si,2
        add di,4
        loop s
        
        mov ax,4c00h
        int 21h

   cube:mov ax,bx
        mul bx
        mul bx
        ret
code ends
end start

7、批量数据的传递

将批量数据放入内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。

对返回结果,也可用同样的方法。

assume cs:code
data segment
db 'conversation'
data ends

code segment
start : mov ax,data
        mov ds,ax
        mov si,0
        mov cx,12
        call capital

        mov ax,4cooh
        int 21h

        
capital:add byte ptr [si],11011111b
        inc si
        loop capital
        ret
code ends
end start

还有一种通用方法:使用栈来传递参数

 

8、寄存器冲突的问题

使用jcxz指令来判断

capital:mov cl,[si]
        mov ch,0
        jcxz ok
        and byte ptr [si],11011111b
        inc si
        jmp short capital
     ok:ret

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值