四章汇编语言程序设计ppt课件.ppt
第四章 汇编语言程序设计,4.1 概述4.2 汇编语言的程序结构与语句格式4.3 汇编语言的伪指令语句4.4*汇编语言程序设计4.5*模块化程序设计4.6*实用程序设计举例,4.1 概述,机器语言(Mechine Language):二进制表示的指令和数据。汇编语言(Assenbly Lauguage):用助记符来编写指令,地址和数据也可用符号表示。用汇编语言编写的程序必须翻译成机器语言目标程序(或目标代码)才能执行,这种翻译过程称为汇编。(图4-1,P141)高级语言:不针对某个具体的计算机,通用性强。但高级语言编写的源程序同样必须“翻译”成机器语言,计算机才能执行,所用的系统软件称为编译程序或解释程序。,4.2 汇编语言程序结构与语句,汇编语言源程序例子 DATA SEGMENT;定义数据段 DATA1 DB 0F8H,60H,0ACH,74H,3BH;被加数 DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数 DATA ENDS;数据段结束 CODE SEGMENT;定义代码段 ASSUME CS:CODE,DS:DATA;告诉汇编程序段范围 START:MOV AX,DATA MOV DS,AX;初始化DS MOV CX,5;循环次数送CX MOV SI,0;置SI初值为零,汇编语言源程序的例子,CLC;清CF标志LOOPER:MOV AL,DATA2SI;取一个字节加数 ADC DATA1SI,AL;与被加数相加 INC SI;SI加1指向下一字节 DEC CX;计数器CX减1 JNZ LOOPER;不等于零,转LOOPER MOV AH,4CH;停止(INT21H)INT 21H;返回DOS CODE ENDS;代码段结束 END START;源程序结束,指定起始地址标号,汇编语言源程序标准格式,DATA SEGMENT.DATA ENDSSTACK SEGMENT STACK.STACK ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODESTART:PUSH DS;MOV AX,0;与DOS的接口 PUSH AX;称为标准序 MOV AX,DATA;MOV DS,AX;重新设置DS RET;如果不用标准序,此处为MOV AH,4CH;INT 21HCODE ENDS END START,DS,ES,汇编语言语句的组成和类型,指令性语句:可以产生相应的机器码 LOOPER:MOV AL,DATASI指示性语句(伪操作指令):不产生机器码。DATA1 DB 0F8H,60H,0ACH,74H宏指令:以宏名字定义的一段指令序列语句的格式:名字 操作码/伪操作 操作数;注释,名字:变量和标号,变量名/段名/过程名:伪指令语句中的名字。内存单元的名字,由DB/DW/DD定义。BUF DB?变量的三种属性:段值 SEG偏移量 OFFSET类型 BYTE/WORD/DWORD标号:指令语句中的名字。指令存放单元的符号地址。LOOPER:MOV AL,DATASI标号的三种属性:段值 SEG偏移量 OFFSET类型 NEAR/FAR注:对于汇编程序来说,变量和标号都是存储单元的符号地址。只是标号对应的存储单元中存放的是指令,而变量所对应的存储单元存放的是数据。,助记符和伪操作,指令助记符:MOV,ADD,.指示性(伪指令)操作符:DB,DW,SEGMENT,ENDS,ASSUME,END,.保留字:SEGMENT ENDS OFFSET SIZE DB DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END,操作数,常数/寄存器/存储器操作数(标号/变量)/表达式表达式:数值表达式(只有大小)和地址表达式(有段属性、偏移量属性和类型属性)算术运算符逻辑运算符关系运算符分析运算符合成运算符其它运算符(表4-1 P146),运算符之一:算术运算符,、*、/、MOD、SHL、SHR都可应用于数字运算。、可以用于表示存储器操作数的地址,或两个存储器单元(同一段内)的地址偏移量之差。例:SUM-2 CYCLE-GO,运算符之二:逻辑运算符,AND、OR、XOR、NOT 按位的逻辑运算例:IN AL,PORT_VAL OUT PORT_VAL AND 0FEH,AL ANDDX,PORT_VAL AND 0FEH,运算符之三:关系运算符,EQ、NE、LT、GT、LE、GE用于数字或存储器操作数运算,结果为数字(0或0FFFFH)。例:MOV BX,PORT LT 5 MOVBX,(PORT_VAL LT 5)AND 20)OR(PORT_VAL GT 5)AND 30),运算符之四:分析运算符,SEG 变量/标号(返回段基址)OFFSET 变量/标号(返回偏移量)TYPE 变量/标号(返回元素字节数)变量返回类型:1字节、2字、4双字标号返回类型:-1NEAR、-2FARLENGTH 变量(返回变量单元数)SIZE 变量(返回变量总字节数),运算符之四:分析运算符,DATA_TABLES SEGMENTBUFFER1DB 100 DUP(?)BUFFER2DW200 DUP(?)BUFFER3DD 100 DUP(?)DATA_TABLESENDS-MOVAX,SEG BUFFER1(或BUFFER2,BUFFER3)MOVDS,AX-MOVBX,OFFSET BUFFER1MOVSI,OFFSET BUFFER2MOVDI,OFFSET BUFFER3MOVBX,ALMOVSI,CXMOVWORD PTRDI,DX,LENGTH BUFFER1=100LENGTH BUFFER2=200LENGTH BUFFER3=100SIZE BUFFER1=100SIZE BUFFER2=400SIZE BUFFER3=400,运算符之五:合成运算符,PTR(修改类型属性)类型 PTR 表达式 STUFF DD?MOV BX,WORD PTR STUFFTHIS(指定类型属性)THIS 类型 ABC EQU THIS BYTE EFG DW 100 DUP(?);可以将100字的EFG按200字节的ABC来使用SHORT(短转移说明)JMP SHORT 短标号HIGH 和LOW:(高低字节分离)HIGH 1234H=12HLOW 1234H=34H段超越运算符“:”ES:BX,运算符之六:其它运算符,圆括号()(改变运算符优先级)方括号(下标或间接寻址)各种运算符运算的顺序(表4.2)优先级高的先运算优先级相同的按从左到右运算圆括号提高优先级,4.3 汇编语言的伪指令语句,符号定义伪指令数据定义伪指令段定义伪指令过程和宏定义伪指令模块定义与通信*条件汇编伪指令*列表伪指令,伪指令之一:符号定义伪指令,EQU:将表达式的值赋予一个名字,不能重复定义CR EQU 0DH;常量AA EQU ASCII_TABLE;变量VAR EQU TEN*2+1024;数值表达式ADR EQU ES:BP+DI+5;地址表达式GOTO EQU JMP;指令助记符:与EQU基本相同,可以对一个名字重复定义NUM=488;定义NUM等于488NUM=NUM+1;定义NUM等于489,伪指令之二:数据定义伪指令,格式:变量名 伪操作 操作数,操作数DB/DW/DD/DQ/DT:定义变量、分配存储单元等。操作数可以是:数值表达式或表、字符串、?、N DUP表达式1、为数据项分配存储单元NUM DW 100*5+88SUM DQ 0011223344556677,伪操作命令之二:数据定义伪指令,2、预留存储单元但不赋值STR DB?SUMDW?3、定义数组ADB?,?,?BUFFERDB 10 DUP(?)ABDDDW10 DUP(0)4、定义字符串STR1 DB COMPUTER STR2 DW AA,BC,DE5、定义标号或变量的偏移地址或全地址XX DW CYCLEYYDDCYCLE数据定义语句定义了变量的类型,可以使汇编程序对访问的存储器指令产生正确代码例:SUM DW 0INC SUM,伪操作命令之二:数据定义伪指令,分析操作符SEG、OFFSETTYPE、LENGTH、SIZE合成操作符PTRLABEL(定义一个指定类型的标号或变量)WBYTE LABEL WORDARRAY DB 1,2,3,4MOV AL,ARRAY;01H-ALMOV AX,WBTYE;0201H-AXTHIS(与EQU配合使用具有LABEL同样的作用)BWORD EQU THIS BYTEARRAY DW 100 DUP(?),伪操作命令之三:段定义伪指令,段定义伪指令SEGMENT/ENDS 段名 SEGMENT 定位类型组合类型类别.段名 ENDS段名:一个段开始和结尾的段名必须一致,否则会出现语法错误定位类型:BYTE、WORD(偶地址开始)、PARA(XXXX0H)、PAGE(XXX00H)组合类型:NONE、PUBLIC(同名段组合成一个段)、COMMON(同名段重叠覆盖)、STACK、MEMORY(放在所有段最后)、AT表达式(指定起始地址)类别名CODE、DATA、STACK(同名同类别段连续存放),伪操作命令之三:段定义伪指令,段寄存器说明伪指令ASSUME ASSUME 段寄存器名:段名段寄存器名:段名.例:CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKMAIN:CODE ENDSENDS MAIN;指定第一条要执行的指令标号注:1、该伪指令用于明确用SEGMENT定义的段的类型,使编译程序能生成目标代码程序。2、在源程序中,该伪操作放在可执行程序的前面。3、该指令没有给段寄存器赋予实际的初值。这项工作要通过写指令来完成,其中代码段不需要赋值。,伪操作命令之三:段定义伪指令,组定义伪指令GROUP组名 GROUP 段名,段名组内各段都装入一个64K的物理段中(P155)指定地址伪指令ORGORG 表达式ORG$+表达式例:ORG 10H;在10H处开始存放20H,30H X DB 20H,30H ORG$+5;在数据段17H处存放40H,50H Y DB 40H,50H,伪操作命令之四:过程和宏定义伪指令,PROC 过程名 PROC NEAR/FAR.RET 过程名 ENDP注:1、程序块被定义后,可用 CALL 过程名的形式进行调用。2、过程名和标号一样,有三种属性:段、偏移量和类型。类型为NEAR和FAR,缺省为NEAR。3、过程的定义和调用可以嵌套,嵌套深度只受堆栈大小限制。,伪操作命令之四:过程和宏定义伪指令,MACRO宏指令名 MACRO 形参,形参 ENDM调用格式:宏指令名 实参,实参宏展开(例P158)宏的取消:PURGE 宏定义名,,伪操作命令之五:模块定义与通信伪指令,模块定义伪指令格式:NAME 标识符 END 启动标号模块通信伪指令(1)全局符号伪指令格式:PUBLIC 符号名1,符号名2,(2)引用伪指令格式:EXTRN 符号名1:类型,符号名2:类型,,4.4 汇编语言程序设计,程序设计的一般步骤分析问题,建立数学模型确定解决数学模型的算法画程序结构框图和流程图分配内存工作单元和寄存器编程和调试评价程序质量的标准程序的性能指标:响应时间、中间参数、输出方式和结果、安全可靠性等可读性和规范性:易于阅读、测试、维护、交流、移植、与其他程序连接和共享等,程序的基本结构,顺序结构分支结构利用比较和转移指令实现分支利用跳转表实现分支(P170)根据表内地址分支根据表内指令分支循环结构记数控制条件控制状态控制逻辑尺控制,子程序设计与调用,现场保护与恢复子程序中要用到主程序已使用并之后还需使用的某些寄存器或存储单元,需要将它们压入堆栈加以保护,结束后再恢复有关内容主程序与子程序的参数传递寄存器传递存储单元传递堆栈传递,子程序设计与调用,子程序说明功能描述入口和出口参数所用寄存器和存储单元子程序中调用的其他子程序调用实例,DOS和BIOS调用,DOS(Disk Operation System)和BIOS(Basic Input and Output System)是为用户提供的两组系统服务程序。BIOS是IBM PC/XT的基本I/O系统,负责管理系统的测试程序、初始化引导程序、一部分中断矢量装入程序及外部设备的服务程序。由于这些程序固化在ROM中,用户可以直接调用。DOS是IBM PC/XT的操作系统,负责管理系统的所有资源,协调微机的操作,其中包括大量的可供调用的服务子程序,完成设备的管理和磁盘文件的管理。用户控制PC机硬件的方法:高级语言调用DOS程序使用BIOS程序直接访问硬件,DOS系统功能调用(INT 21H),调用方法1、子程序规定的入口参数送指定的寄存器。2、系统功能调用号送AH3、INT 21H字符输出1、利用02H功能在CRT上显示一个字符。要求:(AH)=02H,(DL)=欲输出字符的ASCII码例:MOVDL,41H;AMOVAH,02HINT21H,DOS系统功能调用(INT 21H),2、利用09H功能在CRT上显示一个字符串要求:(AH)=09H,(DX)=欲输出字符串的首址,字符串以$结束。例DATA SEGMENTSTRING DB HELLO EVERYBODY!$.DATA ENDS.CODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE.MOVDL,OFFSET STRINGMOVAH,09HINT21H.CODE ENDS END.,DOS系统功能调用(INT 21H),字符输入1、利用0AH功能从键盘输一个字符入内存。要求:(AH)=0AH,(DX)=输入缓冲区首址 数据段中的输入缓冲区:第一个字节为所能保存的最大字符数 第二个字节为实际接收的字符个数保留的单元 第三个字节为所输入的第一个字符的ASCII码.,DOS系统功能调用(INT 21H),例DATA SEGMENTINBUFFER DB 81DB?DB 80 DUP(?).DATA ENDS.CODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE.MOVDX,OFFSET INBUFFERMOVAH,0AHINT21H.CODE ENDS END.,DOS系统功能调用(INT 21H),程序中断1、利用4CH功能返回DOS。要求:(AH)=4CH,CODE SEGMENTMOV AH,4CHINT21HCODE ENDS,DOS系统功能调用,2、利用INT 20H功能返回DOS。例:CODE SEGMENT ASSUME:MYPR PROC FARPUSH DS SUBAX,AX;MOV AX,0PUSHAX.RETMYPRENDPCODE ENDSEND.,