实验11_程序的机器级表示_过程_实验报告
- 格式:doc
- 大小:207.00 KB
- 文档页数:7
本栏目责任编辑:王力计算机教学与教育信息化基于编程的计算机组成原理实验教学吴元斌(重庆三峡学院计算机科学与工程学院,重庆404000)摘要:该文分析了基于编程的计算机组成原理实验教学方法,介绍了字节顺序和数据对齐、存储器层次结构与局部性原理、整数的机器表示与运算、浮点数的表示与运算、DEBUG 与机器指令、C 语言程序的机器级表示等实验教学内容。
实践表明,基于编程的实验教学对学生学习和掌握计算机组成原理十分有效。
关键词:计算机组成原理;实验;教学;编程;C 语言中图分类号:G642文献标识码:A文章编号:1009-3044(2020)36-0110-03开放科学(资源服务)标识码(OSID ):Experimental Teaching in the Principles of Computer Organization based on Programming WU Yuan-bin(Department of Computer Science and Engineering,Wanzhou 404000,China)Abstract :the experimental teaching method of computer composition principle based on programming are analyzed in this paper.the byte ordering and data alignment,the memory hierarchy and the principle of locality,the machine representation and operation of integers,the representation and operation of floating-point numbers,debug and machine instructions,and machine level repre⁃sentation of C language programs are introduced.Practice shows that the experimental teaching method based on programming is very effective for students to learn and master the principles of computer organization.Key words :the principles of computer organization;experiment;teaching;programming;the c language1引言计算机组成原理课程的主要目标是:(1)理解单处理器计算机系统中各部件的内部工作原理、组成结构以及相互连接方式,具有完整的计算机系统的整机概念。
浙江大学城市学院实验报告课程名称计算机系统原理实验实验项目名称实验三数据的机器级表示实验成绩指导老师(签名)日期一、实验目的:1、通过无符号数和带符号整数之间的相互转换来理解无符号数和补码整数的表示;2、了解IEEE 754浮点数在机器中的应用,特别是一些特殊值的处理。
二、实验步骤:1、用32位补码表示的机器上编译并执行以下程序,记录程序的执行结果,并解释原因。
图3-1运行结果:对运算结果的解释:第一个结果:因为在ISO C90标准中,编译器将-2147483648分为两个部分来处理。
首先将2147483648看成无符号整型,其机器数为0x80000000,然会对其取负,结果仍为0x80000000,还是将其看成无符号整型,其值仍为21474833648,因此前者大于后者。
第二个结果:由于i为int型变量,因此这两个数皆为带符号数,前者小于后者。
第三个结果:编译器首先将2147483647看成带符号整型,然后对其取负,得到-2147483647,然后对其-1得到-2147483648,因此前者大于后者。
2、编写程序,计算表2.1中的表达式,说明运算类型(无符号、带符号),得到运算结果,并说明为什么是这样的运算结果(参考第二章习题8);源代码:运算结果:对运算结果的解释:1.0和0U都是无符号数,值相等2.-1和0都为带符号数,因此前者小于后者3.0后加上U表示无符号数,因此比较时前者大于后者4.-2147483647-1的计算结果为一个int型整数,为带符号数,因此前者大于后者。
5.加上U的数都为无符号数,因此前者小于后者6.2147483648U在经过int强制类型转换后,变为带符号的-2147483648,因此前者大于后者7.两个数皆为带符号数,因此前者大于后者8.数据转化为无符号数,前者11…1B (2^32-1) > 后者11…10B (2^32-2)3、分析以下代码:当len = 0 时, 执行sum 函数的for循环时会发生Access Violation , 即段错误异常. 但是, 当参数len 说明为int 型时, sum 函数能正确执行, 为什么?编写程序测试并分析。
PL/0实验报告课程名称编译原理题目名称PL/0编译程序学生学院计算机科学与技术学院专业班级学号学生姓名班内序号山东理工大学实验报告纸第 1 页姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字实验项目编号(1)PL/0编译程序的分析指导教师鞠传香实验目的1.熟悉pl/0语言并能编写小程序2.掌握pl/0编译程序的编译过程(词法分析、语法分析、语义分析等)实验仪器(编号)材料、工具PC机、VC++6.0(原理概述)pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。
PL/0语言文法的EBNF表示EBNF表示的符号说明。
〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。
∷= :该符号的左部由右部定义,可读作'定义为'。
| :表示'或',为左部可由多个右部定义。
{ } :花括号表示其内的语法成分可以重复。
在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。
如:{*}表示*重复任意次,{*}38表示*重复3-8次。
[ ] :方括号表示其内的成分为任选项。
( ) :表示圆括号内的成分优先。
例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/// 栈顶指针减一相关过程:base(),interpret()。
课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:年月日计算机科学与技术学院目录实验1: (1)实验2: (7)实验3: (24)实验总结 (34)实验1:数据表示1.1 实验概述实验目的:更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验目标:加深对数据二进制编码表示的了解。
实验要求:使用有限类型和数量的运算操作实现一组给定功能的函数。
实验语言:c。
实验环境:linux1.2 实验内容需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。
1)位操作表1列出了bits.c中一组操作和测试位组的函数。
其中,“级别”栏指出各函数的难度等级(对应于该函数的实验分值),“功能”栏给出函数应实现的输出(即功能),“约束条件”栏指出你的函数实现必须满足的编码规则(具体请查看bits.c中相应函数注释),“最多操作符数量”指出你的函数实现中允许使用的操作符的最大数量。
你也可参考tests.c中对应的测试函数来了解所需实现的功能,但是注意这些测试函数并不满足目标函数必须遵循的编码约束条件,只能用做关于目标函数正确行为的参考。
表1 位操作题目列表2)补码运算表2列出了bits.c中一组使用整数的补码表示的函数。
可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。
表2 补码运算题目列表3)浮点数操作表3列出了bits.c中一组浮点数二进制表示的操作函数。
可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。
注意float_abs的输入参数和返回结果(以及float_f2i函数的输入参数)均为unsigned int类型,但应作为单精度浮点数解释其32 bit二进制表示对应的值。
表3 浮点数操作题目列表表示,当输入参数是NaN 时,返回NaN 号整型操作,包括||,&&以及if,while控制结构4 float_f2i 返回浮点数‘f’的强制整型转换“(int)f”表示仅能使用任何整型/无符号整型操作,包括||,&&以及if,while控制结构301.3 实验设计根据题目要求,选择合适的操作符来编写代码。
课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24 日计算机科学与技术学院目录实验1: (2)实验2: (9)实验3: (22)实验总结 (30)实验1:数据表示1.1 实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。
实验语言:c; 实验环境: linux1.2 实验内容需要完成bits.c 中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。
1.3 实验设计源码如下:/** lsbZero - set 0 to the least significant bit of x* Example: lsbZero(0x87654321) = 0x87654320* Legal ops: ! ~ & ^ | + << >>* Max ops: 5* Rating: 1*/int lsbZero(int x) {//x右移一位再左移一位实现把最低有效位置0x = x>>1;x = x<<1;return x;}/** byteNot - bit-inversion to byte n from word x* Bytes numbered from 0 (LSB) to 3 (MSB)* Examples: getByteNot(0x12345678,1) = 0x1234A978* Legal ops: ! ~ & ^ | + << >>* Max ops: 6* Rating: 2*/int byteNot(int x, int n) {//x第n个字节每位都和1异或实现取反int y = 0xff;n = n<<3;y = y<<n;x = (x^y);return x;}/** byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1* example: byteXor(0x12345678, 0x87654321, 1) = 1* byteXor(0x12345678, 0x87344321, 2) = 0* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 2*/int byteXor(int x, int y, int n) {//把x和y的第n个字节取出来异或,再转换为逻辑的0和1n = n<<3;x = x>>n;y = y>>n;x = x&(0xff);y = y&(0xff);return !!(x^y);}/** logicalAnd - x && y* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int logicalAnd(int x, int y) {//把x和y分别转化为逻辑的0和1,再相与x = (!(!x))&(!(!y));return x;}/** logicalOr - x || y* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int logicalOr(int x, int y) {//把x和y分别转化为逻辑的0和1,再相或x = (!(!x))|(!(!y));return x;}/** rotateLeft - Rotate x to the left by n* Can assume that 0 <= n <= 31* Examples: rotateLeft(0x87654321,4) = 0x76543218* Legal ops: ~ & ^ | + << >> !* Max ops: 25* Rating: 3*/int rotateLeft(int x, int n) {//先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&z即可int z;z = ~(((1<<31)>>31)<<n);x = ((x>>(32+(~n+1)))&z)+(x<<n);return x;}/** parityCheck - returns 1 if x contains an odd number of 1's* Examples: parityCheck(5) = 0, parityCheck(7) = 1* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 4*/int parityCheck(int x) {//每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1int y;y = x<<16;y = y^x;y = y^(y<<8);y = y^(y<<4);y = y^(y<<2);y = y^(y<<1);y = y>>31;return !(!y);}/** mul2OK - Determine if can compute 2*x without overflow* Examples: mul2OK(0x30000000) = 1* mul2OK(0x40000000) = 0** Legal ops: ~ & ^ | + << >>* Max ops: 20* Rating: 2*/int mul2OK(int x) {//把x第31位和30位分别和1做按位与,再异或,再和1异或int m;m = ((x>>31)&0x1)^((x>>30)&0x1);return m^0x1;}/** mult3div2 - multiplies by 3/2 rounding toward 0,* Should exactly duplicate effect of C expression (x*3/2),* including overflow behavior.* Examples: mult3div2(11) = 16* mult3div2(-9) = -13* mult3div2(1073741824) = -536870912(overflow)* Legal ops: ! ~ & ^ | + << >>* Max ops: 12* Rating: 2*/int mult3div2(int x) {//左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1int y = (x<<1)+x;y = (y>>1)+(((y>>31)&1)&(((y<<31)>>31)&1));return y;}/** subOK - Determine if can compute x-y without overflow* Example: subOK(0x80000000,0x80000000) = 1,* subOK(0x80000000,0x70000000) = 0,* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int subOK(int x, int y) {//x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判断溢出int m = (x>>31)&1;int n = (y>>31)&1;x = (m^n)&(m^(((x+(~y+1))>>31)&1));return (!x);}/** absVal - absolute value of x* Example: absVal(-1) = 1.* You may assume -TMax <= x <= TMax* Legal ops: ! ~ & ^ | + << >>* Max ops: 10* Rating: 4*/int absVal(int x) {//x最高位为0时就是x,最高位为1时是~x+1int y = x>>31;x = (y&(~x+1))+((~y)&x);return x;}/** float_abs - Return bit-level equivalent of absolute value of f for * floating point argument f.* Both the argument and result are passed as unsigned int's, but * they are to be interpreted as the bit-level representations of * single-precision floating point values.* When argument is NaN, return argument..* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 10* Rating: 2*/unsigned float_abs(unsigned uf) {int x=uf&(~(1<<31));if(x>0x7f800000){return uf;}else return x;}/** float_f2i - Return bit-level equivalent of expression (int) f* for floating point argument f.* Argument is passed as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point value.* Anything out of range (including NaN and infinity) should return * 0x80000000u.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/int float_f2i(unsigned uf) {unsigned num=0x80000000;int x=(uf&0x007fffff)^0x00800000;int order=0;order=(uf&0x7f800000)>>23;if(order>158){return num;}if(order<127) return 0;else if(((uf>>31)&1)==1){if(order>150){return ~(x<<(order-150))+1;}else return ~(x>>(150-order))+1;}else{if(order>150) return x<<(order-150);else return x>>(150-order);}}1.4 实验过程编写源码,运行btest,得出实验结果。
课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:年月日计算机科学与技术学院目录实验1: (1)实验2: (7)实验3: (24)实验总结 (34)实验1:数据表示1.1 实验概述实验目的:更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验目标:加深对数据二进制编码表示的了解。
实验要求:使用有限类型和数量的运算操作实现一组给定功能的函数。
实验语言:c。
实验环境:linux1.2 实验内容需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。
1)位操作表1列出了bits.c中一组操作和测试位组的函数。
其中,“级别”栏指出各函数的难度等级(对应于该函数的实验分值),“功能”栏给出函数应实现的输出(即功能),“约束条件”栏指出你的函数实现必须满足的编码规则(具体请查看bits.c中相应函数注释),“最多操作符数量”指出你的函数实现中允许使用的操作符的最大数量。
你也可参考tests.c中对应的测试函数来了解所需实现的功能,但是注意这些测试函数并不满足目标函数必须遵循的编码约束条件,只能用做关于目标函数正确行为的参考。
表1 位操作题目列表2)补码运算表2列出了bits.c中一组使用整数的补码表示的函数。
可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。
表2 补码运算题目列表3)浮点数操作表3列出了bits.c中一组浮点数二进制表示的操作函数。
可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。
注意float_abs的输入参数和返回结果(以及float_f2i函数的输入参数)均为unsigned int类型,但应作为单精度浮点数解释其32 bit二进制表示对应的值。
表3 浮点数操作题目列表表示,当输入参数是NaN 时,返回NaN 号整型操作,包括||,&&以及if,while控制结构4 float_f2i 返回浮点数‘f’的强制整型转换“(int)f”表示仅能使用任何整型/无符号整型操作,包括||,&&以及if,while控制结构301.3 实验设计根据题目要求,选择合适的操作符来编写代码。
大学机械基础实验报告本实验的主要目的是通过进行机械基础实验来加深对机械原理和机械基本知识的理解,掌握力学和热学的基础实验方法,培养实验操作能力和科学分析能力。
同时,通过实验数据的处理和结果分析,了解机械实验中的误差来源,并学会如何进行误差分析和控制。
实验装置和实验原理:本次实验使用了一台名称为“XX实验装置”的设备,该设备采用了电磁和电动机作为动力源驱动组件,通过齿轮和传动系统将电机的旋转运动转化为线性运动,并且配备了测量传感器和数据采集系统,可以实时监测和记录实验过程中的相关数据。
实验中,我们首先将实验装置放置在水平台面上,并进行了装置的校正和调试。
然后,我们分别进行了实验A和实验B两个部分的实验操作。
实验A的实验原理是通过对不同质量物体的运动学和动力学的实验研究来验证机械的牛顿力学定律。
我们首先测量了不同质量物体的质量和体积,并用测量仪器得到物体下落的时间和距离数据。
然后,我们利用牛顿第二定律和运动学公式来计算物体下落过程中的加速度和作用力,并与实验测得的数据进行比较和分析。
实验B的实验原理是通过测量不同材料线性膨胀系数对材料热学性质的影响来验证热学膨胀定律。
我们首先测量了不同材料的长度和温度,并利用实验装置加热和冷却不同材料样品,实时测量相应的温度和长度数据。
然后,我们根据线性膨胀定律和热学公式来计算材料线性膨胀系数,并与实验数据进行比较和分析。
实验结果和数据处理:根据实验A的数据分析,我们得到了不同质量物体的加速度和作用力随质量的变化关系图。
根据数据处理和拟合曲线,我们得到了质量和加速度、作用力之间的数学关系。
根据实验B的数据分析,我们得到了不同材料的线性膨胀系数与温度变化的关系图。
根据数据处理和拟合曲线,我们得到了线性膨胀系数和温度之间的数学关系。
讨论与结论:通过本次实验,我们加深了对机械原理和机械基本知识的理解。
通过数据分析和结果讨论,我们验证了机械的牛顿力学定律和热学的膨胀定律。
在数据处理过程中,我们也发现了实验误差的来源,并学会了如何进行误差分析和控制。
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
实验一教你的机器人“走路”一、要求与目的熟悉机器人用于走路的“脚”,要教你的机器人学会走路,同时你要掌握控制机器人走路的基本方法。
二、内容1、机器人为什么会“走”要想让机器人移动,就要控制电机的转动。
控制机器人“行走”的基本指令是motor(x,y)函数和drive(x,y)函数。
2、驱动电机的函数通过JC程序控制电机转动,使机器人行走的指令有两个,它们是motor(x,y)函数和drive(x,y)函数,介绍:一、motor(x,y)函数此函数是“启动”电机,x取值1、2,分别表示左右两个电机;y表示电机转速两个电机同时以相同速度启动,意味着什么?机器人将怎样运动?答:机器人将直走。
进一步讨论:如果将一侧电机速度改为0,机器人将会怎样运动?(顺时针、逆时针旋转)答:左侧电机速度为零,则逆时针旋转;反之,则顺时针旋转。
实验题一:让机器人顺时针、逆时针旋转(1)用vjc语言或者流程图让能力风暴顺时针走直径约1米的圆形路径;程序:void main(){while(1){motor( 1 , 80 );motor( 2 , 20 );}stop();}(2)用vjc语言或者流程图让能力风暴逆时针走约1米立方的正方形路径;程序:void main(){while(1){drive( 100 ,0);wait( 1.000000 );stop();motor( 1 , -20 );motor( 2 , 20 );wait( 0.500000 );stop();}}实验题二:首先机器人前进2秒,之后机器人逆时针旋转1.8秒,然后机器人前进1秒,最后停下来。
小结:motor函数主要是实现旋转。
实验代码:Void main(){Drive(60,0);Wait(2.000000);Stop();Drive(0,-60);Wait(1.800000);Stop();Drive(80,0);Wait(1.000000);Stop();}二、drive(x,y)函数此函数是“直行”,x表示基准速度,y表示左右电机与基准速度的差。
计算机汇编语言实验报告一、实验目的本实验旨在通过编写计算机汇编语言程序,加强对计算机组成原理和汇编语言的理解,同时熟悉实际编写和调试过程。
二、实验内容1.用汇编语言编写一个简单的计算器程序,实现加法和减法操作。
2.编译并运行程序,测试其功能的正确性。
3.运用调试工具进行程序的调试,检查代码的运行流程。
三、实验步骤1.确定程序功能和设计思路:本次实验的目标是编写一个计算器程序,能够对两个数进行加法和减法操作。
我们可以通过定义一些操作码来表示不同的操作,再通过输入不同的操作码来执行相应的操作。
2.编写汇编语言程序:首先,需要定义一些变量和常量来存储输入的数和操作码。
然后,使用汇编语言的运算指令和控制指令来实现加法和减法操作,并将结果存储到指定的变量中。
最后,使用输出指令来显示结果。
3.编译并运行程序:将汇编语言程序编译为机器码,并通过计算机的指令集执行程序。
4.调试程序:利用调试工具,逐步执行程序,检查代码的运行流程和结果的正确性。
如有错误,进行适当的修改和调试。
5.测试功能和性能:使用不同的数和操作码进行测试,验证程序的功能和正确性。
四、实验结果经过编写、编译和调试,我们成功实现了一个简单的计算器程序。
程序能够根据输入的操作码,对两个数进行加法和减法操作,并将结果显示出来。
经过多次测试,程序的功能、正确性和性能都符合预期要求。
五、实验感想通过本次实验,我们对计算机组成原理和汇编语言有了更深入的理解。
在编写程序的过程中,我们发现汇编语言相比高级语言更加底层,需要考虑更多的细节和机器指令的使用。
同时,我们也意识到了调试的重要性,调试工具能够帮助我们分析和修正代码的错误,提高程序的质量。
六、实验总结通过本次实验,我们对计算机汇编语言的应用有了更深入的了解。
我们掌握了汇编语言程序的基本结构和语法规则,学会了使用汇编语言指令进行计算和控制。
同时,我们也提升了调试和测试的能力,加深了对计算机组成原理和汇编语言的理解。
单片机实验报告总结单片机实验报告总结单片机实验心得体会单片机实验心得体会时间过得真快,不经意间,一个学期就到了尾声,进入到如火如荼的期末考试阶段。
在学习单片机这门课程之前,就早早的听各种任课老师和学长学姐们说过这门课程的重要性和学好这门课程的关键~~多做单片机实验。
这个学期,我们除了在课堂上学习理论知识,还在实验室做了7次实验。
将所学知识运用到实践中,在实践中发现问题,强化理论知识。
现在,单片机课程已经结束,即将开始考试了,需要来好好的反思和回顾总结下了。
第一次是借点亮LED灯来熟悉keil软件的使用和试验箱上器材。
第一次实验体现了一个人对新事物的接受能力和敏感度。
虽然之前做过许多种实验。
但依旧发现自己存在一个很大的问题,对已懂的东西没耐心听下去,容易开小差;在听老师讲解软件使用时,思路容易停滞,然后就跟不上老师的步骤了,结果需要别人再次指导;对软件的功能没有太大的热情去研究探索,把一个个图标点开,进去看看。
所以第一次试验相对失败。
鉴于此,我自己在宿舍下载了软件,然后去熟悉它的各个功能,使自己熟练掌握。
在做实验中,第二个问题应该是准备不充分吧。
一开始,由于没有课前准备的意识,每每都是到了实验室才开始编程,完成作业,导致每次时间都有些仓促。
后来在老师的批评下,认识到这是个很大的问题:老师提前把任务告诉我们,就是希望我们私下把程序编好。
于是我便在上机之前把程序编好,拷到U盘,这样上机时只需调试,解决出现的问题。
这样就会节约出时间和同学讨论,换种思路,换种方法,把问题给吃透。
发现、提出、分析、解决问题和实践能力是作为我们这个专业的基本素质。
三是我的依赖性很大,刚开始编程序时喜欢套用书上的语句,却对语句的理解不够。
于是当程序出现问题时,不知道如何修改,眼前的程序都是一块一块的被拼凑整合起来的,没法知道哪里错了。
但是编程是一件很严肃的事情,容不得半点错误。
于是便只能狠下决心,坚持自己编写,即使套用时,也把每条语句弄懂。
csapp 习题答案CSAPP(Computer Systems: A Programmer's Perspective)是一本经典的计算机系统课程教材,由Randal E. Bryant和David R. O'Hallaron合著。
它以深入浅出的方式介绍了计算机系统的基本概念和原理,对于理解计算机底层运行机制以及编程技巧都有着重要的作用。
在学习CSAPP的过程中,习题是一项重要的练习和巩固知识的方式。
本文将为大家提供一些CSAPP习题的参考答案,希望对大家的学习有所帮助。
第一章:计算机系统漫游1.1 问题:计算机系统由哪几个层次组成?答案:计算机系统由硬件层、操作系统层和应用程序层组成。
1.2 问题:计算机系统中的抽象是什么意思?答案:计算机系统中的抽象是指将系统中的复杂细节隐藏起来,提供简单易用的接口供上层使用。
第二章:信息的表示和处理2.1 问题:在一个32位机器上,有多少个不同的二进制数可以用来表示无符号整数?答案:在一个32位机器上,有2^32个不同的二进制数可以用来表示无符号整数。
2.2 问题:在一个32位机器上,有多少个不同的二进制数可以用来表示补码整数?答案:在一个32位机器上,有2^31个不同的二进制数可以用来表示补码整数。
第三章:程序的机器级表示3.1 问题:什么是指令集架构(ISA)?答案:指令集架构是一种规定了计算机硬件和软件之间接口的抽象层次。
它定义了机器指令的格式、指令的功能以及寄存器的使用方法等。
3.2 问题:什么是汇编语言?答案:汇编语言是一种与机器语言相对应的低级语言,用助记符表示机器指令,可以直接被计算机识别和执行。
第四章:处理器体系结构4.1 问题:什么是流水线?答案:流水线是一种将指令执行过程划分为多个阶段,并且在不同阶段之间重叠执行的技术。
通过流水线,可以提高指令的执行效率。
4.2 问题:什么是数据相关和控制相关?答案:数据相关是指后一条指令需要用到前一条指令的结果,而前一条指令的结果还未计算完成。
计算机组成原理实习报告本学期我们开设了计算机组成原理这门课, 主要学习计算机的主要部件以及这些部件组成的原理和如何运行。
除了平时的课堂学习, 我们还有实验课帮助我们更好的了解这门课程。
用于我们实验的机器是TEC-XP, 它是由清华大学计算机系和清华大学科教仪器厂联合研制的适用于计算机组成原理课程的实验系统, 主要用于计算机组成原理和数字电路等的硬件教学实验, 同时还支持监控程序、汇编语言程序设计、BASIC高级语言程序设计等软件方面的教学实验。
它的功能设计和实现技术, 都紧紧地围绕着对课程教学内容的覆盖程度和所能完成的教学实验项目的质量与水平来进行安排。
其突出特点是硬、软件基本配置比较完整, 能覆盖相关课程主要教学内容, 支持的教学实验项目多且水平高。
其组成和实现的功能如图1所示。
图1.硬件实现的实际计算机系统图一.微程序实验步骤1.接通教学机电源。
2.将教学机左下方的5个拨动开关置为11010(单步、手动置指令、微程序、联机、16 位)。
3.按一下“RESET”按键。
4.通过16 位的数据开关SWH、SWL置入指令操作码。
5.在单步方式下, 通过指示灯观察各类基本指令的微码。
(1) 选择基本指令的A组指令中的ADD指令, 观察其节拍流程1) 置拨动开关SW=00000000 00000001;(表示指令ADD R0, R1 )2) 按RESET按键;指示灯Microp亮(只要选择微程序, 该灯在指令执行过程中一直亮),其它灯全灭;3) 按START按键;指示灯CI3~0、SCC3~0显示1110 0000, 微址和下址的指示灯全灭;(本拍完成公共操作0→PC.DI#=0)4) 按START按键;指示灯CI3~0、SCC3~0显示1110 0000, 微址指示灯显示0000 0001, 下址的指示灯全灭;(本拍完成公共操作PC→AR、PC+1→PC)5) 按START按键;指示灯CI3~0、SCC3~0显示1110 0000, 微址指示灯显示0000 0010, 下址的指示灯全灭;(本拍完成公共操作MEM→IR)6) 以上三步为公共操作, 其它指令同;7) 按START按键;指示灯CI3~0、SCC3~0显示0010 0000, 微址指示灯显示0000 0011, 下址的指示灯显示0000 0100;(本拍完成/MAP操作功能)8) 按START按键;指示灯CI3~0、SCC3~0显示0011 0000, 微址指示灯显示0000 0100, 下址的指示灯显示0011 0000 (本拍执行ADD指令, DR←DR+SR 操作)。
高级语言源程序和目标机器代码的实验总结一、实验目的1.掌握高级语言源程序和目标机器代码的不同表示及其相互转换。
2.深刻理解高级语言和机器语言之间的关系。
3.掌握子程序设计的思想、方法及上机调试过程。
4.理解中断服务子程序的执行过程。
二、实验准备知识1.IA-32中过程调用和返回指令的格式和功能。
2.子程序设计的思想和方法(1)子程序是功能相对独立的程序段,它可以实现源程序的模块化,简化源程序结构,提高编程效率(2)子程序定义:利用过程伪指令PROC和ENDP,格式如下:过程名PROC[NEAR|FAR]……;过程体过程名ENDP其中:可选的参数指定过程的调用属性。
没有指定过程属性,则采用默认属性NEAR。
NEAR属性:段内近调用,子程序只能被相同代码段的其他程序调用FAR属性:段间远调用,子程序可以被相同或不同代码段的程序调用(3)主程序(调用程序)调用子程序(被调用程序):利用CALL指令(4)子程序返回主程序:利用RET指令(5)保护现场:子程序开始处应该保护子程序中使用的寄存器(通常利用堆栈),子程序返回前相应进行恢复。
(6)子程序中对堆栈的压入和弹出操作通常成对使用,以保持堆栈的平衡。
(7)子程序允许嵌套和递归(8)处理好子程序与主程序之间的参数传递问题:利用寄存器、内存缓冲区及堆栈。
3.过程调用的执行步骤(假设P为调用者,Q为被调用者):(1)P保存现场(必要时);(2)将入口参数(实参)放到Q能访问到的地方;(3)P保存返回地址,然后将控制转移到Q;(4)Q保存P的现场,并为自己的非静态局部变量分配空间;(5)执行Q的过程体(函数体);(6)Q恢复P的现场,释放局部变量空间;(7)Q取出返回地址,将控制转移到P。
4.Linux常用命令以及GCC编译器的使用命令。
三、实验性质本实验为验证性实验。
四、实验学时本实验学时为4学时。
五、实验内容及步骤1.用C语言编写一个完整的源程序,实现main函数调用一个子函数的功能。
一、实验背景编译原理是计算机科学的一个重要分支,主要研究如何将高级语言源代码转换为计算机可以执行的机器代码。
本实验旨在通过实践操作,加深对编译原理基本概念和算法的理解,提高编程能力和解决问题的能力。
二、实验目的1. 理解编译原理的基本概念和流程;2. 掌握词法分析和语法分析的基本方法;3. 熟悉编译过程中的中间代码生成和代码优化;4. 培养编程能力和团队协作精神。
三、实验内容1. 词法分析词法分析是编译过程的第一步,其主要任务是将源代码中的字符序列转换成一个个有意义的符号(单词)。
本实验中,我们实现了词法分析器,能够识别出标识符、关键字、运算符、常量等单词。
2. 语法分析语法分析是编译过程的核心,其主要任务是将词法分析器生成的单词序列按照一定的语法规则进行组织,形成语法树。
本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。
3. 中间代码生成中间代码生成是编译过程中的一个重要环节,其主要任务是将语法树转换为一种抽象的、与具体机器无关的中间代码。
本实验中,我们实现了三地址代码生成,将语法树转换为三地址代码。
4. 代码优化代码优化是编译过程中的一个关键步骤,其主要任务是在保证程序正确性的前提下,提高程序的性能。
本实验中,我们实现了简单的代码优化,如常数传播、变量替换等。
四、实验结果与分析1. 实验结果通过实验,我们成功实现了词法分析、语法分析、中间代码生成和代码优化等功能。
以一个简单的C语言程序为例,我们能够将其转换为三地址代码,并进行简单的优化。
2. 实验分析(1)词法分析:本实验中,我们通过定义状态转换表和动作表,实现了对C语言源代码的词法分析。
实验结果表明,词法分析器能够准确地识别出标识符、关键字、运算符、常量等单词。
(2)语法分析:递归下降解析法是一种较为直观的语法分析方法。
本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。
实验一过程调用与程序的机器级表示一、实验目的1.深刻理解高级语言和机器语言之间的关系2.掌握定点数和浮点数的机器级表示3.掌握过程调用的反汇编和调试过程4.掌握过程调用时栈帧结构和变化过程。
5.掌握逆向工程下过程调用的机器级表示。
二、实验性质及学时本实验为验证性实验,共4学时。
三、实验准备知识1.IA-32中过程调用和返回指令的格式和功能。
2.过程调用的执行步骤(假设P为调用者,Q为被调用者)(1)P保存现场(必要时);(2)将入口参数(实参)放到Q能访问到的地方;(3)P保存返回地址,然后将控制转移到Q;(4)Q保存P的现场,并为自己的非静态局部变量分配空间;(5)执行Q的过程体(函数体);(6)Q恢复P的现场,释放局部变量空间;(7)Q取出返回地址,将控制转移到P。
3.过程的结构(1)准备阶段形成帧底:push指令和mov指令push ebpmov ebp,esp生成栈帧,局部变量分配体现为堆栈中以EBP寄存器为基址向低地址端分配的一个连续区域,一般用减法指令:sub esp,分配的字节数保存现场(如果有被调用者保存寄存器):mov指令(2)过程(函数)体分配局部变量空间,并赋值;通过EBP寄存器的相对寻址方式来寻址函数内的局部变量。
具体处理逻辑,如果遇到函数调用时:①准备参数:将实参存放到被调用函数能访问到位置,参数的进栈顺序是从右向左。
②CALL指令:保存返回地址并转被调用函数③在被调用函数中,使用R[ebp]+8、R[ebp]+12、R[ebp]+16作为有效地址来访问函数的入口参数。
④在EAX中准备返回参数。
(3)结束阶段退栈:mov esp,ebppop ebp取返回地址返回:ret指令4.OllyDbg反汇编工具(1)工具简介在逆向分析领域,分析者需要利用相关的调试工具来分析软件的行为并验证结果。
其中OllyDbg是一个很强大兼容性很好的反汇编软件。
调试者可以随时中断目标的指令流程,以便观察相关的计算结果和当前的设备情况,也可以随时继续执行程序的后续指令。
基础汇编语言程序设计实验【实验目的】1.了解教学计算机的指令格式、指令编码、选择的寻址方式和每一条指令的具体功能,为进一步学习运算器组成和控制器设计打好基础。
2.了解汇编语言的语句与机器语言的指令之间的对应关系,了解伪指令在汇编过程中的作用。
3.学习教学机监控程序的功能、监控命令的使用方法,体会软件系统在计算机组成中的地位和作用。
【实验内容】1.学习联机使用TH-UNION+教学实验系统和仿真终端软件PCEC.2.使用监控程序的R命令显示/修改寄存器内容、D命令显示存储器内容、E命令修改存储器内容。
3.使用A命令写一小段汇编程序,U命令反汇编刚输入的程序,用G命令连续运行该程序,用T、P命令单步运行并观察程序单步执行情况;【实验内容】1.用R命令查看寄存器内容或修改寄存器的内容1)在命令行提示符状态下输入:R↙;显示寄存器的内容注:寄存器的内容在运行程序或执行命令后会发生变化。
2)在命令行提示符状态下输入:R R0↙;修改寄存器R0的内容,被修改的寄存器与所赋值之间可以无空格,也可有一个或数个空格2.用D命令显示存储器内容在命令行提示符状态下输入:D 2000↙3. 用E命令修改存储器内容在命令行提示符状态下输入:E 2000↙4.用D命令显示这几个单元的内容D 2000↙可以看到这六个地址单元的内容变为0000 1111 2222 3333 4444 5555。
5. 用A命令键入一段汇编源程序,主要是向累加器送入数据和进行运算,执行程序并观察运行结果。
1)在命令行提示符状态下输入:A 2000↙;表示该程序从2000H(内存RAM区的起始地址)地址开始2)用U命令反汇编刚输入的程序在命令行提示符状态下输入:U 2000↙在相应的地址会得到输入的指令及其操作码3)用G命令运行前面键入的源程序G 2000↙4)用P或T命令,单步执行这段程序,观察指令执行结果在命令行提示符状态下输入:T 2000↙<12020:MVRD R2,00OA2022:MVRD R0,00302024:OUT 802025:DEC R22026:JRZ 202E2027:PUSH R02028:IN 812029:SHR R0202A:JRNC 2028202B:POP R0202C:INC R0202D:JR 2024202E:RET202F:↙<2(2100) MVRD R2,001AMVRD R0,0041(2104) OUT 80DEC R2JRZ 210EPUSH R0(2108)IN 81SHR R0JRNC 2108POP R0INC R0JR 2104(210E)RET【实验结果】<1屏幕上输出'0'到'9'十个数字符<2屏幕上显示“A”~“Z”26个英文字母【实验过程中遇到的问题以及解决办法】在验证例3的实验时,输入语句“JC 2053”,执行时系统一直提示有错误,无法进行运算查表得知语句中没有JC ,只有JRC,所以修改语句即可解决。
最新机械实验报告(实验课程用)实验目的:1. 熟悉机械实验设备的操作流程。
2. 掌握基本的机械测量和分析技巧。
3. 理解机械运动的基本原理和特性。
实验设备:1. 机械测试台。
2. 转速计。
3. 力矩计。
4. 测量尺和卡尺。
5. 数据采集系统。
实验步骤:1. 准备阶段:检查所有实验设备是否完好,确保机械测试台稳定且无杂物干扰。
2. 设备调试:根据实验要求调整机械测试台的参数,包括速度、力矩等,并进行初步测试以确保设备运行正常。
3. 数据采集:开启数据采集系统,记录机械运动过程中的各项数据,如转速、力矩、位移等。
4. 实验操作:进行机械运动,观察并记录机械系统的响应,注意观察是否有异常情况发生。
5. 数据分析:收集到的数据进行整理和分析,使用图表和公式来展示机械运动的特性和效率。
6. 结果讨论:基于数据分析结果,讨论机械系统的性能和可能存在的改进空间。
7. 实验总结:撰写实验报告,总结实验过程中的关键点和学习到的知识,提出可能的改进措施。
实验结果:1. 转速与力矩的关系曲线显示了机械系统在不同负载下的输出稳定性。
2. 位移测量结果表明机械系统的精确度和重复性。
3. 通过对异常数据的分析,发现了机械系统中存在的潜在问题,并提出了相应的解决方案。
实验结论:本次实验成功地展示了机械系统在不同工作条件下的性能表现,通过对数据的详细分析,我们对机械运动的基本原理有了更深入的理解。
同时,实验过程中发现的问题也为未来的改进提供了方向。
通过本次实验,我们不仅掌握了机械测量和分析的基本技能,还提高了解决实际问题的能力。
机械基础实验报告模板一、实验目的本实验旨在通过实践操作,加深对机械基础原理的理解,学习基本的机械加工操作和安全操作规范。
二、实验设备与材料- 实验设备:铣床、车床、钻床、磨床等- 实验材料:金属工件、刀具、夹具等三、实验原理机械加工是利用机床对工件进行切削、钻孔、磨削等加工过程的一种方法。
根据加工过程中切削速度、进给量和切削深度的不同组合,可以得到不同的加工效果。
四、实验内容1. 利用铣床进行平面铣削操作,实现工件的平面加工。
2. 利用车床进行圆柱加工,研究不同刀具和切削参数对加工表面质量的影响。
3. 利用钻床进行钻孔加工,并测量孔径和孔位精度。
4. 利用磨床进行工件的精密加工,研究不同砂轮粒度对加工效果的影响。
五、实验步骤1. 实验前准备:检查机床状态,熟悉操作规程,选择适当的加工刀具和参数。
2. 实验操作:按照实验要求进行加工操作,注意安全操作规范,避免事故发生。
3. 实验测量:在加工完成后,使用相应的测量工具对加工尺寸进行测量,记录实验数据。
4. 数据处理:根据实验测量结果,进行数据处理和分析,得出结论。
六、实验结果及讨论通过实验操作和测量,我们得到了一系列数据,根据数据处理和分析的结果,我们得出以下结论:1. 平面铣削操作中,切削速度和进给量的选择会影响加工表面的光洁度和尺寸精度。
2. 圆柱加工中,合理选择刀具和切削参数可以得到较好的加工表面质量。
3. 钻孔加工中,刀具的几何形状和切削液的选择会影响孔径和孔位精度。
4. 磨削加工中,砂轮粒度越小,加工表面质量越好,但加工时间也会增加。
七、实验总结通过本次实验,我们掌握了机械加工的基本原理和操作技巧,加深了对机械基础知识的理解。
同时,我们也意识到了机械加工操作中的安全隐患和注意事项,提高了安全意识。
八、实验存在问题及改进措施在实验过程中,我们也遇到了一些问题,例如操作不熟练、测量误差较大等。
为了改进这些问题,我们可以增加实验次数,提高操作熟练度;同时加强对测量工具的使用和保养,减小测量误差。
浙江大学城市学院实验报告
课程名称计算机系统原理实验
实验项目名称实验十一程序的机器级表示——过程
学生姓名专业班级学号
实验成绩指导老师(签名)日期
注意:
●务请保存好各自的源代码,已备后用。
●请把作业同时上传到BB平台和FTP。
●文件名为:学号_姓名_日期_实验几,如30801001_姓名_20100305_实验01
●ftp://10.66.28.222:2007huommupload 123456
一、实验目的:
了解IA32指令系统的常用指令,了解Linux汇编语言的基本语法、汇编语言的编写、调试技巧。
二、实验内容:
1、阅读给出test11_1.c以及对应的反汇编代码,为汇编代码添加注释,并画出函数调用前后的栈帧结构图。
2、阅读给出test11_2.c以及对应的汇编代码,为汇编代码添加注释,并补充完整c程序源码。
三、实验步骤:
1、阅读给出test11_1.c以及对应的反汇编代码,为汇编代码添加注释,并画出函数调用前后的栈帧结构图。
指令注释:
08048354 <swap_add>:
8048354: 55 push %ebp #
8048355: 89 e5 mov %esp,%ebp #
8048357: 53 push %ebx #
8048358: 8b 55 08 mov 0x8(%ebp),%edx #
804835b: 8b 4d 0c mov 0xc(%ebp),%ecx # 804835e: 8b 1a mov (%edx),%ebx # 8048360: 8b 01 mov (%ecx),%eax # 8048362: 89 02 mov %eax,(%edx) # 8048364: 89 19 mov %ebx,(%ecx) # 8048366: 01 d8 add %ebx,%eax # 8048368: 5b pop %ebx #
8048369: 5d pop %ebp #
804836a: c3 r et
0804836b <caller>:
804836b: 55 push %ebp #
804836c: 89 e5 mov %esp,%ebp #
804836e: 83 ec 18 sub $0x18,%esp # 8048371: c7 45 fc 7b 00 00 00 movl $0x7b,0xfffffffc(%ebp) # 8048378: c7 45 f8 c8 01 00 00 movl $0x1c8,0xfffffff8(%ebp) # 804837f: 8d 45 f8 lea 0xfffffff8(%ebp),%eax # 8048382: 89 44 24 04 mov %eax,0x4(%esp) # 8048386: 8d 45 fc lea 0xfffffffc(%ebp),%eax # 8048389: 89 04 24 mov %eax,(%esp) #
804838c: e8 c3 ff ff ff call 8048354 <swap_add> # 8048391: 8b 55 fc mov 0xfffffffc(%ebp),%edx # 8048394: 2b 55 f8 sub 0xfffffff8(%ebp),%edx # 8048397: 0f af c2 imul %edx,%eax #
804839a: c9 l eave #
804839b: c3 r et #
调试过程及结果解释(截图):
函数栈帧结构图:
调用swap_add之前:
caller栈帧
调用swap_add 过程当中:
2、(选做)
1)为汇编代码每行添加注释;fun
存储在被调用者保存寄存器%ebx 中的值是什
么?
fun:
pushl %ebp #
movl %esp, %ebp #
pushl %ebx #
subl $4, %esp #
movl 8(%ebp), %ebx #
movl $0, %eax # testl %ebx, %ebx #test 指令的作用:两个操作数按位与,根据与的结果设 置相应的标志位,但是相与的结果并不保留。
je .L4 #
movl %ebx, %eax #
shrl %eax #
movl %eax, (%esp) #
call fun # movl %ebx, %edx #
swap_add 栈帧 caller 栈帧 caller 栈帧
andl $1, %edx #
leal (%edx,%eax), %eax #
.L4:
addl $4, %esp #
popl %ebx #
popl %ebp #
ret #
2)填写上述c代码中缺失的表达式;
3)描述fun函数的功能;
求(x+1)/2
4)调试验证理解:
四、思考题(必做)
1)函数调用时,实参存储在哪个函数的栈帧中?
函数调用时的内存分析
(为即将调用的函数准备参数)
mov %ebp+偏移,%eax 将参数传到eax
mov %eax ,%esp+偏移将参数放到当前空间。
sub $18 ,%ebp #将栈底指针向下移动以存放参数和变量。
(call 保存函数执行现场)
call %eip
相当于指令:push %eip
mov addr ,%eip
(保存栈的相关指针)
push %ebp #保存栈顶。
mov %esp, %ebp #将栈底赋给栈顶。
(将返回值放入eax中,供调用函数读取)
mov 返回变量地址, %eax
(还原栈指针,释放被调用函数的内存空间。
)
leave
相当于一下指令:mov %ebp, %dsp
pop %ebp
(恢复调用前的现场)
ret
相当于一下指令:~call
pop %eip //恢复执行前的地址。
问题:
每次为参数和变量预留空间时sub的值是怎么确定的?
sub 的值是由被调用函数内部声明的变量和参数决定的。
每多一个参数地址就加0x04,而函数中的变量为每四个,地址就增加0x10。
例如:有两个整形参数,则加0x08,有一个整形参数的话加0x10,有四个整形参数也加0x10,有五个时就加0x20。
2)函数调用过程中,为什么必须保持%ebp和%esp的值?
为了确保栈帧位置与大小。
以免出错。