[C语言中如何调用子程序]C语言中,子程序是通过函数来实现的,一个函数相当于一个有独立功能的子程序,子程序意在体现着main函数的作用。 函数机制的实现通常需要经过设计、声明和调用来完成的。 所有的...+阅读
你是指内联汇编吧?比如下面这个例子:
#include
int func(int a, int b)
{
return a - b;
}
int main()
{
//计算 12-5
int a = 12, b = 5; //给定两个数
int res; //用来记录结果
__asm{ //内联汇编
push b; //b压栈
push a; //a压栈,注意C中函数接受参数的时候入栈是反着的
call func; //调用函数func, 返回值保存在eax里
mov res, eax; //将eax里的值赋给res
}
printf("%d\n", res); //输出结果,得到7
return 0;
}
用汇编语言编写子程序后如何调用
好意思 一开始没抄有看到”调用子程序zhidao“ 已改正:
data segment
array db '8750423196 $'
data ends
code segment
assume cs:code
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
call son
ret
main endp
son proc near
mov cx,9
loop2:
mov bx,cx
lea di,array
loop1:
mov al,[di]
cmp al,[di 1]
jle next
xchg al,[di 1]
mov [di],al
next:
inc di
loop loop1
mov cx,bx
loop loop2
output:
lea dx,array
mov ah,9
int 21h
ret
code ends
end start
汇编语言子程序调用
简单点说,call指令在跳转前保存当前指令地址,而jmp一类的指令不保存当前指令的地址。 详细点说: call指令在跳转前会在栈中保存当前的程序计数器(IP)的值(有必要的话还要保存CS),保存完IP的值后,再去执行跳转指令。即相当于: push CS (没有这种指令,有没有这一句还要看调用的类型:far/near) push IP (没有这种指令) jmp [word ptr/dword ptr] ... 这样,程序在执行ret/retf指令时就能从栈中取出IP的值,即相当于: pop IP (没有这种指令) pop CS (没有这种指令,有没有这一句也要看调用的类型) 来继续执行call指令后的其他指令,当然你也可以选择不执行ret,而把call当做jmp来用。这样也没有问题(没人这么干),只不过栈里多了点东西罢了,记得处理就好。 而形如jmp一类的指令只是简单的执行跳转(修改IP的值),并不保存IP的值。
当然跳转后程序也就不知道原来是从哪里跳转到这里来的,自然就无法返回。 当然,这个时候ret指令还是可以用的,因为ret指令只是简单的从栈顶取出一个word然后赋给IP,所以也可以用ret指令来实现jmp的功能(也没人这么干)。如: mov bx,offset s push bx ret 这样就相当于: jmp s 所以说不要只是记一...简单点说,call指令在跳转前保存当前指令地址,而jmp一类的指令不保存当前指令的地址。 详细点说: call指令在跳转前会在栈中保存当前的程序计数器(IP)的值(有必要的话还要保存CS),保存完IP的值后,再去执行跳转指令。即相当于: push CS (没有这种指令,有没有这一句还要看调用的类型:far/near) push IP (没有这种指令) jmp [word ptr/dword ptr] ... 这样,程序在执行ret/retf指令时就能从栈中取出IP的值,即相当于: pop IP (没有这种指令) pop CS (没有这种指令,有没有这一句也要看调用的类型) 来继续执行call指令后的其他指令,当然你也可以选择不执行ret,而把call当做jmp来用。
这样也没有问题(没人这么干),只不过栈里多了点东西罢了,记得处理就好。 而形如jmp一类的指令只是简单的执行跳转(修改IP的值),并不保存IP的值。当然跳转后程序也就不知道原来是从哪里跳转到这里来的,自然就无法返回。 当然,这个时候ret指令还是可以用的,因为ret指令只是简单的从栈顶取出一个word然后赋给IP,所以也可以用ret指令来实现jmp的功能(也没人这么干)。如: mov bx,offset s push bx ret 这样就相当于: jmp s 所以说不要只是记一个指令怎么用,而是要理解一个指令到底是什么原理。
以下为关联文档:
汇编语言子程序调用简单点说,call指令在跳转前保存当前指令地址,而jmp一类的指令不保存当前指令的地址。 详细点说: call指令在跳转前会在栈中保存当前的程序计数器(IP)的值(有必要的话还要保存CS),保...
C语言调用另一个程序调用其他程序有两种方式,一个是直接调用其他模块中的函数,另外一个是用系统调用的方式调用已经编译连接好的可执行文件。 第一种方法的话,无论你用什么工具都是在你的程序里面...
c语言题目 c语言程序中当调用函数时哪个正确c语言程序中,当调用函数时,实参和形参各占一个独立的存储单元。 C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存...
C语言子程序的定义和调用原发布者:jiaozhu95 本节介绍C程序的基本单元--函数。函数中包含了程序的可执行代码。每个C程序的入口和出口都位于函数main()之中。main()函数可以调用其他函数,这些函数执行完...
如何调用中断延时程序要用C语言实现如何做呢哥实在不知道你说的是什么意思。我就按我想的写吧 好久都没有写51了,原谅里面的一些小错误,你自己再动动脑就行了!希望能帮到你,以后互相交流 #include<reg52.h> void init() {...
如何把汇编程序嵌入到C语言中不同编译器嵌入汇编的方式不一样,具体如下: 一、Turbo C , 也就是所说的TC。 1、使用预处理程序的伪指令#asm和#endasm,#asm用来开始一个汇编程序块,而#endasm指令用于该块的结...
汇编语言是怎么调用c语言的程序的一、 参数传递的基本规则(ATPCS(ARM—Thumb Procedure Call Standard)) 1、 参数传递 二、汇编程序、C程序相互调用举例 1、 C程序调用汇编程序 汇编程序的设计要遵守ATPCS(A...
c语言中如何调用汇编程序1、如果汇编程序是可执行文件,比如exe文件,则可以使用system函数直接调用。比如下面的代码,用system()打开windows上的记事本程序。#include #include int main(){system("notepa...
C语言和汇编语言的相互调用这不是很复杂。 一个.c,一个.asm int __stdcall PlusOne(int* i) { return i+1; }.asm .386 .model flat,stdcall option casemap:none include windows.inc include user32....