汇编语言程序设计(sha).ppt

上传人:小飞机 文档编号:6586402 上传时间:2023-11-15 格式:PPT 页数:69 大小:608KB
返回 下载 相关 举报
汇编语言程序设计(sha).ppt_第1页
第1页 / 共69页
汇编语言程序设计(sha).ppt_第2页
第2页 / 共69页
汇编语言程序设计(sha).ppt_第3页
第3页 / 共69页
汇编语言程序设计(sha).ppt_第4页
第4页 / 共69页
汇编语言程序设计(sha).ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《汇编语言程序设计(sha).ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计(sha).ppt(69页珍藏版)》请在三一办公上搜索。

1、第五章 汇编语言程序设计,主要内容:汇编语言源程序的结构 汇编语言语句格式 伪指令 汇编语言程序设计,5.1概述程序是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。机器语言:二进制数形式的指令和数据,既不直观,又不易理解和记忆(B0 64)助记符:用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆(MOV AL,64H),汇编语言:汇编语言是一种用符号表示的、面向CPU 指令系统的程序设计语言,是用指令的助记符、符号地址、标号等编写程序的语言。,汇编程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称

2、该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编 汇编语言源程序 机器语言目标程序,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件.ASM汇编(编译)目标文件.OBJ链接 可执行文件.EXE调试 最终程序,5.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:数据段存放数据、变量 堆栈段堆栈区域 代码段存放程序指令,一个基本的汇编语言程序框架如下:stack SEGMENT DB 100 DUP(stack)stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME

3、CS:code,DS:data,ES:data start:MOV AX,data MOV DS,AX MOV ES,AX MOV AL,4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,5.1.2 汇编语言的语句与格式,汇编语言的语句有两种:指令性语句由8086指令助记符构成的语句指示性语句由伪指令构成的语句指令性语句的格式为:标号:指令助记符 目的操作数,源操作数;注释 指示性语句的格式为:名字 伪指令 操作数1,操作数2,操作数n;注释 注:各部分之间至少要用一个空格作为分隔符。,指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应;指

4、示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。指令性语句汇编时生成机器码;指示性语句汇编时不生成机器码。,语句的构成元素:标号:指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。名字:段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。指令助记符:8086助记符、伪指令操作数:指令的操作对象,可以是:寄存器、存储单元、常数或表达式,5.1.3 语句中的操作数,1.常量包括数值常数和字符串常数数值常数:二进制数,以B结

5、尾。如01001101B。十进制数,如85。十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。,字符串常数:包含在单引号中的若干字符。汇编时被翻译成对应的ASCII码,有三个属性:段地址:即标号所在段的段地址;偏移量:标号所代表存储单元的段内偏移地址;类 型:NEAR或FAR:NEAR表示标号所在语句与转移指令/调用指令在同一码段内。FAR标号所在语句与转移指令/调用 指令不在同一代码段内。若没有对类型进行说明,默认为NEAR。标号通常作为转移指令或CALL指令的转移地址。,2.标号指令所在内存单元的符号地址,变量即内存中的存储单元或数据区。变量名是存储单元(数据区)的符

6、号地 址或名字。变量也有三个属性:段地址变量所在段的段地址偏移量变量单元地址与段首地址之间的位移量类 型有BYTE、WORD和DWORD三种变量在程序中作为存储器操作数被引用,3.变量,标号和变量名的使用规则组成:A-Z(不分大小写),0-9,?._$不能以数字开头,句号(.)只能作为首字符长度小于31个字符不能与关键字(指令助记符、伪指令、预定义符号等)重名不能重复定义例如:正确的:LP1,AGAIN,NEXT,_GO,OK_1 错误的:4M,LOOP,AAA,#ABC,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。包括数值表达式和地址表达式。MOV AX,12-4;数值表达式

7、 LEA BX,string+4;地址表达式运算符有5种:算术、逻辑、关系、取地址、属性。,1)算术运算符 有5个:+,-,*,/,MOD2)逻辑运算符 有4个:AND、OR、XOR、NOT,3)关系运算符 有6个:EQ、NE、LT、GT、LE、GE关系运算的结果是一个逻辑值:真或假关系为真,结果为全1,关系为假,结果为全0例:MOV AX,2 LT 7;(AX)=0FFFFH,4)取地址运算符SEG:取变量/标号的段地址OFFSET:取变量/标号的偏移地址MOV BX,OFFSET VAR;取变量VAR的偏移地址 MOV AX,SEG VAR;取变量VAR的段地址,5)属性运算符,PTR:用

8、来临时改变存储器操作数的类型。格式:PTR BYTE、WORD、DWORD 用于描述数据存储单元(变量)地址 NEAR、FAR 用于描述转移、调用的目的地址,例:STR1 DW?;STR1定义为字类型 MOV AX,STR1;合法 MOV AL,STR1;非法 MOV AL,BYTE PTR STR1;合法,5.2 伪指令,数据定义伪指令符号定义伪指令段定义和段寄存器指定伪指令过程定义伪指令结束伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:,功能:指示汇编完成规定操作的命令,5.2.1 数据定义伪指令 DB DW变量 DD 操作数1,操作数2,DQ DT功能:用于定义

9、变量,用变量和存储单元相联系,为变量分配内存单元 DB-字节类型 DW-字类型 DD-双字类型 DQ-四字类型 DT-五字类型,格式中操作数的形式:1、一个或多个常数/数值表达式,DATA1 DB 30HDATA2 DW 0240H,3500H DATA3 DB(-1*3),(16/4),DATA1,DATA2,DATA3,MOV AX,DATA1;错误MOV AL,DATA1;正确,MOV AX,DATA2;正确MOV AL,DATA2;错误MOV AL,BYTE PTR DATA2;正确,2、??用来保留存储空间,但不存入数据DATA5 DB?DATA6 DW?,DATA5,DATA6,D

10、ATA7,DATA8,3、字符串 DATA7 DB ABCD DATA8 DW AB,CD,注意:3个及其以上的字符 只能用DB定义。,4、重复方式DUP格式:变量 定义符 n DUP(表达式1)其中,n为重复次数 表达式1为重复内容,DATA9 DB 2 DUP(?)DATA10 DB 2 DUP(5,2 DUP(0),DATA9,DATA10,5.2.2 符号定义伪指令,把一个表达式用一个符号表示,以后凡是出现该表达式的地方都可用这个符号表示。,1.等值语句EQU 格式:符号名 EQU 表达式,PORT EQU 40H;用PORT代替40H COUNT EQU CX;用COUNT代替CX寄

11、存器 M EQU MOV;用M代替MOV指令助记符,注:EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。,2.等号语句=格式:符号名 表达式 例:PP=89FAH;赋值 PP=PP+1;PP=89FBH DIST=BYTE PTRSI+BP GOTO=JMP,例:B EQU BP+8 B EQU 20H 不行!,用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。用”=”定义的符号可在任何时候进行重定义二者均不占用存储空间,仅是给符号赋值,5.2.3 段定义伪指令,汇编语言程序是按段来组织程序和数据的。用于告诉汇编程序和链接程序如何按逻

12、辑段来组织程序和利用存储器。三类段:代码(程序)、数据、堆栈格式:段名 SEGMENT 定位类型组合方式类别 段名 ENDS,功能:定义段名和段属性,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。,1)定位类型说明如何确定逻辑段的边界。有四种:PARA:16的倍数地址,地址低4位为零,默认值。BYTE:从任何地址开始。WORD:段的起始地址必须是偶数,地址低1位为0。PAGE:256的倍数地址,地址低8位为0。,2)组合类型说明不同模块中同名段的组合方式。PUBLIC:所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中COMMON:所有此类型的同

13、名段具有相同的起始地址(覆盖),共享相同的存储区域AT:指定段的起始地址,不能用于代码段STACK:专用于说明堆栈段,组合方式同PUBLIC,3)类别用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。,1.地址计数器$功能:指出汇编地址的偏移量,记载下一个变量或指令在当前段中的偏移量每个段开始时,$=0,随着汇编过程的进行而自动增值$用于指令时,表示本条指令的第一个字节地址,$用于其他情况时,表示当前值如:JNE$+6,转向JNE指令的首地址加6,5.2.4 地址计数器伪指令,格式:ORG 功能:定义指令或数据的起始地址(段内的偏移地址),把表达式的值送给$,表达式的值即为开始地

14、址例:ABC SEGMENT ORG 100H begin:ABC ENDS,2.起始地址伪指令ORG,指令从100H开始存放,DATA SEGMENTORG 200HDATA1 DB 12H,2+6,34HDATA2 DW 789AHDATA3 DW$,6699HDATA ENDS,DATA2,200H,78H,DATA1,204H 205H 206H 207H,02H,05H,99H,203H,9AH,34H,08H,12H,201H,202H,66H,208H,209H,DATA3,$,5.2.5 段分配伪指令ASSUME,功能:指定段和段寄存器的关系,说明哪个段使用哪个段寄存器格式:A

15、SSUME 段寄存器名:段名,,ASSUME CS:code,DS:data,ES:data,这个语句说明:1.CS将指向名字为code的代码段 2.DS和ES将指向名字为data的数据段,注意:1.程序段必须用CS,堆栈段必须用SS 2.该语句一般放在代码段的最前面 3.说明性语句,除CS外,各段寄存器在程序中赋值,5.2.6 过程定义伪指令PROC、ENDP,功能:用于定义子程序的结构,过程名是CALL的操作数格式:过程名 PROC 类型 RET 过程名 ENDP,NEAR过程只能被定义该过程的段中的其他程序调用(段内调用),缺省时为NEAR FAR过程可由任何段中的程序调用(段间调用),

16、类型:,5.2.7 汇编结束伪指令END,汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END 表达式END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。,DATASEGMENT;定义数据段D1DB 5 DUP(?);5个字节单元CCEQU$D1;单元的个数SUMDW 0;累加结果放在SUM中DATAENDS;数据段定义结束STACK SEGMENT;定义堆栈段DB 100 DUP(?);100字节的栈空间STACKENDS;堆栈段定义结束CODESEGMENT;定义代码段ASSUME DS:DATA,SS:STACK,

17、CS:CODE;对各段进行说明BEGIN:MOV AX,DATA;DS初始化为DATAMOV DS,AX MOV AX,STACK MOV SS,AX,多个连续字节单元的累加,LEA SI,D1;预置源数据的首地址MOV CX,CC;预置次数 CLDLODSB;取一个数并修改SIMOV AH,0;清AX的高字节CLC;清CF位AGAN:ADC SUM,AX;累加LODSB;再取数并修改SILOOP AGAN;控制循环MOV AH,4CH;完成,返回DOSINT 21HCODE ENDS;代码段结束ENDBEGIN;整个程序结束,调用DOS系统的4CH 功能,返回DOS方法:在要返回DOS 处,

18、安排指令:MOV AH,4CH INT 21H 执行完4CH的功能调用,即返回DOS。,例 code SEGMENT ASSUME CS:codestart:、;程序主体部分、MOV AH,4CH;返回DOS INT 21Hcode ENDS END start,5.3 汇编语言程序设计基础,5.3.1 概述1.汇编语言程序设计的步骤:根据实际问题抽象出数学模型确定算法画出程序框图(流程图)分配内存工作单元和寄存器编程、调试,2.绘制程序流程图,(1)用方框表示工作框,(2)用菱形框表示判断框,N,Y,?,(4)各框之间用直线连起来表示程序走向。,(3)用 框表示调用子程序或过程。,3.源程序

19、的基本结构:顺序、分支、循环、子程序,例:将某段中的字符串“Hello!”传送到另一段中(内存数据块的传送)。,5.3.2 顺序结构程序(顺序执行,无转移、无循环),aa SEGMENT;数据段1xx DB Hello!;定义源串aa ENDSbb SEGMENT;数据段2yy DB 6 dup(?);定义目的串bb ENDScc SEGMENT;代码段 ASSUME CS:cc,DS:aa,ES:bb;分配段寄存器start:CLD;设置传送方向 MOV AX,aa;DS:SI 源串首地址 MOV DS,AX LEA SI,xx MOV AX,yy;ES:DI 目的串首地址 MOV ES,A

20、X MOV DI,OFFSET yy MOV CX,6;CX 串的长度 REP MOVSB;串传送 MOV AH,4CH;调用4CH系统功能,返回DOS INT 21H cc ENDS END start;程序结束,条件满足?,处理P1,处理P2,标号1:,标号2:,N,Y,1.简单分支结构,5.3.3 分支程序,用比较指令 CMP DEST,SRC JE EQUL EQUL:用测试指令 TEST DEST,SRC JNZ NEXT NEXT:用逻辑指令 SHR DEST,CL JC NEXT NEXT:,例1:现有DS段中的NUM为8位无符号数,将这个单元中数低四位对应的16进制数转换成AS

21、CII码,存入STR单元。例2:求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存中STR单元中。,标号1:,条件1成立?,P1,N,Y,2.多种分支结构,条件2成立?,条件n成立?,Pn+1,标号2:,标号n:,标号n+1:,P2,Pn,N,N,Y,Y,例3:编程实现下列函数的功能,其中X、Y为无符号字节数。,(AL)=(BL)?,程 序,;-数据段定义-DATSEGMENTXDB242YDB67ZDB?DATENDS;-代码段定义-COD SEGMENT ASSUME DS:DAT,CS:CODSTART:MOV AX,DAT MOV DS,AX;初始化DS MOV AL,X

22、 MOV BL,Y,;-CMPAL,BLJEC1;(AL)(BL)则跳转至C1 JAC2;(AL)(BL)则跳转至C2 MOVAL,-1 JMP EXT C1:MOVAL,0 JMPEXT C2:MOVAL,1 EXT:MOV Z,AL MOVAH,4CH INT 21H;返回DOS;-CODENDSENDSTART,循环程序的组成:循环程序是在满足某些条件时对一段程序的重复执行,一般由四部分组成。,2.基本结构形式(1)先执行后判断(dowhile)至少执行一次循环体,(2)先判断后执行循环体可能一次都不执行,5.3.4 循环程序,初始化,循环体,循环控制,继续循环?,Y,N,初始化,循环体

23、,循环控制,继续循环?,Y,N,MOV CX,COUNT AGAIN:LOOP AGAIN MOV CX,COUNT AGAIN:DEC CX JNZ AGAIN MOV CX,COUNT AGAIN:JCXZ NEXT DEC CX JMP AGAIN NEXT:,例:在内存BLOCK开始处存放了10个无符号字节数,从中找出最大值送入MAX单元中。,DATA SEGMENTBLOCK DB 100,60,20,MAX DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAH1:MOV AX,DATA MOV DS,AX MOV CX,9 MOV AL,

24、BLOCK LEA BX,BLOCK,AGAIN:INC BX CMP AL,BX JAE NEXT XCHG AL,BXNEXT:LOOP AGAIN MOV MAX,AL CODE ENDS END H1,DATA SEGMENTARRAY DB 66H,88H,10H,DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS:AX MOV DI,9 LOOP1:MOV CX,DI MOV BX,0LOOP2:MOV AL,ARRAYBX CMP AL,ARRAYBX+1 JGE NEXT,XCHG AL,A

25、RRAYBX+1 MOV ARRAYBX,ALNEXT:INC BX LOOP LOOP2 DEC DI JNZ LOOP1 CODE ENDS END START,例:将内存首地址为ARRAY开始的10个带符号字节数,将其按由大到小的次序排列。,子程序:重复使用的程序段或具有通用性便于共享的 程序段1.调用子程序用CALL指令,返回调用程序用RET指令2.现场的保护和恢复现场:指转向子程序执行时主程序的状态,包括当时标志寄存器、段寄存器、通用寄存器的内容主程序和子程序的设计是分开进行的,为保证主、子程序所使用的寄存器不会发生冲突,进入子程序时要保护主程序的运行状态和使用的寄存器内容(保护现场

26、),退出子程序前要恢复现场。现场的保护和恢复分别用PUSH和POP指令实现,5.3.5 子程序设计,调用和返回指令,调用指令CALL 段内直接调用 格式 CALL 符号地址;NEAR属性 执行(SP)(SP)-2(SS:SP)(IP)(IP)符号地址的偏址,段间直接调用格式:CALL 符号地址;FAR属性执行:(SP)(SP)-2(SS:SP)(CS)(SP)(SP)-2(SS:SP)(IP)(IP)符号地址的偏址(CS)符号地址的段址,返回指令RET,段间返回格式 RET 或 RETF 执行(IP)(SS:SP)(SP)(SP)+2(CS)(SS:SP)(SP)(SP)+2,段内返回 格式

27、RET 执行(IP)(SS:SP)(SP)(SP)+2,段内和段间返回指令的汇编语言格式均可用RET,但机器码不同,段内为C3H,段间为CBH,汇编程序据过程类型确定返回类型。,调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递的方法:,方法一:PUSH BX PUSH CX CALL PROC-1 POP CX POP BX,(1)使用约定的寄存器传递(2)使用约定的存储单元传递(3)使用堆栈传递(要用BP寻址),利用堆栈传递参数通常在主程序中把参数或参数地址保存在堆栈中,而在子程序中将参数从堆栈取出来例:把一个用十六进制表示的字ASCII码 汇编程序如下:DATA

28、SEGMENTNUMDW25AFH;要转换的十六进制数STRINGDB4 DUP(?)DATAENDS,STACKSEGMENTDB 100 DUP(?)STACKENDS CODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AX LEABX,STRING;取变量偏址PUSHBX;将偏址压栈PUSHNUM;将变量压栈,BH,BL,0064H,0062H,(SP),25,AF,0060H,堆栈,CALL BINHEX MOVAH,4CH INT21H;

29、*BINHEXPROCPUSHBPMOVBP,SPPUSHAX PUSHDI PUSHCX PUSHDX,BH,BL,0064H,0062H,25,AF,0060H,005EH,IPH,005CH,(BP、SP),(IP),(BP),IPL,BH,BL,0064H,0062H,25,AF,0060H,005EH,IPH,005CH,(BP),PUSHF MOV AX,BP+4 MOV DI,BP+6 MOV DX,AX;(DX)=25AFH MOV CX,4 STD;从后往前存AGAIN:AND AX,000FH;第一次(AX)=000FH CALL HEXD;转换为ASCII码 STOSB

30、PUSH CX MOV CL,4 SHR DX,CL;逻辑右移4位 MOV AX,DX;第1次(AX)=025AH POP CX LOOP AGAIN;(CX)-1=0?不等,转,+4,IPL,(BP),POPFPOPDX POPCXPOPDIPOPAXPOPBPRET4 BINHEX ENDP;*HEXD PROC CMP AL,0AH JL LP ADD AL,7LP:ADD AL,30H RETHEXD ENDPCODE ENDS END BEGIN,0064H,0062H,0060H,005EH,005CH,BH,BL,25,AF,(BP),(SP),IPH,IPL,从本例可知,通过堆

31、栈传递的两个参数分别为:变量NUM的内容25AFH和变量STRING的偏移地址。这两个参数在调用子程序之前压入堆栈,当CALL指令返回时,其(SP)=0060H,不是初值0064H。故采用带参数返回指令RET 4。本例重点掌握:进一步了解堆栈的使用 BP的作用 学会RET n的应用 子程序嵌套,5.4 DOS系统功能调用介绍,系统功能调用由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。在DOS系统中,功能调用都是用软中断指令INT 21H来实现的。,D0S系统功能调用的使用方法如下:AH功能号;设置该功能所要求的其他入口参数;执行INT 21H指令;分析出口参数。,

32、以下介绍INT 21H的几个最常用的功能。,1.DOS键盘功能调用,(1)从键盘输入一个字符(功能号=1)MOV AH,1 INT 21H,GET_KEY:MOV AH,1;等待键入字符 INT 21H;结果在AL中 CMP AL,Y;是Y?JZ YES;是,转YES CMP AL,N;是N?JZ NO;是,转NO JMP GET_KEY;否则继续等待输入 YES:NO:,(2)输入字符串(功能号=0AH)此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。MOV AH,0AH LEA DX,INT 21H,(预留的N1个字节的存储单元),0DH,N2,N1,N1:缓冲区长度(最大键入字符数)N2:实际键入的字符数(不包括回车符),用户定义的输入字符串的缓冲区格式,2.DOS显示功能调用,(1)在显示器上显示一个字符(功能号=2)MOV AH,2 MOV DL,INT 21H 例:在显示器上显示一个字符A MOV AH,2 MOV DL,A;或MOV DL,41H INT 21H,MOV AH,9 LEA DX,INT 21H注意:被显示的字符串必须以$结束。,(2)显示字符串(功能号=9),3.退回DOS MOV AH,4CH;功能号 INT 21H,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号