版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言大作业
C语言的秘密
2014年11月19日
目录
引言......................................................5
1.比较C语言与ASM要素............................................5
2.深入阐述c语言实现................................................5
第一章简要描述对应关系...................................5
1.常量..............................................................5
2.不同类型变量.......................................................5
|一般数据类型.............................................................5
I指针.....................................................................5
|字符串...................................................................6
|多维数组.................................................................6
|结构体..................................................................6
|类.......................................................................6
3.计算常、变量表达式...............................................7
|简单计算.................................................................7
|位运算...................................................................7
4.宏...............................................................7
5.函数,子程序.....................................................8
6.其他结构的汇编对应...............................................8
第二章深入阐述C语言的实现...............................8
1.内存的使用........................................................8
|断头...................................................................8
|代码段..................................................................8
|部分无法用立即数表示的常量...............................................8
|声明注释.................................................................9
|全局变量,静态变量.......................................................9
I需求文件,函数,链接库等.................................................9
|栈......................................................................10
2.类型.............................................................10
全局变量和局部变量的不同分配...........................................10
普通变量................................................................11
字符串.................................................................11
多维数组...............................................................11
指针....................................................................11
结构体.................................................................11
类.....................................................................12
3.指针............................................................14
存储方式...............................................................14
指针取值(*p)................................................................................................................................14
指针传递...............................................................14
4.函数............................................................14
确保堆栈平衡(上层函数)................................................14
传参数(百函数).....................................................15
中间层.................................................................15
函数保护主ebp.................................................................................................................................15
堆栈让出子程序变量空间.................................................16
执行函数体..............................................................16
准备返回值..............................................................16
5.堆栈框架........................................................18
6.全局、局部变量....................................................19
全局变量...............................................................19
局部变量...............................................................19
7.算数运算及表达式计算............................................19
常量表达式..............................................................20
简单变量表达式计算.....................................................20
需要存储中间变量的表达式计算...........................................20
8.C语言编译、连接、装入内存......................................21
编译....................................................................21
链接....................................................................21
装入内存.........................................................21
9.C语言IO功能实现...............................................21
第三章C语言与汇编语言优缺点及适应场合.......................21
1.C语言优点,汇编语言的不足......................................21
2.汇编语言优点,C语言的不足......................................21
3.C语言使用场合..................................................22
4.汇编语言使用场合................................................22
第四章课程收获及想法..............................................22
1.收获及想法......................................................22
2.一些建议........................................................23
引言
1,比较C语言与ASM要素
具体比较内容为:各种类型-含字符串及多维数组、指针、结构联合-可嵌
套、类-可继承等,常量变量及表达式,算术及逻辑运算,宏与子程序-
函数,全局变量、局部变量-含静态变量,参数及传递-传值或地址、返回
值等。
2.深入阐述c语言实现
具体阐述内容为:类型、指针、函数、堆栈框架、参数、全局、局部变量,
类的private,public域及成员函数及以及10功能的实现,结合有符号、
无符号数及其运算,表达式与宏等论述C程序到底如何编译、连接、装
入内存以及与执行的。
第一章简要描述对应关系
1.常量
常量如果是数,那么会被转化成立即数。而字符串常量会保存在一块
固定的内存中,等使用时复制过来,或直接使用其地址。具体会在第
二章内存使用中详细介绍。
2.不同类型变量
一般数据类型
C语言中对于变量的声明并没有翻译成汇编命令,对于没有初始化的
变量,不对应汇编指令,对于初始化的变量,也没有声明语句,只是
把变量赋值。
1DOUZuuuumovaworapTrLaZjTZ
longlongalongl;1
intb[][3]={{1,2,3:},{3,4}};
tOO2D3DC9C745A801000000movdwordptr[b].l
OO2D3DDOC745AC02000000movdwordptr[ebp-54h]t2
OO2D3DD72OxC7199po0000movdwordptr[ebp-50h]t3
OO2D3DDEr乎ofPh000000movdwordPtr[ebp-4ch],3
OO2D3DE5C745B804000000movdwordPtr[ebp-48h].4
OO2D3DEC33COxoreax,eax
OO2D3DEE8945BCmovdwordPtr[ebp-44h],eax|
•指针
指针在c语言中被编译成了一个4字节的变量,这个变量存放的是
地址值。指针指向一个变量的地址时,使用的是lea命令。
int*p=<&al;
00083DF18D45E4leaeax,[al]
00083DF489459Cmovdwordptr[p],eax|
•字符串
C语言中的字符串是一个字符数组,数组中存放着字符,并在最后补
\0,常量字符串在复制时采用寄存器暂存的方式复制。
73uuuuuub1
6768696a6b6f7o
xOOBBAOOE6dghijklmnop
7172737475797a
IX00BBA018o0oooooooo770o0oqrstuvwxyz
IX00BBA022o1ooooooo100010o
X00BBA02Co0ooo1oooo000o0o
ix00BBA03601
•多维数组
C语言中多维数组实际上是一段维数相乘大小的一维数组。对应内存
一维数组(各维度的积)*sizeof(type)的区域。初始化时没有初始化
的会被附0。
»ntb[][J]-{(1.2.3).(3.4}):OxOOSc,78ccccccccccccccccc????????
45M01000000movdwordptr[b].l
dwordptrOxOOGcr7940100000002000000...............
0x005c»:9C0300000003000000...............
dwordptrOxOOSCF7A404000000....
cMordperf«bp-.)????????
dwordptr(•bp-3Sh].40*0050'ACCCCCccCCCCCCcccc
OxOOS<F'B402000000cccccccc....rm
xor
OMOOSCFTBCCCCCCCCC01000000rtrt....
•结构体
结构体是一种类型定义,定义并不对应指令。
结构体在c语言中被处理成连续的多个变量,在函数中调用的时候会
使用一个对ebp的偏移量进行不同字段的检查。
MyStructlmstl={1,'a');
OOE315EFC7458001000000movdwordptr[mstl],1
00E315F6C6458461movbyteptr[ebp-7ch]t61h
OOE315FA33COxoreax,eax
OOE315FC66894585movwordptr[ebp-7Bh],ax
0E31600884587movbyteptr[ebp-79h],al
•类
类亦是一种类型,定义并不对应指令。
对象的声明时会调用类对象的构造函数,作用域结束的时候执行析构
函数。每次调用类的函数时初始化ecx为类的this指针,用此方法
来区分不同的类。
testclasscla(2);
00BB16036A02push2
testclasscla(2);
00BB16058D8D74FFFFFFleaecx,[cla]
00BB160BE8A4FAFFFFcalltesrclass::restclass(0BB10B4h)
00BB1610C745FC00000000movdwordptr[ebp-41,0
3.计算常、变量表达式
•简单计算
常量表达式被编译器计算成立即数,变量表达式中的常量运算被编译
器在编译时计算出来,表达式中变量的计算被编译成对于eax,ecx,
edx,esi等寄存器的运算,包括mov,add,sub,imul,idiv等。
表达式计算会在之后的第二章深入阐述中详细描述。
printf(”%s,%d”,s,al+a2);
1393B388B45E4moveax,dwordptr[al
1393B3B0345D8_____________add__________eax.dwordDtr「a2
•位运算
c语言翻译出的位运算是使用shlxorandor等进行移位、异或、与、
或运算的。特别的,对于long或longlong等长于4字节的数据,
移位运算使用函数,如下图中的_allshl等进行运算。
printf(n%s,%d,%L",s,,al«4A0x40,alongl«18);
)0BB163A80BD9BFEFFFF00cmpbyteptr[ebp-165h],0
)0BB1641750Djnemain+0F0h(0BB1650h)
)0BB164368CF17BB00push0BB17CFh
)0BB1648E87BFAFFFFcal1_RTC_uninituse(0BB10c8h)
)0BB164D83C404addesp,4
)08816508B45BCmoveax.dwordptr[alongl]
)08816538B55COmovedx,dwordptr[ebp-40h]
)0BB1656Bl12movcl,12h
)0BB1658E8F3F9FFFFcal1_allshl(0BB1050h)
)0BB165D8BF4movesi,esp
)0BB16SF52pushedx
)0BB166050pusheax
)0BB16618B45D8moveax,dwordPtr[al]
)0BB1664ClE004shleax,4
)0BB166783F040xoreax,40h
)0BB166A50pusheax
)0BB166B8D4DE4leaecx,[s]
)0BB166E51pushecx
)0BB166F686478BB00push0BB7864h
)0BB1674FF1518BlBB00calldwordptrds:[0BBB118h]
)0BB167A83C414addesp,14h
)0BB167D3BF4cmpesi,esp
)0BB167FE8CBFAFFFFcall_RTC_checkEsp(0BB114Fh)|
4.宏
宏在编译前被替换之后再进行编译,宏定义存在多种情况,也会被编译为
多种情况。
条件编译,c语言的宏可以包含类似#ifdef#else#endif等条件编译指
令,这些指令嵌套的C语言内容可以只编译分支中的代码,这解决了重定
义和跨平台的问题。
5.函数,子程序
函数与子程序都会被写成汇编中的子程序,使用call方式调用。
printint(g_int);
00BB16F6Al00AOBB00puSheax,dwordptrds:[OOBBAOOO
00BB16FB50eai1eax
00BB16FCE8F9F9FFFFaddprintint(OBBlOFAh)
00BB170183C404esp,4
6.其他结构的汇编对应
由于其他结构设计内存方面较多,甚至有些并不能简单阐述,所以将有关
"全局变量、局部变量-含静态变量,参数及传递-传值或地址、返回值等"
的汇编对应放在第二章中相关部分一起说明。
第二章深入阐述C语言的实现
1.内存的使用
一个程序在内存中是这样分配,由上到下依次是内存低地址到内存高地址。
每段存储空间中都有大量以o填充的无意义字节分隔。
•程序头
•代码段
在加载如内存的低地址的位置存放着代码(指令工
•部分无法用立即数表示的常量
此处存放的是如printf使用的常量字符串,初始化使用的常量字符
串等等。这些字符串是相邻存放的,但是他们都对齐了4字节,没
有对齐的用0补齐。如字符串"abcdef"字符串加上最后的‘\0'
一共占7字符,系统增加一个0补齐4的倍数。
OxOOAE583C00000000bO056a54
OxOOAE5844000000000c000000
0X00AES84C1400000080670100
OxOOAE58548059000025640000
OXOOAE585C616e636465660000
OXOOAE586425732c25642c254c
OXOOAE586C000000005f005f00
OxOOAE58746e0'e»(J。074006900
•声明注释
再向下保存了一些程序的声明,比如esp使用方式、Microsoft的一
些程序定义,以及工程位置等信息。
)XOOAE59EC00..00;工,00:0000
)X00AES9F40000000000000000
)XOOAE59FC0000000054686520....The
)XOOAE5AO476616c7565206f66valueof
)xOOAESAOC2045535020776173ESPwas
)XOOAE5A14206e6f742070726fnotpro
)X00AE5A1C706S726c79207361perlysa
)x00AE5A24766564206163726fvedaero
)XOOAE5A2C737320612066756essafun
)xOOAE5A346374696f6e206361ctionca
)xOOAE5A3C6c6c2e202054686911.Thi
)x00AE5A447320697320757375sisusu
)x00AE5A4C616c6c7920612072allyar
)xOOAE5A546573756c74206f66esultof
)xOOAE5A5C2063616c6c696e67calling
)XOOAE5A6420612066756e6374afunct
5XOOAE5A6C696f6e206465636ciondeci
)x00AE5A746172656420776974aredwit
)x00AESA7c68206f6e65206361honeca
JX00AESA846c6c696e6720636fHingco
)X00AE5A8C6e76656e74696f6envention
)x00AE5A942077697468206120witha
)X00AESA9C66756e6374696f6efunction
JX00AESAA420706f696e746572pointer
)X00AE5AAC206465636c617265declare
)X00AESAB46420776974682061dwitha
JxOOAESABC206469666665726Sdiffere
)xOOAE5AC46e742063616c6c69ntcalli
)X00AE5ACC6e6720636f6e7665ngconve
)X00AESAD46e74696f6e2e0aOdntion...
)X00AE5ADC0000000000000000
)X00AESAE40000000000000000
)X00AE$AEC0000000000000000
)XOOAE5AF40000000000000000
)X00AE5AFC0000000000000000
)XOOAESBO40000000000000000
)x00AE5B0C0000000041206361....Aca
)xOOAE5814737420746f206120sttoa
)X00AE5B1C736d616c6c6S7220smaller
)xOOAE5B24646174612074-970datatyp
)xOOAE5B2C6520686173206361ehasca
)X00AE5B3475736S642061206cuseda1
6L2321.206f66也皿ossofd
•全局变量,静态变量
全局变量是指C语言中函数外声明的变量。这种变量的作用域为文
件域。特别的,c语言中函数中的静态变量实际上在实现上是和全局
变量不做区分的。
):OxOOF3802c0a00000061626364••••abed
0X00F3803465666768696a6b6cefghijkl
intg_int=10;OxOOF3803c6d6e6f7071727374mnopqrsr
chars[]="abedefghijklmnopqrj0x00F3804475767778797a0000uvwxyz..
•需求文件,函数,链接库等
0000000000000000
3e077072696e7466>.printf
00004d5356435231..MSVCRl
3230442e646c6c0020D.dll.
57015f4352545f52W._CRT_R
54435f494e495457TC_INITW
00008d015f586370..?._Xcp
7446696c74657200tFilter.
44025f616d73675fD._amsg_
657869740000d801exit..?.
5f5f6765746d6169_getmai
6e61726773001702nargs...
5f5f7365745f6170一sejap
705f747970650000P-type..
5d015f4372744462]._crtDb
675265706f727457gReportw
00006e015f437274..n._crt
536574436865636bsetcheck
436f756e74008f06count.?,
657869740000b602exit..?.
St65786974005c02_exit.\«
5f63657869740000_cexit..
6f025f636f6e6669o._confi
677468726561646cgthreadl
j_
栈结构是c语言程序中最主要的存储位置。进入主函数后几乎所有
变量都存在栈中。
0X0080FDC4ccccccc.cccccc(:cc????????
°。0x0080FDC48453572ccccccc<:cc????????
VAWWfVU*f~CC**cvxv-tcccccc«:cc????????
0x0080FDDCccCCCCCcccccc<:cc????????
0X0080FDE4ccCCCCc,Cccccc(:cc????????
0x0080FDECccccccccccccc(:cc????????
OxOO8OFDF4ccccccccccccc(:cc????????
0x0080FDFCccccccccccccc(:cc????????
0X0080FE04ccccccccccccc(:cc????????
0X0080FE0C010000006100(X)00....a...
0x0080FE14ccccccccccccc<:cc????????
OXOO8OFE1C64fe8000CCCCC(:ccd?€.????
0X0080FE24cccccccc0100(X)00????....
0X0080FE2C0200000003000()00..................
0X0080FE34030000000400(X)00..................
OXOO8OFE3C00000000ccccc(:cc....????
0X0080FE44cccccccc0100(X)00????....
0X0080FE4C00000000ccccc(:cc....????
2.类型
•全局变量、静态变量和局部变量
全局变量和静态变量是保存在上节提到的全局变量保存空间内的,是
连续存储的。而局部变量存储在堆栈段,中间相隔8字节以cc填充
的空间。
下图展示的是全局变量的存储方式,存储在堆栈段,每个变量需要对
齐4字节,如字符'z'之后被填上3字节0,对齐内存地址为4的
倍数。对其之后的变量顺序摆放,并没有间隔。
OxOOOA8O2c0a0000007a000000
OxOOOA8O346162636465666768abcdefgh
intg_int■10;OxOOOA8O3C696a6b6c6d6e6f70ijklmnop
chara-,z';0X000A80447172737475767778qrstuvwx
chars[]="abcdefghijklmnopqr:0X000A804C797a000000000000yz.....
下图展示的是堆栈端内局部变量分配时的补齐和间隔。可见,每个变
量都对齐4字节,没对齐的用0补齐,每个变量之间相隔8个字节
的CC,这个CC是进入函数时预先填入的,详见函数一节。
6x668OFDC4ccccccccccccc:cc????????
0X0080FDC48453572*ccccccc:cc????????
w'tvCcccccc:cc????????
0X0080FDDCCCCCCCCcccccc:cc????????
0X0080FDE4CCCCCCCcccccc:cc????????
0X0080FDECccccccccccccc:cc????????
0X0080FDF4CCCCCCCcccccc:cc????????
OxOO8OFDFCCCCCCCCcccccc:cc????????
OXOO8OFEO4CCCCCCCcccccc:cc????????
OxOO8OFEOC010000006100(X)0^)a
0X0080FE14CCCCCCCcccccc:CC????????
OxOO8OFElc64fe8000ccccc:ccd?€.????
0x0080FE24CCCCCCCc0100(X)00????....
OxOO8OFE2c020000000300(X)00................
0X0080FE34030000000400(X)00................
OxOO8OFE3C00000000ccccC(:cc....????
0X0080FE44cccccccc0100(X)00????....
0x0080FE4c00000000ccccc(:cc....????
•普通变量
普通变量对应一个地址,使用时对应[ptr],初始化使用立即数,计算
时使用eax保存,超过4位另使用其他寄存器操作。
•指针
指针在c语言中被编译成了一个4字节的变量,这个变量存放的是
地址值。具体会在本章指针一节详细介绍。
•结构体
结构体声明不会翻译成指令,只是在调用和初始化的时候,编译
器自动翻译成相应的地址偏移,如下图,我们定义的结构体如下。
structMyStruct2
(
charcl;
charc2;
);
structMyStructl
(
intinti;
charc;
MyStruct2x;
);
如下图,可见一个结构体被翻译成如此5句指令。这5条指令都
是用于初始化的。在结构体0偏移位置,置1。给第二个元素c
赋值'a'既61h,这里可以看出,给其他字段赋值时使用的是相
对ebp的偏移,C语言中保留结构体形式,实为另一个局部变量。
之后会给没有赋值的其他字段负0,这里采用的方法是,使用
xoreax,eax命令将eax置零,再写入其他字段中。
Mystructlmstl={1,'a');
009C3DF7C7458C01000000movdwordptr[mstl],1
00x9C3DF7102394791,'&'};
005匕nuL匚2DUmovbyteprr[ebp-70h],61h
009C3E0233coxoreax,eax
009C3E0466894591movwordptr[ebp-6Fh],ax
009C3E08884593movbyteptr[ebp-6Dh],al
类的对象对应一块独立的存储区域和一块共享的函数代码,特别的
static变量使用的是一块公用的存储区域。所有类的对象都使用一块
代码(函数),而使用ecx保存的this指针指向的数据段不同,来区
分不同的对象。
类的初始化
类的定义为
classtestclass
(
public:
testclass();
-testclass();
testclass(inta);
private:
intdata;
intdata2;
);
testclass::testclass(inta)
(
data=a;
data2=a*2;
)
对象的定义和构造如下图。
testclasscla(2);
OOBB16O36A02push
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游度假区菜场租赁合同
- 旅行社水暖设施维修协议
- 杭州高端住宅买卖合同定制
- 国际展览馆管家服务协议
- 建筑外墙施工合同:领先版
- 2024年度信息系统运维服务与管理合同
- 2024年建筑劳务分包价款协议
- 职业培训机构师资聘用合同模板
- 2024年度区块链游戏开发与应用合同
- 渔业养殖物资员招聘协议
- 肉牛养殖投资计划书
- 耐火砖砌筑方案
- 《制作个人小名片》名师教案
- 《作文写作与文化修养培养与发展》
- 污水处理厂安全生产培训资料课件
- 摄影测量专业职业生涯规划书
- 眩晕的中医诊治
- 小学数学四年级上册第12周含有中括号的四则混合运算
- 老年健康与医养结合服务管理
- 《输变电工程建设标准强制性条文》施工实施计划
- 全国优质课一等奖人教版八年级生物上册《真菌》公开课课件(内嵌视频)
评论
0/150
提交评论