10.2 从C到X86电子课件 计算机系统基础:C语言视角(RISC-V版).ppt
《10.2 从C到X86电子课件 计算机系统基础:C语言视角(RISC-V版).ppt》由会员分享,可在线阅读,更多相关《10.2 从C到X86电子课件 计算机系统基础:C语言视角(RISC-V版).ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10.2从C到X86电子课件计算机系统基础:C语言视角(RISC-V版)从从C C到到X86X86函数调用约定函数调用约定由于寄存器数量较少,局部变量和参数,都要由于寄存器数量较少,局部变量和参数,都要分配到栈帧中分配到栈帧中函数函数调用步骤调用步骤第一,调用函数第一,调用函数传递参数传递参数:将参数分配到栈帧的顶部,即低地址端;一般采用:将参数分配到栈帧的顶部,即低地址端;一般采用自右自右向左入栈向左入栈的方式的方式使用使用CALLCALL指令调用子例程指令调用子例程注意:注意:CALLCALL指令将指令将返回地址压栈返回地址压栈,此时,栈顶为返回地址,此时,栈顶为返回地址第二,被调用函数第
2、二,被调用函数将帧指针寄存器将帧指针寄存器EBPEBP压栈压栈采用采用callee-savecallee-save策略策略将其他需要将其他需要保存的寄存器压栈保存的寄存器压栈调整帧指针调整帧指针,使其指向栈帧的高地址端,即指向保存,使其指向栈帧的高地址端,即指向保存EBPEBP寄存器的单寄存器的单元元分配栈帧分配栈帧注意:注意:X86X86要求要求栈帧对齐栈帧对齐,起始地址以,起始地址以4 4个个0 0结尾,结尾,栈帧的大小是栈帧的大小是1616的倍数的倍数将将局部变量分配到栈帧局部变量分配到栈帧中中第三,被调用函数第三,被调用函数执行任务执行任务使用使用帧指针帧指针访问栈帧中的局部变量,特别
3、是读取调用者传来的参数,比使用栈访问栈帧中的局部变量,特别是读取调用者传来的参数,比使用栈指针访问更方便指针访问更方便如果函数有返回值,将如果函数有返回值,将返回值返回值存在存在EAXEAX寄存器中寄存器中第四,被调用函数第四,被调用函数执行结束,将保存的寄存器弹出,即执行结束,将保存的寄存器弹出,即恢复寄存器恢复寄存器使用使用LEAVELEAVE指令指令弹出栈帧弹出栈帧使用使用RETRET指令指令返回返回最后,最后,调用函数调用函数取回取回被调用函数的被调用函数的返回值返回值交换两个交换两个变量变量的的NewSwapNewSwap函数函数#include#include void NewSw
4、ap(int*firstVal,int*secondVal);void NewSwap(int*firstVal,int*secondVal);int main()int main()int valueA=3;int valueA=3;int valueB=4;int valueB=4;NewSwap NewSwap(&valueA,&valueB(&valueA,&valueB););printf(valueA=%d and valueB=%dn,valueA,valueB);printf(valueA=%d and valueB=%dn,valueA,valueB);void NewSwa
5、p(void NewSwap(int*firstValint*firstVal,int*secondValint*secondVal)int tempVal;int tempVal;tempVal=tempVal=*firstVal*firstVal;*firstVal *firstVal=*secondVal*secondVal;*secondVal *secondVal=tempVal;=tempVal;GCCGCC编译器编译器gcc gcc-S-S -masm=intel-masm=intel*.c*.c生成生成IntelIntel格式的格式的X86X86汇编汇编mainmain函数的汇
6、编代码函数的汇编代码01.section.rdata,dr;只读数据区只读数据区02 LC0:03.ascii valueA=%d and valueB=%d12004.text;代码区代码区05.globl _main06;07 _main:08pushebp;保存保存EBP09movebp,esp;调整调整EBP0Aandesp,-16;栈帧对齐栈帧对齐0Bsubesp,32;分配栈帧分配栈帧0Ccall_main0DmovDWORD PTR esp+28,3 ;MESP+28-3,valueA=3;0EmovDWORD PTR esp+24,4 ;MESP+24-4,valueB=4;0
7、Fleaeax,esp+24;EAX-ESP+24,&valueB10movDWORD PTR esp+4,eax;MESP+4-EAX,参数压栈参数压栈11leaeax,esp+28;EAX-ESP+28,&valueA12movDWORD PTR esp,eax;MESP-EAX,参数压栈参数压栈13call_NewSwap14movedx,DWORD PTR esp+24;EDX-MESP+24,valueB15moveax,DWORD PTR esp+28;EAX-MESP+28,valueA16movDWORD PTR esp+8,edx;MESP+8-EDX,参数压栈参数压栈17m
8、ovDWORD PTR esp+4,eax;MESP+4-EAX,参数压栈参数压栈18movDWORD PTR esp,OFFSET FLAT:LC0;MESP-LC0,参数压栈参数压栈19call_printf1Amoveax,0;return 0;1Bleave;栈帧弹出栈帧弹出1Cret;返回返回调用调用printfprintf函数函数NewSwapNewSwap函数的汇编代码函数的汇编代码01.globl _NewSwap02;03 _NewSwap:04pushebp;保存保存EBP05movebp,esp;调整调整EBP06subesp,16;分配栈帧分配栈帧07moveax,DW
9、ORD PTR ebp+8;EAX-MEBP+8,firstVal,&valueA08moveax,DWORD PTR eax;EAX-MEAX,*firstVal09movDWORD PTR ebp-4,eax;MEBP-4-EAX,temp=*firstVal;0Amoveax,DWORD PTR ebp+12;EAX-MEBP+12,secondVal,&valueB0Bmovedx,DWORD PTR eax;EDX-MEAX,*secondVal0Cmoveax,DWORD PTR ebp+8;EAX-MEBP+8,firstVal,&valueA0DmovDWORD PTR eax
10、,edx;MEAX-EDX,*firstVal=*secondVal;0Emoveax,DWORD PTR ebp+12;EAX-MEBP+12,secondVal,&valueB0Fmovedx,DWORD PTR ebp-4;EDX-MEBP-4,temp10movDWORD PTR eax,edx;MEAX-EDX,*secondVal=temp;11leave;栈帧弹出栈帧弹出12ret;返回返回BubbleSortBubbleSort函数函数1#include 1#include 2#define MAX_NUMS 102#define MAX_NUMS 103 34 void Bu
11、bbleSort(int list4 void BubbleSort(int list,int);,int);5 56 int main()6 int main()7 7 8 8int index;int index;9 9int numbers MAX_NUMS;int numbers MAX_NUMS;10101111/*/*获取输入获取输入*/*/1212printf(Enter%d numbers.n,MAX_NUMS);printf(Enter%d numbers.n,MAX_NUMS);1313for(index=0;index MAX_NUMS;index+)for(index=
12、0;index MAX_NUMS;index+)1414 1515printf(Input number%d:,index);printf(Input number%d:,index);1616scanf(%d,&numbersindex);scanf(%d,&numbersindex);1717 18181919/*/*调用排序程序调用排序程序*/*/2020BubbleSort(numbers,MAX_NUMS);BubbleSort(numbers,MAX_NUMS);21212222/*/*输出已排序的数组输出已排序的数组*/*/2323printf(nThe input set,in
13、 ascending order:n);printf(nThe input set,in ascending order:n);2424for(index=0;index MAX_NUMS;index+)for(index=0;index MAX_NUMS;index+)2525printf(%dn,numbersindex);printf(%dn,numbersindex);26 26 27272828void BubbleSort(int void BubbleSort(int listlist,int n),int n)2929 3030int i,j;int i,j;3131int t
14、emp;int temp;3232forfor(i=1;i=n-1;i+)(i=1;i=n-1;i+)3333for for(j=1;j=n-i;j+)(j=1;j listj)if(listj-1 listj)3535 3636temp=listj-1;temp=listj-1;3737listj-1 listj-1=listjlistj;38 38 listj=temp;listj=temp;3939 4040 mainmain函数的汇编代码函数的汇编代码01.text;代码区代码区02.globl_main03 ;04 _main:05pushebp;保存帧指针保存帧指针06movebp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10.2 从C到X86电子课件 计算机系统基础:C语言视角RISC-V版 X86 电子 课件 计算机系统 基础 语言 视角 RISC
限制150内