ASMYJW《汇编语言程序设计》教学的思考和实践苏州大学计算机科学与技术学院杨季文2013.05ASMYJW目录教学指导思想教学内容安排教学环境使用ASMYJW1、教学指导思想教学目标上承高级语言,下启机器系统。学习汇编语言目的不再是熟练运用汇编语言,而是比较深入理解高级语言的实现,更好地理解计算机的工作原理,全面提高程序设计开发能力。知其然,知其所以然。ASMYJW1、教学指导思想教学内容•汇编语言程序设计的一般方法•基于Intel80x86系列CPU的32位编程•处理器的功能及其运用•基本功能•存储管理•中断支持•输入输出ASMYJW1、教学指导思想教学方法依托高级语言,讲解低级语言。ASMYJW1、教学指导思想|教学方法inttest11(void){intsum,i;sum=0;for(i=1;i=10;i+=1)sum+=i*i;returnsum;}XOREAX,EAXMOVECX,1LAB1:MOVEDX,ECXIMULEDX,ECXADDEAX,EDXINCECXCMPECX,10JLELAB1RET高级语言和低级语言的对照(变量和寄存器)ASMYJW1、教学指导思想|教学方法intx=1;inty=2;voidtest12(void){y=x*x+3;return;}MOVEAX,?x@@3HAMOVECX,EAXIMULECX,EAXADDECX,3MOV?y@@3HA,ECXRET高级语言和低级语言的对照(变量和存储单元)ASMYJW1、教学指导思想教学方法依托高级语言,讲解低级语言。教学内容:语言语法;程序结构;指示命令;教学素材。教学环境:教学演示;程序调试。ASMYJW2、教学内容安排主要教学内容重点难点处理教学理念贯彻ASMYJW2、教学内容安排主要教学内容第1章引言第2章80x86处理器基本功能第3章程序设计初步第4章字符串操作和位操作第5章VC目标代码阅读理解第6章汇编语言第7章高级汇编语言技术第8章输入输出和中断第9章程序的优化(*)第10章80x86保护方式程序设计(*)ASMYJW2、教学内容安排重点难点处理第1章引言第2章80x86处理器基本功能第3章程序设计初步第4章字符串操作和位操作第5章VC目标代码阅读理解第6章汇编语言第7章高级汇编语言技术第8章输入输出和中断第9章程序的优化(*)第10章80x86保护方式程序设计(*)ASMYJW2、教学内容安排重点难点处理第1章引言第2章80x86处理器基本功能(存储器分段、存储器寻址方式)第3章程序设计初步(子程序设计)第4章字符串操作和位操作第5章VC目标代码阅读理解(堆栈、参数传递、优化)第6章汇编语言(段定义)第7章高级汇编语言技术第8章输入输出和中断第9章程序的优化(*)第10章80x86保护方式程序设计(*)ASMYJW2、教学内容安排重点难点处理•由浅入深•加强演示•加强实践•结合应用:生动、兴趣•固定陈设:简化•依托高级语言:比较、借鉴ASMYJW2、教学内容安排通过高级语言源程序的目标代码来说明LEA指令的妙用。设有如下所示的C++语言编写的函数:__fastcalltest22(intx,inty)//由寄存器传参数{return(2*x+5*y+100);}利用VC6编译器,在优化条件为“最快速度”的情况下,编译上述程序后,得到如下所示的目标代码,采用汇编格式指令的形式表示:LEAEAX,DWORDPTR[EDX+EDX*4+100];DWORDPTR表示存储单元是双字LEAEAX,DWORDPTR[EAX+ECX*2]RET;表示返回到调用者,这里代表test22结束返回取有效地址指令的应用ASMYJW2、教学内容安排设有如下所示的C++语言编写的函数:__fastcalltest24(intx){if(x='A'&&x='Z')x=x+('a'-'A');returnx;}MOVEAX,ECX;参数保存到EAXCMPEAX,65;与'A'比较JLSHORTLAB528;小于,则转移CMPEAX,90;与'Z'比较JGSHORTLAB528;大于,则转移ADDEAX,32;加上大小写字母ASCII码之间的差LAB528:RET数值大小比较ASMYJW2、教学内容安排讲解循环例:设有如下所示的C++语言编写的函数,这个函数的功能是计算1到n的和。为了较好地说明有关指令的应用,所以采用了一个循环,并安排了两个局部变量。__fastcalltest25(intn){intsum,i;sum=0;for(i=1;i=n;i++)sum+=i;returnsum;}ASMYJW2、教学内容安排例:采用早先的BorlandC++编译器,在优化条件为“最快速度”的情况下,得到如下所示16位的目标代码。其中,符号“SHORT”表示转移目标就在附近,相对转移时机器码中只要用一个字节表示差值。MOVCX,AX;把存放在AX中的参数n存到CX中XORBX,BX;使代表变量sum的BX为0(sum=0;)MOVAX,1;使代表变量i的AX为1(i=1;)JMPSHORTLAB114;无条件转移到标号LAB114处LAB58:ADDBX,AX;累加(sum+=i;)INCAX;(i++)LAB114:CMPAX,CX;比较i和nJLESHORTLAB58;当i=n,则转移到LAB58处,继续循环MOVAX,BX;把返回值保存到AX中RET;返回到调用者,这里代表函数test25结束返回讲解循环ASMYJW2、教学内容安排教学理念贯彻•重点讲解为了更好地理解、使用高级语言,所需要的内容•注意讲清为了更好地理解计算机工作原理、CPU基本功能,所对应的内容•不求全面,但求明白ASMYJW3、教学环境使用演示和实践的环境输入和输出的方法例题或素材的获取ASMYJW3、教学环境使用演示和实践的环境•VC集成开发环境◦查看目标代码和寄存器◦嵌入汇编方式进行编程和调试•DOS环境•汇编器和连接器的使用•保护方式功能学习•仿真环境•保护方式功能学习ASMYJW3、教学环境使用输入和输出的方法•前期,充分利用VC的输入、输出函数;•后期,DOS系统功能调用、BIOS调用、直接写屏等方式ASMYJW3、教学环境使用intesp1,esp2,esp3,esp4,esp5;_asm{MOVEAX,12345678HMOVesp1,ESPPUSHEAXMOVesp2,ESPPUSHAXMOVesp3,ESPPOPBXMOVesp4,ESPPOPECXMOVesp5,ESP}printf(originalESP=%x\n\n,esp1);printf(afterPUSHEAXESP=%x\n\n,esp2);printf(afterPUSHAXESP=%x\n\n,esp3);printf(afterPOPBXESP=%x\n\n,esp4);printf(afterpopECXESP=%x\n\n,esp5);验证堆栈操作的指针变化ASMYJW3、教学环境使用charstrmess[]=HELLOWORLD;intpos1,pos2;intmain(intargc,char*argv[]){__asm{CLDLEAESI,strmessMOVpos1,ESILODSBLODSWLODSDMOVpos2,ESI}printf(pos1=%x,pos2=%x\n,pos1,pos2);return0;}验证串装入指令功能的代码片断ASMYJW3、教学环境使用安排初始数据写一个把一位16进制数,转换为对应七段代码的程序片段。0654321MOVBL,xcode;取16进制数字码ANDBL,0FH;保证在0至F之间XORBH,BH;表内偏移用16位表示以便寻址MOVAL,tab[BX];取得对应的代码MOVycode,AL;保存charxcode,ycode;chartab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};ASMYJW3、教学环境使用例题或素材的获取VC库函数strlen的实现VC库函数strchr的实现VC库函数memcpy的实现VC中switch语句的实现VC中for、while等语句的实现VC中函数参数传递的实现VC中指针功能的实现……ASMYJW3、教学环境使用strlenprocstringequ[esp+4];movecx,string;ecx-stringtestecx,3;testifstringisalignedon32bitsjeshortmain_loopstr_misaligned:;simplebyteloopuntilstringisalignedmoval,byteptr[ecx]incecxtestal,aljeshortbyte_3testecx,3jneshortstr_misalignedaddeax,dwordptr0;5bytenoptoalignlabelbelowVC库函数strlen数据对齐代码对齐ASMYJW3、教学环境使用main_loop:moveax,dwordptr[ecx];read4bytesmovedx,7efefeffhaddedx,eaxxoreax,-1xoreax,edxaddecx,4testeax,81010100hjeshortmain_loop;foundzerobyteintheloopmoveax,[ecx-4]testal,al;isitbyte0jeshortbyte_0testah,ah;isitbyte1jeshortbyte_1testeax,00ff0000h;isitbyte2jeshortbyte_2testeax,0ff000000h;isitbyte3jeshortbyte_3jmpshortmain_loop;takenifbits24-30areclearandbit31issetVC库函数strlen每次取4个字节,判断是否有结束符ASMYJW3、教学环境使用byte_3:leaeax,[ecx-1]movecx,stringsubeax,ecxretbyte_2:leaeax,[ecx-2]movecx,stringsubeax,ecxretbyte_1:leaeax,[ecx-3]movecx,stringsubeax,ecxretbyte_0:leaeax,[ecx-4]movecx,stringsubeax,ecxretstrlenendpVC库函数strlen4种不同的结束处理ASMYJW3、教学环境使用;设源和目标区域不重叠;-movex=((4-Dest&3)&3)bytes;-movey=((L-x)2)dwords;-move(L-x-y*4)bytes;CopyUp:testedi,11b;U-destinationdwordaligned?jnzshortCopyLeadUp;V-ifwearenotdwordalignedalready,alignshrecx,2;U-shiftdowntodwordcountandedx,11b;V-trailingbytecountcmpecx,8;U-testifsmallenoughforunwindcopyjbshortCopyUnwindUp;V-ifso,thenjumprepmovsd;N-moveallofourdwordsjmpdwordptrTrailUpVec[edx*4];N-processtrailingbytesVC库函数memcpy先对齐处理每次传4个字节太短,不值得串处理零头处理ASMYJW3、教学环境使用CopyLeadUp:;对齐处理入口moveax,edi;U-getdestinationoffsetmovedx,11b;V-prepar