




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 汇编语言程序设计,主要内容: 汇编语言源程序的结构 汇编语言语句格式 伪指令 汇编语言程序设计,5.1 概述 程序是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。 机器语言:二进制数形式的指令和数据,既不直观,又不易理解和记忆( B0 64 ) 助记符:用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆(MOV AL,64H),汇编语言:汇编语言是一种用符号表示的、面向CPU 指令系统的程序设计语言,是用指令的助记符、符号地址、标号等编写程序的语言 。,汇编程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编 汇编语言源程序 机器语言目标程序,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件 .ASM 汇编(编译) 目标文件 .OBJ 链接 可执行文件 .EXE 调试 最终程序,5.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成: 数据段存放数据、变量 堆栈段堆栈区域 代码段存放程序指令,一个基本的汇编语言程序框架如下: stack SEGMENT DB 100 DUP (stack) stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME 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执行,每一条指令性语句都有一条机器码指令与其对应; 指示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。 指令性语句汇编时生成机器码; 指示性语句汇编时不生成机器码。,语句的构成元素: 标号:指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。 名字:段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。 指令助记符:8086助记符、伪指令 操作数:指令的操作对象,可以是:寄存器、存储单元、常数或表达式,5.1.3 语句中的操作数,1.常量 包括数值常数和字符串常数 数值常数: 二进制数,以B结尾。如01001101B。 十进制数,如85。 十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。,字符串常数: 包含在单引号中的若干字符。 汇编时被翻译成对应的ASCII码,有三个属性: 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类 型:NEAR或FAR: NEAR表示标号所在语句与转移指令/ 调用指令在同一码段内。 FAR标号所在语句与转移指令/调用 指令不在同一代码段内。 若没有对类型进行说明,默认为NEAR。 标号通常作为转移指令或CALL指令的转移地址。,2.标号指令所在内存单元的符号地址,变量即内存中的存储单元或数据区。 变量名是存储单元(数据区)的符号地 址或名字。 变量也有三个属性: 段地址变量所在段的段地址 偏移量变量单元地址与段首地址之间的位移量 类 型有BYTE、WORD和DWORD三种 变量在程序中作为存储器操作数被引用,3.变量,标号和变量名的使用规则 组成:A-Z(不分大小写), 0-9, ? . _ $ 不能以数字开头,句号(.)只能作为首字符 长度小于31个字符 不能与关键字(指令助记符、伪指令、预定义符号等)重名 不能重复定义 例如: 正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #ABC,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。 包括数值表达式和地址表达式。 MOV AX, 12 - 4 ;数值表达式 LEA BX, string + 4 ;地址表达式 运算符有5种:算术、逻辑、关系、取地址、属性。,1)算术运算符 有5个: +,-,*,/,MOD 2)逻辑运算符 有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:用来临时改变存储器操作数的类型。 格式: 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 功能:用于定义变量,用变量和存储单元相联系,为变量分配内存单元 DB-字节类型 DW-字类型 DD-双字类型 DQ-四字类型 DT-五字类型,格式中操作数的形式: 1、一个或多个常数/数值表达式,DATA1 DB 30H DATA2 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,DATA7,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寄存器 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 段定义伪指令,汇编语言程序是按段来组织程序和数据的。 用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器。 三类段:代码(程序)、数据、堆栈 格式: 段名 SEGMENT 定位类型组合方式类别 段名 ENDS,功能:定义段名和段属性,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。,1)定位类型 说明如何确定逻辑段的边界。有四种: PARA: 16的倍数地址,地址低4位为零,默认值。 BYTE : 从任何地址开始。 WORD : 段的起始地址必须是偶数,地址低1位为0。 PAGE : 256的倍数地址,地址低8位为0。,2) 组合类型 说明不同模块中同名段的组合方式。 PUBLIC:所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中 COMMON:所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域 AT:指定段的起始地址,不能用于代码段 STACK:专用于说明堆栈段,组合方式同PUBLIC,3) 类别 用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。,1. 地址计数器$ 功能:指出汇编地址的偏移量,记载下一 个变量或指令在当前段中的偏移量 每个段开始时,$=0,随着汇编过程的进行而自动增值 $用于指令时,表示本条指令的第一个字节地址, $用于其他情况时,表示当前值 如:JNE $+6,转向JNE指令的首地址加6,5.2.4 地址计数器伪指令,格式:ORG 功能:定义指令或数据的起始地址(段内的偏移地址),把表达式的值送给$,表达式的值即为开始地址 例: ABC SEGMENT ORG 100H begin: ABC ENDS,2. 起始地址伪指令ORG,指令从100H开始存放,DATA SEGMENT ORG 200H DATA1 DB 12H,2+6,34H DATA2 DW 789AH DATA3 DW $, 6699H DATA 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,功能:指定段和段寄存器的关系,说明哪个段使用哪个段寄存器 格式:ASSUME 段寄存器名:段名,,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过程可由任何段中的程序调用(段间调用),类型:,5.2.7 汇编结束伪指令END,汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。 格式: END 表达式 END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。,DATA SEGMENT ;定义数据段 D1 DB 5 DUP(?) ;5个字节单元 CC EQU $D1 ; 单元的个数 SUM DW 0 ;累加结果放在SUM中 DATA ENDS ;数据段定义结束 STACK SEGMENT ;定义堆栈段 DB 100 DUP (?) ;100字节的栈空间 STACK ENDS ;堆栈段定义结束 CODE SEGMENT ;定义代码段 ASSUME DS:DATA,SS:STACK,CS:CODE ;对各段进行说明 BEGIN:MOV AX,DATA ; DS初始化为DATA MOV DS,AX MOV AX, STACK MOV SS, AX,多个连续字节单元的累加,LEA SI,D1 ;预置源数据的首地址 MOV CX,CC ;预置次数 CLD LODSB ;取一个数并修改SI MOV AH,0 ;清AX的高字节 CLC ;清CF位 AGAN:ADC SUM,AX ;累加 LODSB ;再取数并修改SI LOOP AGAN ;控制循环 MOV AH,4CH ;完成,返回DOS INT 21H CODE ENDS ;代码段结束 END BEGIN ;整个程序结束,调用DOS系统的4CH 功能, 返回DOS 方法: 在要返回DOS 处,安排指令: MOV AH, 4CH INT 21H 执行完4CH的功能调用,即返回DOS 。,例 code SEGMENT ASSUME CS: code start: 、 ;程序主体部分 、 、 MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,5.3 汇编语言程序设计基础,5.3.1 概述 1.汇编语言程序设计的步骤: 根据实际问题抽象出数学模型 确定算法 画出程序框图(流程图) 分配内存工作单元和寄存器 编程、调试,2.绘制程序流程图,(1)用方框表示工作框,(2)用菱形框表示判断框,N,Y,?,(4)各框之间用直线连起来表示程序走向。,(3)用 框表示调用子程序或过程。,3. 源程序的基本结构: 顺序、分支、循环、子程序,例:将某段中的字符串“Hello!”传送到另一段中(内存数据块的传送)。,5.3.2 顺序结构程序(顺序执行,无转移、无循环),aa SEGMENT ;数据段1 xx DB Hello! ;定义源串 aa ENDS bb SEGMENT ;数据段2 yy DB 6 dup (?) ; 定义目的串 bb ENDS cc 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 , AX 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 分支程序,标号1:,条件1成立 ?,P1,N,Y,2. 多种分支结构,条件2成立 ?,条件n成立 ?,Pn+1,标号2:,标号n:,标号n+1:,P2,Pn,N,N,Y,Y,用比较指令 CMP DEST,SRC JE EQUL EQUL: 用测试指令 TEST DEST,SRC JNZ NEXT NEXT: 用逻辑指令 SHR DEST,CL JC NEXT NEXT:,例:编程实现下列函数的功能,其中X、Y为无符号字节数。,(AL)=(BL)?,程 序,;- 数据段定义 - DAT SEGMENT X DB 242 Y DB 67 Z DB ? DAT ENDS ;- 代码段定义 - COD SEGMENT ASSUME DS: DAT, CS: COD START:MOV AX, DAT MOV DS, AX ; 初始化DS MOV AL, X MOV BL, Y,;- CMP AL, BL JE C1 ; (AL)(BL) 则跳转至C1 JA C2 ; (AL) (BL) 则跳转至C2 MOV AL, -1 JMP EXT C1: MOV AL, 0 JMP EXT C2: MOV AL, 1 EXT: MOV Z, AL MOV AH, 4CH INT 21H ; 返回DOS ;- COD ENDS END START,循环程序的组成:循环程序是在满足某些条件时对一段程序的重复执行,一般由四部分组成。,2. 基本结构形式 (1) 先执行后判断(dowhile) 至少执行一次循环体,(2) 先判断后执行 循环体可能一次都不 执行,5.3.4 循环程序,初始化,循环体,循环控制,继续循环?,Y,N,初始化,循环体,循环控制,继续循环?,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 SEGMENT BLOCK DB 100,60,20, MAX DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA H1: MOV AX, DATA MOV DS, AX MOV CX,9 MOV AL,BLOCK LEA BX,BLOCK,AGAIN:INC BX CMP AL,BX JAE NEXT XCHG AL,BX NEXT:LOOP AGAIN MOV MAX,AL CODE ENDS END H1,DATA SEGMENT ARRAY DB 66H,88H,10H, DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS:AX MOV DI,9 LOOP1:MOV CX,DI MOV BX,0 LOOP2:MOV AL ,ARRAYBX CMP AL,ARRAYBX+1 JGE NEXT,XCHG AL,ARRAYBX+1 MOV ARRAYBX,AL NEXT:INC BX LOOP LOOP2 DEC DI JNZ LOOP1 CODE ENDS END START,例: 将内存首地址为ARRAY开始的10个带符号字节数,将其按由大到小的次序排列。,子程序:重复使用的程序段或具有通用性便于共享的 程序段 1.调用子程序用CALL指令,返回调用程序用RET指令 2. 现场的保护和恢复 现场:指转向子程序执行时主程序的状态,包括当时标志寄存器、段寄存器、通用寄存器的内容 主程序和子程序的设计是分开进行的,为保证主、子程序所使用的寄存器不会发生冲突,进入子程序时要保护主程序的运行状态和使用的寄存器内容(保护现场),退出子程序前要恢复现场。 现场的保护和恢复分别用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, 段内返回 格式 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 SEGMENT NUM DW 25AFH ;要转换的十六进制数 STRING DB 4 DUP(?) DATA ENDS,STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA BX,STRING;取变量偏址 PUSH BX ;将偏址压栈 PUSH NUM ;将变量压栈,BH,BL,0064H,0062H,(SP),25,AF,0060H,堆栈,CALL BINHEX MOV AH,4CH INT 21H ;* BINHEX PROC PUSH BP MOV BP,SP PUSH AX PUSH DI PUSH CX PUSH DX,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 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),POPF POP DX POP CX POP DI POP AX POP BP RET 4 BINHEX ENDP ;* HEXD PROC CMP AL,0AH JL LP ADD AL,7 LP: ADD AL,30H RET HEXD ENDP CODE ENDS END BEGIN,0064H,0062H,0060H,005EH,005CH,BH,BL,25,AF,(BP),(SP),IPH,IPL,从本例可知,通过堆栈传递的两个参数分别为:变量NUM的内容25AFH和变量STRING的偏移地址。这两个参数在调用子程序之前压入堆栈,当CALL指令返回时,其(SP)=0060H,不是初值0064H。故采用带参数返回指令RET 4。 本例重点掌握: 进一步了解堆栈的使用 BP的作用 学会RET n的应用 子程序嵌套,例: 将一个2位压缩BCD码转换成二进制数. DATA SEGMENT MUL BH BCD DB 01011001B ADD AL,BL BIN DB ? MOV BIN,AL DATA ENDS CODE ENDS CODE SEGMENT END MM ASSUME CS:CODE, DS:DATA MM: MOV AX,DATA MOV DS,AX MOV AL,BCD MOV BL,AL AND BL,0F H AND AL,0F0H MOV CL,4 ROR AL,CL M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 滑板礼仪知识培训
- 顶棚清洗施工方案模板
- 烧伤患者的液体管理
- 盐碱地绿化施工方案
- 益阳医学高等专科学校《环境工程土建基础》2023-2024学年第二学期期末试卷
- 上海纽约大学《临床输血学检验技术》2023-2024学年第一学期期末试卷
- 天然水源治理方案范本
- 《优化客户交流的艺术》课件
- 西安电子科技大学长安学院《信息系统分析与设计实验课》2023-2024学年第二学期期末试卷
- c级危房加固施工方案
- 2025年重庆中考押题道德与法治试卷(一)(含答案)
- 肿瘤的内分泌治疗护理
- 东北三省三校2025届高三下学期第二次联合模拟考试数学试题及答案
- 污水管道封堵施工方案
- 2025年山东鲁泰控股集团有限公司下属驻陕西煤矿企业招聘(150人)笔试参考题库附带答案详解
- 2025届上海市浦东新区高三二模英语试卷(含答案)
- 2025年全民国家安全教育日主题班会
- 2025-2030彩色不锈钢项目可行性研究报告
- 开曼群岛公司法2024版中文译本(含2024年修订主要内容)
- 【MOOC】航空燃气涡轮发动机结构设计-北京航空航天大学 中国大学慕课MOOC答案
- 工程变更通知单ECN模板-20220213
评论
0/150
提交评论