汇编语言课程实验报告实验名称使用内存空间实验环境硬件平台:IntelCorei5-3210M操作系统:DOSBox0.74inWindows8.1软件工具:TurboC2.0,debug实验内容本次实验通过使用C语言编译生成一系列程序,并对它们进行反编译查看其汇编代码,来探索C语言程序对内存空间的分配机制。实验步骤1.编一个程序um1.c,如下:编译,链接,生成um1.exe。用debug加载um1.exe,如下:通过分析,找到每条C语句对应的汇编代码:main(){*(char*)0x2000='a';/*MOVBYTEPTR[2000],61H*/*(int*)0x2000=0xf;/*MOVWORDPTR[2000],000FH*/*(charfar*)0x20001000='a';/*MOVBX,2000HMOVES,BXMOVBX,1000MOVBYTEPTRES:BX,61H*/_AX=0x2000;*(char*)_AX='b';/*MOVAX,2000HMOVBX,AXMOVBYTEPTR[BX],62H*/_BX=0x1000;*(char*)(_BX+_BX)='a';/*MOVBX,1000HADDBX,BXMOVBYTEPTR[BX],61H*/*(charfar*)(0x20001000+_BX)=*(char*)_AX;/*MOVBX,AXMOVAL,[BX]XORCXADDBX,1000HMOVCX,2000MOVES,CXMOVBYTEPTRES:[BX],AL*/}2.编写一个程序,用一句C语言来实现在屏幕中央显示一个绿色的字符“a”,如下:#includestdio.h#includestdlib.hmain(){*(intfar*)0xb80007d0=0x0261;return0;}用TC编译链接后,运行效果如图:3.分析下列程序中所有函数的汇编代码:inta1,a2,a3;voidf(void);main(){intb1,b2,b3;a1=0xa1;a2=0xa2;a3=0xa3;b1=0xb1;b2=0xb2;b3=0xb3;}voidf(void){intc1,c2,c3;a1=0x0fa1;a2=0x0fa2;a3=0x0fa3;c1=0xc1;c2=0xc2;c3=0xc3;}利用TC编译链接后生成um3.exe,利用debug对其进行反编译查看汇编代码:可以看到,全局变量存放地:内存地址中。局部变量存放地:堆栈中。关于PUSHBP和MOVBP,SP:为了保证SP在返回时候还是原值,因此使用MOVBP,SP,为了保证BP在返回时候还是原值,因此使用PUSHBP。4.分析下列程序中所有函数的汇编代码:intf(void);inta,b,ab;main(){intc;c=f();}intf(void){ab=a+b;returnab;}利用TC编译链接后生成um4.exe,利用debug对其进行反编译查看汇编代码:可见在跳转之前最后一句是将内存单元的值(全局变量ab存储在内存单元中)放入AX。若为字节型则为AL,若为双字型则高位DX,低位AX。5.下面的程序向安全的内存空间写入从“a”到“h”的8个字符,理解程序的含义,深入理解相关的知识。#defineBuffer((char*)*(intfar*)0x02000000)main(){Buffer=(char*)malloc(20);Buffer[10]=0;while(Buffer[10]!=8){Buffer[Buffer[10]]='a'+Buffer[10];Buffer[10]++;}return0;}利用TC编译链接后生成um5.exe,利用debug对其进行反编译查看汇编代码:结论:malloc指令就是给相应变量处(此处为Buffer)所在的位置0x02000000起分配20个BYTE单元。然后令单元Buffer[10]作为标号递增分别给Buffer[0]-[7]这8个字节单元分配从’a’每次递增1的ASCII码。实验总结本次实验相对前几次来说略显复杂,需要大量的调试和分析工作。通过本次实验,我们进一步地了解了C语言程序的内存分配机制,也对汇编语言和高级语言之间的联系有了更加深刻的认识。