功能: 如果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
解释三菱PLC CALL指令的具体用法如下下:
连接时使用呼叫,调用P1后跳过主程序,先执行P1子程序,调用后返回主程序。P1作为指针存在。如果调用未接通,则不执行调用,直接执行主程序。调用程序可以嵌套,见下图。一个子例程可以调用另一个子例程。如图所示:
PLC CALL 简介:
CALL通常指REMOTE CALL、游戏CALL,指一种注入外部EXE程序从外部调用函数的技术。找CALL一般使用OD等工具,而CALL的使用一般需要编写复杂的汇编代码。在快手(AAuto Quicker)中推出了一种通用CALL技术,可以象声明WIN API一样声明CALL.下面是一个简单的示例:
//外部CALL读取命令行
//列出所有已运行进程的命令行参数
import winex
io.open()
//遍历所有窗口
call是调用子程序,ret是返回。就是说call之后就开始执行子程序,而执行到ret的时候回到call下面那句代码处执行
call
pro
mov
ax,bx
pro:
...
ret
执行call后跳转到pro处开始执行子程序,执行到ret后返回到mov出执行
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)