2.5 OpenEuler 中C与汇编的混合编程
2.5 OpenEuler 中C与汇编的混合编程
- 任务详情
- 在X86_64架构下实践2.5中的内容,提交代码和实践截图
- 把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图
- 实验内容要经过答辩才能得到相应分数
2.1
/**********a.c file********/
#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);
}
汇编代码
.file "a.c"
.text
.globl A
.type A, @function
A:
.LFB0:
.cfi_startproc
endbr32
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
pushl %ebx
subl $20, %esp
.cfi_offset 3, -12
call __x86.get_pc_thunk.ax
addl $_GLOBAL_OFFSET_TABLE_, %eax
movl $4, -20(%ebp)
movl $5, -16(%ebp)
movl $6, -12(%ebp)
subl $8, %esp
pushl -16(%ebp)
pushl -20(%ebp)
movl %eax, %ebx
call B@PLT
addl $16, %esp
movl %eax, -12(%ebp)
nop
movl -4(%ebp), %ebx
leave
.cfi_restore 5
.cfi_restore 3
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size A, .-A
.section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
.globl __x86.get_pc_thunk.ax
.hidden __x86.get_pc_thunk.ax
.type __x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
.LFB1:
.cfi_startproc
movl (%esp), %eax
ret
.cfi_endproc
.LFE1:
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
.section .note.GNU-stack,"",@progbits
.section .note.gnu.property,"a"
.align 4
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.string "GNU"
1:
.align 4
.long 0xc0000002
.long 3f - 2f
2:
.long 0x3
3:
.align 4
4:
2.2
代码:
#include <stdio.h>
extern int get_ebp();
extern int get_esp();
int main()
{
int ebp, esp;
ebp = get_ebp();
esp = get_esp();
printf("ebp=%8x esp=%8x\n",ebp,esp);
}
- 汇编代码:
.section .text
.global get_esp, get_ebp
get_esp:
movl %esp, %eax
ret
get_ebp:
movl %ebp, %eax
ret
2.3
- 代码:
#include <stdio.h>
extern int mysum(int a, int b);
int main()
{
int a,b,c;
a = 123; b = 456;
c = mysum(a,b);
printf("c = %d\n",c);
}
- 汇编代码:
.text
.global mysum,printf
mysum:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl 12(%ebp), %eax
movl %ebp, %esp
pop %ebp
ret
2.4
- 代码:
int a,b;
int main()
{
a = 100;b = 200;
sub();
}
- 汇编代码:
.text
.global sub,a,b,printf
sub:
pushl %ebp
movl %esp,%ebp
pushl b
pushl a
pushl $fmt
call printf
addl $12,%esp
movl %ebp,%esp
popl %ebp
ret
.data
fmt: .asciz "a=%d b=%d\n"