2.5OpenEuler 中C與彙編的混合程式設計
阿新 • • 發佈:2021-12-05
1.任務詳情
1.在X86_64架構下實踐2.5中的內容,提交程式碼和實踐截圖
2把2.5的內容在OpenEuler中重新實踐一遍,提交相關程式碼和截圖
3.實驗內容要經過答辯才能得到相應分數
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.3.0-17ubuntu1~20.04) 9.3.0" .section .note.GNU-stack,"",@progbits .section .note.gnu.property,"a"
截圖:
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"
截圖: