汇编教学的思考和实践.ppt
汇编语言程序设计教学的思考和实践,苏州大学计算机科学与技术学院杨季文2013.05,目录,教学指导思想教学内容安排教学环境使用,1、教学指导思想,教学目标上承高级语言,下启机器系统。学习汇编语言目的不再是熟练运用汇编语言,而是比较深入理解高级语言的实现,更好地理解计算机的工作原理,全面提高程序设计开发能力。知其然,知其所以然。,1、教学指导思想,教学内容汇编语言程序设计的一般方法基于Intel 80 x86系列CPU的32位编程处理器的功能及其运用基本功能存储管理中断支持输入输出,1、教学指导思想,教学方法依托高级语言,讲解低级语言。,1、教学指导思想|教学方法,int test11(void)int sum,i;sum=0;for(i=1;i=10;i+=1)sum+=i*i;return sum;,XOR EAX,EAX MOV ECX,1LAB1:MOV EDX,ECX IMUL EDX,ECX ADD EAX,EDX INC ECX CMP ECX,10 JLE LAB1 RET,高级语言和低级语言的对照(变量和寄存器),1、教学指导思想|教学方法,int x=1;int y=2;void test12(void)y=x*x+3;return;,MOV EAX,?x3HA MOV ECX,EAX IMUL ECX,EAX ADD ECX,3 MOV?y3HA,ECX RET,高级语言和低级语言的对照(变量和存储单元),1、教学指导思想,教学方法依托高级语言,讲解低级语言。教学内容:语言语法;程序结构;指示命令;教学素材。教学环境:教学演示;程序调试。,2、教学内容安排,主要教学内容重点难点处理教学理念贯彻,2、教学内容安排,主要教学内容 第1章 引言第2章 80 x86处理器基本功能第3章 程序设计初步第4章 字符串操作和位操作第5章 VC目标代码阅读理解第6章 汇编语言第7章 高级汇编语言技术第8章 输入输出和中断第9章 程序的优化(*)第10章 80 x86保护方式程序设计(*),2、教学内容安排,重点难点处理第1章 引言第2章 80 x86处理器基本功能第3章 程序设计初步第4章 字符串操作和位操作第5章 VC目标代码阅读理解第6章 汇编语言第7章 高级汇编语言技术第8章 输入输出和中断第9章 程序的优化(*)第10章 80 x86保护方式程序设计(*),2、教学内容安排,重点难点处理第1章 引言第2章 80 x86处理器基本功能(存储器分段、存储器寻址方式)第3章 程序设计初步(子程序设计)第4章 字符串操作和位操作第5章 VC目标代码阅读理解(堆栈、参数传递、优化)第6章 汇编语言(段定义)第7章 高级汇编语言技术第8章 输入输出和中断第9章 程序的优化(*)第10章 80 x86保护方式程序设计(*),2、教学内容安排,重点难点处理由浅入深加强演示加强实践结合应用:生动、兴趣固定陈设:简化依托高级语言:比较、借鉴,2、教学内容安排,通过高级语言源程序的目标代码来说明LEA指令的妙用。设有如下所示的C+语言编写的函数:_fastcall test22(int x,int y)/由寄存器传参数 return(2*x+5*y+100);利用VC6编译器,在优化条件为“最快速度”的情况下,编译上述程序后,得到如下所示的目标代码,采用汇编格式指令的形式表示:LEA EAX,DWORD PTR EDX+EDX*4+100;DWORD PTR表示存储单元是双字 LEA EAX,DWORD PTR EAX+ECX*2 RET;表示返回到调用者,这里代表test22结束返回,取有效地址指令的应用,2、教学内容安排,设有如下所示的C+语言编写的函数:_fastcall test24(int x)if(x=A,MOV EAX,ECX;参数保存到EAX CMP EAX,65;与A比较 JL SHORT LAB528;小于,则转移 CMP EAX,90;与Z比较 JG SHORT LAB528;大于,则转移 ADD EAX,32;加上大小写字母ASCII码之间的差LAB528:RET,数值大小比较,2、教学内容安排,讲解循环,例:设有如下所示的C+语言编写的函数,这个函数的功能是计算1到n的和。为了较好地说明有关指令的应用,所以采用了一个循环,并安排了两个局部变量。_fastcall test25(int n)int sum,i;sum=0;for(i=1;i=n;i+)sum+=i;return sum;,2、教学内容安排,例:采用早先的Borland C+编译器,在优化条件为“最快速度”的情况下,得到如下所示16位的目标代码。其中,符号“SHORT”表示转移目标就在附近,相对转移时机器码中只要用一个字节表示差值。MOV CX,AX;把存放在AX中的参数n存到CX中 XOR BX,BX;使代表变量sum的BX为0(sum=0;)MOV AX,1;使代表变量i的AX为1(i=1;)JMP SHORT LAB114;无条件转移到标号LAB114处LAB58:ADD BX,AX;累加(sum+=i;)INC AX;(i+)LAB114:CMP AX,CX;比较i和n JLE SHORT LAB58;当i=n,则转移到LAB58处,继续循环 MOV AX,BX;把返回值保存到AX中 RET;返回到调用者,这里代表函数test25结束返回,讲解循环,2、教学内容安排,教学理念贯彻重点讲解为了更好地理解、使用高级语言,所需要的内容注意讲清为了更好地理解计算机工作原理、CPU基本功能,所对应的内容不求全面,但求明白,3、教学环境使用,演示和实践的环境输入和输出的方法例题或素材的获取,3、教学环境使用,演示和实践的环境VC集成开发环境查看目标代码和寄存器嵌入汇编方式进行编程和调试DOS环境汇编器和连接器的使用保护方式功能学习仿真环境保护方式功能学习,3、教学环境使用,输入和输出的方法前期,充分利用VC的输入、输出函数;后期,DOS系统功能调用、BIOS调用、直接写屏等方式,3、教学环境使用,int esp1,esp2,esp3,esp4,esp5;_asm MOV EAX,12345678HMOV esp1,ESPPUSH EAXMOV esp2,ESPPUSH AXMOV esp3,ESPPOP BXMOV esp4,ESPPOP ECXMOV esp5,ESPprintf(original ESP=%xnn,esp1);printf(after PUSH EAX ESP=%xnn,esp2);printf(after PUSH AX ESP=%xnn,esp3);printf(after POP BX ESP=%xnn,esp4);printf(after pop ECX ESP=%xnn,esp5);,验证堆栈操作的指针变化,3、教学环境使用,char strmess=HELLO WORLD;int pos1,pos2;int main(int argc,char*argv)_asm CLDLEA ESI,strmessMOV pos1,ESILODSBLODSWLODSD MOV pos2,ESIprintf(pos1=%x,pos2=%xn,pos1,pos2);return 0;,验证串装入指令功能的代码片断,3、教学环境使用,安排初始数据,写一个把一位16进制数,转换为对应七段代码的程序片段。,MOV BL,xcode;取16进制数字码 AND BL,0FH;保证在0至F之间 XOR BH,BH;表内偏移用16位表示以便寻址 MOV AL,tabBX;取得对应的代码 MOV ycode,AL;保存,char xcode,ycode;char tab=0 x40,0 x79,0 x24,0 x30,0 x19,0 x12,0 x02,0 x78,0 x00,0 x10,0 x08,0 x03,0 x46,0 x21,0 x06,0 x0e;,3、教学环境使用,例题或素材的获取,VC库函数strlen的实现VC库函数strchr的实现VC库函数memcpy的实现VC中switch语句的实现VC中for、while等语句的实现VC中函数参数传递的实现VC中指针功能的实现,3、教学环境使用,strlen procstring equ esp+4;mov ecx,string;ecx-string test ecx,3;test if string is aligned on 32 bits je short main_loopstr_misaligned:;simple byte loop until string is aligned mov al,byte ptr ecx inc ecx test al,al je short byte_3 test ecx,3 jne short str_misaligned add eax,dword ptr 0;5 byte nop to align label below,VC库函数strlen,数据对齐,代码对齐,3、教学环境使用,main_loop:mov eax,dword ptr ecx;read 4 bytes mov edx,7efefeffh add edx,eax xor eax,-1 xor eax,edx add ecx,4 test eax,81010100h je short main_loop;found zero byte in the loop mov eax,ecx-4 test al,al;is it byte 0 je short byte_0 test ah,ah;is it byte 1 je short byte_1 test eax,00ff0000h;is it byte 2 je short byte_2 test eax,0ff000000h;is it byte 3 je short byte_3 jmp short main_loop;taken if bits 24-30 are clear and bit 31 is set,VC库函数strlen,每次取4个字节,判断是否有结束符,3、教学环境使用,byte_3:lea eax,ecx-1 mov ecx,string sub eax,ecx retbyte_2:lea eax,ecx-2 mov ecx,string sub eax,ecx retbyte_1:lea eax,ecx-3 mov ecx,string sub eax,ecx retbyte_0:lea eax,ecx-4 mov ecx,string sub eax,ecx retstrlen endp,VC库函数strlen,4种不同的结束处理,3、教学环境使用,;设源和目标区域不重叠;-move x=(4-Dest N-process trailing bytes,VC库函数memcpy,先对齐处理,每次传4个字节,太短,不值得串处理,零头处理,3、教学环境使用,CopyLeadUp:;对齐处理入口 mov eax,edi;U-get destination offset mov edx,11b;V-prepare for mask sub ecx,4;U-check for really short string-sub for adjust jb short ByteCopyUp;V-branch to just copy bytes and eax,11b;U-get offset within first dword add ecx,eax;V-update size after leading bytes copied jmp dword ptr LeadUpVeceax*4-4;N-process leading bytes align WordSizeByteCopyUp:jmp dword ptr TrailUpVececx*4+16;N-process just bytesLeadUpVec dd LeadUp1,LeadUp2,LeadUp3,VC库函数memcpy,3种对齐情形的分支表,转入3种对齐处理,太短,直接转入零头处理,太短,3、教学环境使用,CopyUnwindUp:;不用串操作处理入口 jmp dword ptr UnwindUpVececx*4;N-unwind dword copyUnwindUpVec dd UnwindUp0,UnwindUp1,UnwindUp2,UnwindUp3 dd UnwindUp4,UnwindUp5,UnwindUp6,UnwindUp7UnwindUp7:mov eax,esi+ecx*4-28;U-get dword from source;V-spare mov edi+ecx*4-28,eax;U-put dword into destination。UnwindUp1:mov eax,esi+ecx*4-4;U(entry)/V(not)-get dword from source;V(entry)-spare mov edi+ecx*4-4,eax;U-put dword into destination lea eax,ecx*4;V-compute update for pointer add esi,eax;U-update source pointer add edi,eax;V-update destination pointerUnwindUp0:jmp dword ptr TrailUpVecedx*4;N-process trailing bytes,VC库函数memcpy,分支表,3、教学环境使用,LeadUp3:;一个字节的对齐处理入口 and edx,ecx;U-trailing byte count mov al,esi;V-get first byte from source mov edi,al;U-write second byte to destination inc esi;V-advance source pointer shr ecx,2;U-shift down to dword count inc edi;V-advance destination pointer cmp ecx,8;U-test if small enough for unwind copy jb short CopyUnwindUp;V-if so,then jump rep movsd;N-move all of our dwords jmp dword ptr TrailUpVecedx*4;N-process trailing bytes,VC库函数memcpy,零头处理,处理一个字节的对齐,U、V流水线,谢 谢!,