2.5 OpenEuler 中C与汇编的混合编程(选做)待完善

1|0a.c

#include <stdio.h>
extern int B();
int A(int x,int y)
{
int d, e,f;
d = 4;
e = 5;
f= 6;
f = B(d,e);
}


2|0a.s

.text
.globl A
A:
pushl %ebp
movl %esp,%ebp
subl $24, %esp
movl $4,-12(%ebp) # d=4
movl $5,-8(%ebp) # e=5
movl $6, -4(%ebp) # f=6
subl $8,%esp
pushl -8(%ebp) # push e
pushl -12(%ebp) # push d
call B
addl $16,, %esp #clean stack
movl %eax,-4(%ebp) # f=return value in AX
leave
ret

2(1)

3|0s.s

.global get_esp,get_ebp
get_esp:
movl %esp,%eax
ret
get_ebp:
movl %ebp,%eax
ret
#====================================
int main()
{
int ebp,esp;
ebp = get_ebp();
esp = get_esp();
printf("ebp=%8x esp=%8x\n",ebp,esp);
}

2(2)

4|0sum.c

int main() # driver program to test mysum() function
{
int a,b,c;
a = 123; b = 456;
c = mysum(a, b);
printf("c=%d\n", c); // c should be 579
}

5|0mysum.s

.text
.global mysum,printf
mysum:
pushl %ebp
movl %esp,ebp
movl 8(%ebp),eax
add1 12(%ebp),%eax
movl %ebp,%esp
pop %ebp
ret

3

6|0sub.c

#include <stdio.h>
int a,b;
int main()
{
a = 100; b = 200;
sub();
}

7|0Assembly Code

.text
.global sub, a, b, printf
sub
pushl %ebp
movl %esp,%ebp
pushl b
pushl a
pushl $fmt # push VALUE (address) of fmt
call printf # printf(fmt,a,b);
addl $12, %esp
movl %ebp,%esp
popl %ebp
ret
.data
fmt: .asciz "a=%d b=%d\n"

7|1汇编代码最好自己打,或者复制后将所有间隔改为缩进(Tab),否则编译错误


__EOF__

本文作者Oxygen_bean
本文链接https://www.cnblogs.com/GanNy/p/15611045.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   氧气2019  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示