c和汇编互相调用

a2824cl 2002-10-05 10:15:31
谁能具体讲讲,有网上的教材也可以
...全文
230 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
a2824cl 2002-10-15
  • 打赏
  • 举报
回复
非常感謝大家,尤其是xiaott(苹果),給了我很多的幫助。預祝我星期四報告順利吧。謝謝
xdspower 2002-10-13
  • 打赏
  • 举报
回复
好象有本书是专门讲这类问题的,已经出了很久了,其实调用主要是在连接的时候实现的,只不过在编写供其他语言调用的函数时要按照一定的接口规范来定义接口,这样产生的目标库才能被相应的连接程序所识别,才能更好的方便的被连接,如果你不按这样的规范来,也不是完全不能成功,而是你可能在目标语言的调用接口时要更多的定义,或者使用来不方便。
特别是c/c++同汇编的相互调用,基本上怎么都可以,目标代码就是连接库嘛,语言本身就多的时,可是如果在接口定义时没有按规范,这使用起来就不方便了,比如变量名成了奇怪的字符串了!
a2824cl 2002-10-13
  • 打赏
  • 举报
回复
程序用什么命令运行?
a2824cl 2002-10-13
  • 打赏
  • 举报
回复
xdspower() ,我就是找不到什么好书,才问题多多.我现在就想对具体的这个问题求解. 能指点我我该用什么命令编译吗?
a2824cl 2002-10-10
  • 打赏
  • 举报
回复
告诉我如何在汇编里调用C吧。最好吧文章的连接给我。我要做报告,需要准备很多材料。
a2824cl 2002-10-08
  • 打赏
  • 举报
回复
up
Crystal_arrow 2002-10-07
  • 打赏
  • 举报
回复
关注
jakie 2002-10-07
  • 打赏
  • 举报
回复
楼上的例子很不错的
a2824cl 2002-10-07
  • 打赏
  • 举报
回复
看在给分的面子上,在告诉我如何在汇编里调用C吧。最好吧文章的连接给我。我要做报告,需要准备很多材料。
a2824cl 2002-10-07
  • 打赏
  • 举报
回复
等待
a2824cl 2002-10-07
  • 打赏
  • 举报
回复
你是哪里找到这个的能把连接给我吗?
a2824cl 2002-10-06
  • 打赏
  • 举报
回复
请问xiaott(苹果) , 你是哪里找到这个的能把连接给我吗?

xiaott 2002-10-06
  • 打赏
  • 举报
回复
//例程:

例程1、============================================================
C语言调用一个汇编语言程序,传送两个参数A与B,汇编过程完成A乘以2的B次方,计算并将结果由C语言输出。程序如下:

/*C语言程序:CAC1.c*/
/*CAC1.C--MSC call MASM routine*/
extern int power2(int,int)
main()
{
printf("3 times 2 to the power of 5 is%d\n",power2(3,5));
}

;汇编语言程序:CAA1.ASM
;CAA1.ASM--MASM routine called by MSC
.MODEL SMALL
.CODE
PUBLIC_power2
_power2 proc
push bp ;save bp
mov bp,sp ;point to stack
mov ax,[bp+4] ;load arg1
mov cx,[bp+6] ;load arg2
sh1 ax,c1 ;calculate
pop bp ;restore bp
ret ;return
_power2 endp
end

这是一个极简单的程序,C语言程序先用extern以被调用汇编过程power2作了说明,变量类型为int型,C语言程序用小型模式编译,在汇编程序中用了.MODEL SMALL与之呼应,并将被调过程power2前加上下划线且说明成PUBLIC,在结束时,只用指令RET返回。

例程2================================================================
C语言调用汇编程序,无参数传递,C语言程序先输出一数字序列,然后把控制交给汇编程序,由汇编过程输出后继序列。程序如下:

/*C语言程序:CAC2.C*/
extern print();
main()
{
printf("follows are printed by c language:\n");
printf("0123456789\n");
printf("follows are printed by MASM:\n");
print();
}

汇编语言程序:CAA2.ASM
.MODEL SMALL
.DATA
string db"0123456789",0dh,0ah,'¥'
.CODE
PUBLIC_print
_print proc
mov dx,offset string
mov ah,09h
int 21h
ret
_print endp
end

这里,主调C程序调用了汇编过程print,在汇编过程中对print分别用PUBLIC和下划线作了说明,由于只传递参数,故无需设置基址指针BP,即未采用push BP和mov BP,sp指令。返回时也直接用了RET指令。

例程3=================================================================
C语言采用传址方式向被调用的汇编过程传递参数。

/*C语言程序:CAC3.C*/
extern int plus(int *);
main()
{
int n=5;
print("befor call:n=%d\n",n);
plus(&n);
printf("after call:n=%d\n",n);
}

;汇编语言程序:CAA3.ASM
.MODEL SMALL
.CODE
PUBLIC_plus
_plus proc
push bp
mov bp,sp
mov bx,[bp+4]
mov al,[bx]
inc al
mov [bx],al
pop bp
ret
_plus endp
end

以传址方式传送参数,对外部过程的参数应当说明成一个指针,且函数plus返回一个整形值,即:extern int plus(int*);在调用时,由一元算符&取得变量N的地址作为实参传送。在汇编程序中,利用利用基址指针BP,先取地址,再间接取内容,修改后送回原处,同时以RET返回。


a2824cl 2002-10-06
  • 打赏
  • 举报
回复
有大段的教材和解释吗?

我要做报告.需要参考和翻译.
IamHacker 2002-10-05
  • 打赏
  • 举报
回复
错了!在VC++里用 _ASM{ .......}
IamHacker 2002-10-05
  • 打赏
  • 举报
回复
在VC++里用不着 _ASM{ .......}
ckacka 2002-10-05
  • 打赏
  • 举报
回复
前面要加上
asm: ....
可以直接操作变量

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧