首页 > 编程知识 正文

汇编call指令用法,汇编ret指令含义

时间:2023-05-03 20:43:25 阅读:245365 作者:4696

欢迎关注博主的公众号:jmdhb的平淡的睫毛膏

1.ret和retf指令

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

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

CPU执行ret指令相当于:pop IP

CPU执行retf指令相当于:pop IP

                                      pop CS

实例(ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令)

assume cs:code

stack segment

   db 16 dup (0)

stack ends

code segment

     mov ax,4c00h

      int 21h

start: mov ax,stack

         mov ss,ax

         mov sp,16

         mov ax,0

         push ax

         mov bx,0

         ret

code ends

end start

2.call指令

CPU执行call指令时,进行两步操作:

(1)将当前的IP或CS和IP入栈

(2)转移

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

1)依据位移进行转移的call指令

call 标号

相当于

push IP(此处的IP是下一条指令的IP)

jmp near ptr 标号

实例:

内存地址       机器码           汇编指令

1000:0         b8 00 00          mov ax,0

1000:3         e8 01 00          call s

1000:6        40                    inc ax

1000:7        58                  s:pop ax

执行后,ax=6。

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

“call far ptr 标号 ”实现段间转移

CPU执行“call far ptr 标号”时相当于

push CS

push IP

jmp far ptr 标号

实例:

内存地址     机器码                汇编指令

1000:0     b8 00 00               mov ax,0

1000:3     9A 09 00 00 10     call far ptr s

1000:8     40                         inc ax

1000:9     58                       s:pop ax

                                             add ax,ax

                                             pop bx

                                             add ax,bx

执行后,(ax)=1010h

3)转移指令在寄存器中的call指令

call 16位reg

相当于

push IP

jmp 16位reg

实例

内存地址     机器码                汇编指令

1000:0     b8 06 00               mov ax,6

1000:3     ff d0                     call ax

1000:5     40                         inc ax

1000:6                                  mov bp,sp

                                             add ax,[bp]

执行后,(ax)=0bh

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

call word ptr 内存单元地址

相当于

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 内存单元地址

相当于

push CS

push IP

jmp dword ptr 内存单元地址

实例:

mov sp,10h

mov ax,0123h

mov ds:[0],ax

mov word ptr ds:[2],0

call dword ptr ds:[0]

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


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。