微机原理课件第8讲.ppt
第四章第四章 汇编语言程序设计汇编语言程序设计4.1 汇编语言的程序结构和语句格式汇编语言的程序结构和语句格式4.2 伪指令语句伪指令语句4.3 汇编语言程序设计基础汇编语言程序设计基础4.1汇编语言的程序结构和语句格式语言的发展机器语言(Machine Language):二进制表示指令和数据,能被机器直接识别的计算机语言。速度快、占用内存少。汇编语言(Assembly Language):采用助记符表示的程序设计语言。内存空间少,而且执行速度快。高级语言(High Level Language):高级语言则是面向用户的语言。机器语言 指令中仅包含“0”和“1”。优点:执行速度快 缺点:难记,编程时容易出错,修改程序时更是如此 不同种机器之间程序不能通用。原因:不同生产厂家,不同种计算机指令系统不相同,所以,在一台计算机上执行的程序,要想在另一台计算机上执行,必须另编程序,造成了重复工作。汇编语言用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,例如:“ADD”代表加法,“MOV”代表数据传递有了助记符,读懂、纠错及维护程序都变得方便了。计算机不认识这些助记符,需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。依赖计算机的硬件结构和指令系统,移植性较差。高级语言 这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,1954年,第一个完全脱离机器硬件的高级语言FORTRAN问世了,多年来,共有几百种高级语言出现,有重要意义的有几十种,如pascal,c语言。高级语言也有缺点:高级语言需要翻译成机器语言,与直接用汇编语言编写的程序比,占用内存大,执行时间长 访问机器的硬件资源比较困难Pascal语言举例读入两个数,将大数存入x,小数存入yPROGRAM larger(input,output);VAR x,y,temp:real;BEGIN read(x,y);writenln(x=,x,y=,y);IF xy THEN BEGIN temp:=x;x:=y;y:=temp END;writenln(x=,x,y=,y);END.可能的运行结果25 37X=25 y=37X=37 y=25c语言举例读入两个数,将大数存入x,小数存入yMain()float x,y,temp;scanf(“%f%f”,&x,&y);printf(“%f%f”,x,y);if(xy)temp=x;x=y;y=temp printf(“%f%f”,x,y);可能的运行结果25 37X=25 y=37X=37 y=25汇编语言源程序 使用汇编语言编写的程序,不能被机器识别。汇编与汇编程序 汇编程序是把源程序翻译成与之等价的机器语言程序的翻译程序,相应的过程叫汇编。连接程序 将目标程序和库文件相连,形成可执行文件。汇编语言源程序.asm汇编程序目标程序.obj连接程序可执行程序.exeDATASEGMENT;数据段数据段DATA1 DB 0F8H,60H,0ACH,74H,3BHDATA2 DB 0C1H,36H,9EH,0D5H,20HDATAENDS 汇编语言源程序包含的内容数据段:一般为DATA SEGMENTDATA ENDS堆栈段:一般为STACK SEGMENTSTACK ENDS代码段:一般为CODE SEGMENTCODE ENDS【例】要求将两个5字节十六进制数相加,可以编写出以下汇编语言源程序。汇编语言源程序汇编语言源程序CODE SEGMENT;代码段 ASSUME CS:CODE,DS:DATASTART:CODE ENDS END START MOV AX,DATA MOV DS,AX MOV CX,5;循环循环5 5次次 MOV SI,0 CLC LOOPER:MOV AL,DATA2SI ADC DATA1SI,AL INC SI DEC CX JNZ LOOPERMOV AH,4CH INT 21H;返回返回DOS分段结构 每个段以段定义伪指令SEGMENT语句开始,以ENDS语句结束。格式形如:段名段名 SEGMENT 段名段名 ENDS 其中,代码段是必须有的;堆栈段如果用户不定义系统会自动分配。不同的段通过ASSUME识别。ASSUME CS:段段名名,DS:段段名名,SS段段名名,ES:段段名名 整个源程序的结尾是END语句,汇编程序遇见END就结束。汇编语言语句的类型和格式q指令语句:与机器指令对应,汇编程序能将其翻译成目标代码,CPU 可以执行的能完成特定功能的语句。q伪指令语句:它是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。主要完成数据定义、存储区分配、段定义、段分配、指示程序结束等功能。变量 因为变量是存储器中某个数据区的名字,所以在指令中可以作为存储器操作数。变量属性:段(SEGMENT)、偏移量(OFFSET)和类型(TYPE)。段值:变量所在段的段基址。段内偏移地址:指变量所在地址与所在段首地址之间的地址偏移字节数。类型:指变量中每个元素所包含的字节数,类型BYTE、WORD、DWORD等。变量 表达式中常用的运算符有以下6类:算术运算符(Arithmetic Operators)逻辑运算符(Logical Operators)关系运算符(Relational Operators)数值返回运算符(Value-Returning Operators)修改属性运算符(Modifing Attribute Operators)其他运算符(Other Operators)表达式算术运算符 算术运算符可用于数值表达式,运算结果是一个数值。在地址表达式中通常只使用其中的和(加和减)两种运算符。表达式符号名称运算结果+加法和-减法差*乘法乘积/除法商MOD 模取余余数SHL左移左移后二进制数SHR右移右移后二进制数【举例】数组ARR定义如下 ARR DB 1,2,3,4,5,6,7,8 TRY DB 20 指令为:MOV AX,30*5 MOV CX,(,(TRYARR)汇编时,计算表达式形成如下指令:MOV AX,150 MOV CX,8算术运算符逻辑运算符 逻辑运算符只用于数值表达式中对数值进行按位逻辑运算,并得到一个数值结果。对地址进行逻辑运算是没有意义的。逻辑运算符和指令助记符中对应的符号完全相同,作为表达式在汇编时执行,指令助记符则在程序中执行。表达式符号名称运算结果AND与运算逻辑与结果OR或运算逻辑或结果XOR异或运算逻辑异或结果NOT非运算逻辑非结果【举例】有下列指令 MOV AL,NOT 0FFH MOV BL,8FH AND 63H MOV AH,82H XOR 95H 汇编时,计算表达式形成如下指令:MOV AL,0 MOV BL,3H MOV AH,17H逻辑运算符关系运算符 参与关系运算的必须是两个数值或同一段中的两个存储单元地址,但运算结果只可能是两个特定的数值之一:当关系不成立(假)时,结果为0(全0);当关系成立(真)时,结果为0FFFFH(全1)或0FFH。表达式符号名称运算结果EQ相等 结果为真输出全“1”结果为假输出全“0”NE不等LT小于LE小于等于GT大于GE大于等于【举例】有下列指令 MOV AX,10H GT 16 MOV BL,6 EQ 0110B MOV CX,6 EQ 0110B 汇编时,计算表达式形成如下指令:MOV AX,0 MOV BL,0FFH MOV CX,0FFFFH关系运算符小结语言的发展指令性语句与伪指令语句汇编语言中的表达式