汇编语言 call怎么用
汇编语言CALL是调用子程序指令,用法如下:
CALL
子程序名
参数的传递是通过调用者和被调用者的相互约定实现的。
在51汇编语言中CALL只能实现2K范围内的调用,大于这个限制就需要用到LCALL了。
比如:
ORG
0000H
LJMP
MAIN:
MAIN:
MOV
SP,#7FH
CALL
INIT
LOOP:
JNB
RI,$
CLR
RI
MOV
A,SBUF
MOV
SBUF,A
JB
TI,$
CLR
TI
SJMP
LOOP
INIT:
MOV
TMOD,#20H
;定时器1做波特率发生器
MOV
TH1,#0FDH
;波特率9600bps
MOV
TL1,#0FDH
MOV
SCON,#50H
;串口工作方式1,运行接受
SETB
TR1
RET
END
汇编语言中的call是什么意思
汇编语言中CALL指令调用一个子程序,CPU执行call指令,进行两步操作:
(1)将当前的 IP 或 CS和IP 压入栈中;
(2)转移到紧跟的标号行地址执行程序。
比如:
CALL InputCheck
……..
InputCheck:
……..
其处理步骤如下:
(1) (sp) = (sp) – 2
((ss) ×16+(sp)) = (CS)
(sp) = (sp) – 2
((ss) ×16+(sp)) = (IP)
(2) (CS) = InputCheck所在的段地址
(IP) = InputCheck所在的偏移地址
汇编语言中的STR是什么意思.还有CALL指令怎么用
分类: 电脑/网络 》》 程序设计 》》 其他编程语言
解析:
据我所知,汇编里面没有str这个指令,可能是人家定义的字符串或者宏你错误的理解成指令了,而call是个调用指令,即被call的是一个子程序,一旦用了,这个子程序就会被抓到当前位置执行一次。
汇编语言中的call是什么意思
意思:指REMOTE CALL、游戏CALL,指一种注入外部EXE程序从外部调用函数的技术。找CALL一般使用OD等工具,而CALL的使用一般需要编写复杂的汇编代码。
call指令的用法
1、call+标号
这个指令是先将call+标号的下一条语句的IP放入栈中,然后使当前的IP+16位位移。
jmp有个指令格式是:jmp near ptr标号,这里的call唯一这种jmp多的一步就是多了一次入栈操作;
call far ptr+标号
这个指令是先将call指令的下一个指令的代码段地址入栈,再把call下一条指令的偏移地址入栈,然后使其跳到标号所在处。
jmp指令的:jmp far ptr标号,这种jmp的使用是在段间转移的,这种call和jmp的区别就是多了两次入栈的操作;
3、call+16位寄存器
这个指令先将call的下一条指令的IP入栈,然后再以ax为IP的代码处
jmp指令:jmp+16位寄存器,这里的call唯一比jmp多的一步就是多了一步入栈操作;
扩展资料:
VB关键字(调用)
用于将程序的执行交给其他的代码段,通常是一个子例程,同时保存必要的信息,从而使被调用段执行完毕后返回到调用点继续执行。
描述
将控制权传递给Sub过程或Function过程。
语法
Call语句语法有以下部分:
部分描述
Call可选关键字。如果指定此关键字,则必须用括号把argumentlist括起来。例如:
Call MyProc(0)
name必选。要调用的过程名。
argumentlist可选。传递给过程的变量、数组或表达式列表,用逗号分隔每一项。
说明
在调用过程时,不必使用Call关键字。然而,如果使用Call关键字调用要求参数的过程,则必须用括号将argumentlist括起来。如果省略Call关键字,那么必须也同时省略argumentlist参数两边的括号。使用Call语法调用内部函数或使用用户自定义函数,函数返回值都会被放弃。
参考资料:
百度百科——call
汇编语言-其他转移指令CALL
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位位移的范围为 用补码表示
16位移由编译程序在编译时算法。
call word ptr内存单元地址word = 字(16位)
相当于push ip
jmp word ptr内存单元地址
mov sp,10h
mov ax,0123h
mov ds:,ax
call word ptr ds:
执行后(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
微机原理与汇编语言中的指令JMP、CALL的区别
汇编语言中,JMP是无条件转移指令,CALL是子程序调用指令。
指令JMP、CALL的区别在于,JMP指令控制程序直接跳转到目标地址执行程序,程序总是顺序执行,指令本身无堆栈操作过程。CALL指令跳转到指定目标地址执行子程序,执行完子程序后,会返回CALL指令的下一条指令处执行程序,执行CALL指令有堆栈操作过程。
举例如下:
JMP
NEAR
NEXT;跳转到NEXT执行程序
……
NEXT:
;目标地址,程序将从这里向下执行
……
CALL
NEXT;调用从地址NEXT开始的子程序
NOP
;子程序结束后返回到这里,然后向下继续执行程序
……
NEXT:
;子程序目标地址,程序将从这里向下执行
RET
;子程序返回指令,子程序执行到此结束,返回CALL指令的下一条指令处
汇编call 指令
call
word
ptr
?下的内容给ip,然后继续执行.
在压栈时是sp=sp-2,ss:=压栈的ip值.
call
dword
ptr
?下的内容给ip,
?的内容给cs,然后继续执行.
这里是sp=sp-2;ss:=压栈的ip.
希望对你有用.
汇编语言中LCALL和JMP有什么区别啊
一、程序执行顺序不同
1、LCALL:LCALL是调用子程序,当子程序执行完后就返回到LCALL指令下一条指令继续执行程序
2、JMP:JMP是无条件转移指令,转移到某执行程序后就不再返到回原处,是一去不回返的。
二、程序处理方式不同
1、LCALL:指令在进行流程跳转前会保存返回地址,以便在跳转目标代码中可以使用ret指令返回到call指令的下一条指令处继续执行。执行段内跳转时,只保存EIP;如果是段间跳转,还保存CS。
2、JMP:进行执行流程的跳转,不会保存返回地址。
汇编语言子程序是如何定义的
这样定义的:
子程序名 PROC NEAR|FAR
.
.
RET
子程序名 ENDP
子程序名相当于标号,表示本过程的符号地址。过程有NEAR和FAR两种类型,FAR型的过程可供段间调用,NEAR型过程仅供段内调用。
在一个过程中,至少要有一条返回指令RET,它可以书写在过程中的任何位置,但是过程执行的的最后一条指令一定是RET。
扩展资料:
注意事项
一、子程序调用指令
格式:CALL 子程序名
CALL指令的两个作用,1.将断点地址(CALL指令的下一条指令地址)压栈保存,2.转去子程序执行。
可以省略。
二、返回指令
格式:RET
指令作用:实现子程序执行完后返回主程序的指令。从堆栈栈顶弹出一个字数据(段内调用)送入IP作为返回地址。N是立即数,执行完RET之后,再将SP增加N,也叫“平栈”。
汇编语言中CALL可以用什么代替
汇编语言中CALL可以使用invoke伪指令代替;
INVOKE 的语法如下: INVOKE expression expression 既可以是一个函数名也可以是一个函数指针。参数由逗号隔开。
INVOKE是编译器支持的伪指令,会检查参数。
CALL会直接去栈里取参, INVOKE最后也会变成 PUSH PUSH … CALL 的形式。