微机原理 8086汇编程序设计.ppt_第1页
微机原理 8086汇编程序设计.ppt_第2页
微机原理 8086汇编程序设计.ppt_第3页
微机原理 8086汇编程序设计.ppt_第4页
微机原理 8086汇编程序设计.ppt_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1/96,主要内容: 一、汇编语言语句格式 二、汇编语言伪指令 三、汇编语言源程序的汇编与连接 四、汇编语言程序设计的基本方法,汇编语言程序设计,2/96,本讲重点: 伪操作 汇编语言程序格式 简单汇编程序设计,汇编语言程序设计,3/96,一、汇编语言语句格式,汇编语言语句有指令性语句、伪指令语句和宏指令语句三种类型。 1、指令性语句: 标号: 操作码 操作数 ;注释 是机器指令的符号表示,经汇编产生对应的机器指令代码,在形成执行文件时执行。 2、伪指令语句: 名字 伪指令助记符 操作数 ;注释 只是给汇编程序提供一些控制信息,帮助汇编程序正确汇编指令性语句,没有对应的机器码。 说明:名字可以

2、是符号常量名、变量名、过程名、段名等,名字后面不能有“:”。 伪指令命令助记符共有40多个,按功能不同分成八类。操作数之间须用逗号分隔。 3、宏指令语句:宏名 宏操作助记符 操作数 ;注释 是指令性语句和指示性语句的复合体,在汇编时被展开。 说明:宏名即宏指令名,是一标识符,宏名后面不能有“:”。 宏操作助记符有MACRO、ENDM、LOCAL、REPT、IRP、PURGE等8个。,汇编程序不区分大小写,4/96,汇编语言语句统一格式规定,指令性语句、伪指令语句和宏指令语句的统一格式: 名字项 操作项 操作数项 ;注释项 1.名字项:最多由21个字符组成。可由下列字符组成。 字母AZ、az 数

3、字09 特殊符号?、 、 、 、$等 注意: 名字项的第一个字符不可以是数字,必须是字母或特殊字符,但是问号本身不能单独作为名字; 如果用到特殊符号,则它必须是首字符。 汇编语言的专用保留字、寄存器名、8088/8086汇编语言中的指令助记符、伪指令名、表达式中使用的运算符和属性运算符等均不能作为名字项,否则汇编会给出错误信息; 名字项在程序中不能重复定义。,5/96,(1) 段属性:可用SIG伪指令求出 此属性用于定义标号和变量的段起始地址。标号通常在代码段CS中定义,变量通常在DS、ES和SS段中定义。 (2) 偏移属性:可用OFFSET伪指令求出 此属性指出标号或变量距离段起始地址的字节

4、数,它是一个16位的无符号数。 (3) 类型属性:可用TYPE伪指令求出 对标号而言,此属性指出其引用类型,段内引用属于NEAR类,指针长度为2字节;段间引用属于FAR类,指针长度为4字节。对变量而言,此属性指出其字节长度,可为1、2、4、8、10个字节。,名字项属性,6/96,2.操作项,可以是指令、宏指令、伪指令的助记符。 【例】LOOP: MOV AX , BX BUFFER DB 1,2,3,4,5,6,7 ;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为17,BUFFER表示首地址,7/96,3. 操作数项,操作数项可以由常量、寄存器、标号、变量或表达式等组成。 (1)常

5、量 常量是没有属性的纯数,其数值在汇编过程中被确定,并在程序运行时保持不变。分为数值常量和字符型常量。,各种形式数字常量格式对照表,8/96,字符串常量,字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASC码表示的。如A用41H 表示,字符串A1B2用41H,31H,42H,32H表示。,9/96,常数项举例,例5.2 SUB DH,22;常数22为立即数,汇编后为16H MOV BX,SI十32H;常数32H作位移量 DB12H;定义一个字节数据 DW1234H;定义一个字数据 DD12345678H;定义一个双字数据 DB 9BD;定义三个字节的字符串数据,在

6、内存中就是39H、42H、44H,10/96,(2)表达式及运算符,算术运算符 移位运算符 逻辑运算符 关系运算符 分析运算符 综合运算符,表达式由常数、寄存器、标号、变量与一些运算符组合而成,分为数字表达式和地址表达式。汇编过程中,汇编程序按照一定的优先规则,对表达式进行计算后得到一个数值或地址,用作指令的操作数。,11/96,算术运算符: (加)、(减)、*(乘)、(除)、MOD(求模) 移位运算符: SHL(左移)、SHR(右移) 可以用于数值表达式又可用于地址表达式。,算术运算符和移位运算符,12/96,【例】 算术和移位运算符进行数值表达式运算, NUM1EQU25*4 50;NUM

7、1=50 NUM2EQUNUM1 / 7;NUM2=7 NUM3EQUNUM1 MOD 7;NUM3=1 NUM4EQU0FH MOVAL,NUM4 SHL 4 ;(AL)=11110000B,13/96,与(AND)、或(OR)、异或(XOR)、非(NOT)四种运算。 由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。 【例】 用逻辑运算符进行运算。 MOVAL,34H AND 0FH ;04HAL MOVBL,05H OR 30H ;35HBL MOVCX,NOT 00FFH ;0FF00HCX MOVDX,789AH XOR 000FH ;7895HDX,逻辑运算符

8、,14/96,相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。 运算结果成立时逻辑值为真,用0FFFFH表示; 关系不成立时逻辑值为假,用0表示。 【例】用关系运算符进行数值表达式运算。 NUM1EQU10 LT 5 ;NUM1=0 NUM2EQU0AAAAH GT 7FFFH ;NUM2=0FFFFH MOVAX,A EQ 41H;0FFFFHAX MOVBX,NUM2 LT NUM1;0BX,关系运算符,15/96,把标号或变量所指存储器地址的属性(段、偏移量和类型)或一些特征分离出来,作为操作数使用。主要介绍3个: SEG 运算符 OFFSET

9、运算符 TYPE运算符,分析运算符号,16/96,格式:SEG 变量或标号 功能:分离出其后变量或标号所在段的段首址。 【例】已知数据段从存储器的23000H地址开始,DBUF是该段中的一个变量名。 MOV BX,SEG DBUF 汇编为: MOV BX,2300H, SEG 运算符,17/96,格式:OFFSET 变量或标号 功能:分离出其后变量或标号的偏移地址。 【例】已知标号START的段地址为2100H,物理地址为21200H。 MOV DX,OFFSET START 汇编为: MOV DX,0200H 这条指令与指令 LEA DX,START功能相同。, OFFSET 运算符,18/

10、96,格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见下表所示。, TYPE运算符,【例】已定义 ARRAY DB 22,33 指令 ADD SI,TYPE ARRAY汇编为: ADD SI,1,19/96, 段属性前缀运算符“” 格式为: 段寄存器名地址表达式 或 段名地址表达式 或 组名地址表达式 此运算符用来表示一个标号、变量或地址表达式的段属性。 【例】用段前缀指定附加段内操作数的地址 MOV AL,ESDATA ;指令源操作数在附加段DATA地址单元中,(5)综合运算符,20

11、/96, LOW和HIGH 格式为: LOW 表达式 或 HIGH 表达式 此运算符用于对一个16位数据或地址表达式,用HIGH取其高位字节、LOW取其低位字节。所以此运算符又称为字节分离运算符。 【例】已知 RESULT EQU 7788H 则MOV AH , HIGH RESULT 汇编为:MOV AH,77H MOV AL , LOW RESULT 汇编为: MOV AL,88H,(5)综合运算符,21/96,本节介绍了几种常用的运算符。为了正确计算表达式的数值,应该按照运算符的优先级: 先高后低、自左向右(优先级相同时)地进行计算。括号内的表达式应优先计算。 下面给出相关运算符 从高到

12、低的优先级排列顺序:,表达式及运算符小结,22/96,(在圆括号中的项),方括号中的项,结构变量(变量、字段) LENGTH,SIZE、WIDTH和MASK PTR,OFFSET,SEG,TYPE,THIS及段运算符 HIGH和 LOW *,MOD,SHL(左移),SHR(右移) +,- EQ,NE,LT,LE,GT,GE NOT AND OR,XOR SHORT,表达式及运算符小结,23/96,4.注释项,一行语句分号后面的内容,主要用来说明程序或语句功能,增加程序的可读性。对于较大的程序,注释项更不能缺少。 分号(;)放在语句后,用来说明该语句的功能; 分号放在某一行的开头,用来说明下面一

13、段程序的功能; 分号加到指令前,可暂时冻结有疑问的指令,调试正确后,再把这些指令解冻或删除,这样可减少语句增、删的编辑工作。,24/96,MOV CX,0;传送指令,具有2个操作数 DELAY:NOP ;空操作指令,没有操作数,带有标号 LOOP DELAY;循环指令,标号DELAY说明转移位置 BUFFER DB 1,2,3,4,5,6,7 ;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为17,BUFFER表示首地址,汇编语言语句实例,25/96,本节小结,汇编语言指令格式 名字项 操作项 操作数项 ;注释项 标号和变量的属性: 段属性、偏移属性、类型属性 操作数的表达形式 算术

14、、移位、逻辑、关系、属性、综合运算符,首页,26/96,二、汇编语言伪指令,伪指令:在汇编程序对源程序汇编期间由汇编程序处理的操作(不是真正执行的指令),可以完成处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。 常用伪指令:,处理器选择伪指令; 段定义伪指令 程序开始与结束伪指令; 数据定义与存储器分配伪指令;,赋值伪指令; 地址计数器与对准伪指令; 基数控制伪指令; 偶地址对准伪指令;,27/96,1.处理器选择伪操作,.8086 选择 8086 指令系统 .286 选择 80286 指令系统 .286P 选择保护模式下的 80286 指令系统 .386 选择 80386

15、 指令系统 .386P 选择保护模式下的 80386 指令系统 .486 选择 80486 指令系统 .486P 选择保护模式下的 80486 指令系统 .586 选择 Pentium 指令系统 .586P 选择保护模式下的 Pentium 指令系统,一般放在整个程序的最前面。默认值为.8086,28/96,2.段定义伪指令,完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位

16、于任一段内 通常,程序还需要一个堆栈段,29/96,2.段定义伪操作,源程序分别用两种格式书写 第一种格式从MASM 5.0开始支持 简化段定义格式 第二种格式MASM 5.0以前就具有 完整段定义格式,Hello, Everybody !,30/96,;EXAMPLE5.42;程序注释 ;数据段说明 2 DATA SEGMENT;数据段 3 DATA ENDS ;堆栈段说明 STACK SEGMENT PARA STACKSTACK;堆栈段 5 STACK ENDS ;代码段说明 6 CODE SEGMENT;代码段 7 START PROC FAR; 远过程调用定义 8ASSUME CSC

17、ODE,DSDATA,ESDATA,SSSTACK,完整段定义伪操作基本格式(1),31/96,9 PUSH DS ;保存返回地址 10 MOV AX , 0 11PUSH AX 12MOV AX , DATA ;初始化DS,ES 13MOV DS , AX 14MOV ES , AX ;自己编写的程序 ; 15RET;返回DOS 16START ENDP ; 17 CODE ENDS;代码段结束 ; 18 END START;汇编到此结束,32/96,;EXAMPLE5.42;程序注释 ;数据段说明 2 DATA SEGMENT;数据段 3 DATA ENDS ;堆栈段说明 STACK SE

18、GMENT STACK ;堆栈段 5 STACK ENDS ;代码段说明 6 CODE SEGMENT;代码段 8ASSUME CSCODE,DSDATA,ESDATA,SSSTACK,完整段定义伪操作基本格式(2),33/96,12 START: MOV AX , DATA ;初始化DS,ES 13 MOV DS , AX 14 MOV ES , AX ;自己编写的程序 ; 15 MOVAH,4CH;用DOS调用功能返回操作系统 16 INT21H ; 17 CODE ENDS ; 18 END START,34/96,;lt401b.asm(文件名) stacksegment stack;

19、定义堆栈段 dw 512 dup(?) ;堆栈段有512字(1024字节)空间 stackends;堆栈段结束 datasegment;定义数据段 stringdb Hello, Everybody !,0dh,0ah,$ dataends codesegment code;定义代码段 assume cs:code,ds:data,ss:stack start:mov ax,data;建立DS段地址 mov ds,ax,【例】完整段定义格式举例,35/96,mov dx,offset string ;显示字符串 mov ah,9 int 21h mov ax,4c00h int 21h;利用功

20、能调用返回DOS codeends;代码段结束 end start ;汇编结束,同时指明程序起始点,【例】完整段定义格式举例(续),36/96,;SampleC.ASM .model small;存储模型(各段在存储器中的存放方式) .stack 100H;定义堆栈段 .data .;在数据段定义数据 .code start:mov ax,data mov ds,ax .;在代码段填入指令序列 mov ax,4c00h int 21h .;子程序代码 end start,简化段定义格式( MASM 5.x支持),37/96,;lt401a.asm(文件名) .model small;定义程序的

21、存储模式 .stack;定义堆栈段 .data;定义数据段 stringdb Hello, Everybody !,0dh,0ah,$ ;在数据段定义要显示的字符串 .code;定义代码段 start:mov ax,data ;程序起始点,建立DS、SS mov ds,ax mov dx,offset string;指定字符串 mov ah,9 int 21h;利用功能调用显示信息 mov ax,4c00h;程序结束点,返回DOS int 21h end;汇编结束,【例】简化段定义格式举例( MASM 5.x支持),38/96,;SampleA.ASM .model small .stack

22、.data .;在数据段定义数据 .code .startup ;(定义程序初始入口点) .;在代码段填入指令序列 .exit 0 ;(返回操作系统) . ;子程序代码 end ;(源程序结束),简化段定义格式( MASM 6.x支持),注意: 简化段定义比完整段格式简单得多。但完整段定义可以全面地说明段的各种类型与属性,因此在很多情况下仍需使用。,39/96,(1)程序开始伪指令 此指令指明程序模块的开始,并定义模块名。 指令格式: NAME 模块名 或 TITLE 标题名 程序中若缺省该伪指令,则取TITLE语句中的页标题前6个字符;若没有TITLE语句,则取源程序文件名为模块名。 (2)

23、源程序结束伪指令 此指令指明汇编语言程序模块的结束。 指令格式: END 标号 标号指示程序的起始地址。多个程序模块连接时,只有主程序需要使用标号,其他子程序模块则不必指定标号。,3. 程序开始和结束伪指令,40/96,4.数据定义及存储器分配伪指令,指令格式:变量名 助记符表达式; 注释 功能:从变量名所代表的地址单元开始定义数据存储区,类型由数据定义伪指令确定,。 变量名DB表达式;定义字节变量。 变量名DW表达式;定义字变量。 变量名DD表达式;定义双字变量。 变量名DQ表达式;定义四字变量。 变量名DT表达式;定义十字节变量。,41/96,表达式项是给变量或指定存储单元赋予初值,它有以

24、下几种形式: (1)数值表达式 (2) 字符串表达式:以单引号括起,存放为ASCII码 (3 ) ? 表达式:保留存储空间,但不存入数据 (4)带DUP的表达式:数组表达式,4.数据定义及存储器分配伪指令表达式的形式,42/96,【例】操作数为常数或表达式,DATA_BYTE DB15,8,15H DATA_WORD DW 200,200H,-10 DATA_DW DD 4*30,0AFFDH,43/96,【例】操作数为字符串,STR1 DB Hello STR2 DB ABC STR3 DW AB,CD,注意:不能写成 DB ABCD,44/96,【例】操作数为?,CNT1 DB 0,?,?

25、,0 CNT2 DW ?,100,?,注意:?为系统保留单元,一般系统填充为00H,45/96,【例】DUP的使用,DA1 DB 2 DUP (5,6) ; 从DA1地址单元开始存放二组“05H,06H”共4个地址单元 DA2 DW 40 DUP(?) ; 从DA2地址单元开始保留40个字共80个地址单元 DA3 DB 2 DUP(1,2 DUP(3),4) ;从DA3地址单元开始存放2组“01,03,03,04”,共占用8个地址单元。,46/96,datasegment;数据段 Xdb a,-5 db 2 dup(100),? Ydb ABC dataends,字节单元定义实例,应用,47/

26、96,LEA AX , X ; AX0000H,在数据定义伪指令前面的变量的值,是该伪指令中的第一个数据项在当前段内的第一个字节的偏移地址。 MOV AL,X ;此处X表示它的第1个数据,故ALa DEC X+1 ;对X为始的第2个数据减1,故成为-6 MOV Y,AL ;现在Y这个字符串成为 aBC,字节变量的应用,48/96,5.表达式赋值伪操作,利用一个标识符表达的一个数值。MASM提供等价机制,用于常量定义 等价EQU伪指令 符号名 EQU 数值表达式 符号名 EQU 等号=伪指令 符号名 = 数值表达式 常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性,EQU和

27、=的区别: EQU伪操作中的标号名是不允许重复定义的; “=” 伪操作是允许重复定义的。,49/96,表达式名 EQU 表达式 ALPHA EQU 9 BETA EQU ALPHA+18 BB EQU BP+8 “ = ” 伪操作 (允许重复定义) EMP = 7 EMP = EMP+1 , 表达式赋值伪操作:,50/96,符号定义 DosWriteChar equ 2 CarriageReturn = 13 CallDOS equ 符号应用(左边程序段等价右侧的符号形式) mov ah,2;mov ah,DosWriteChar mov dl,13;mov dl,CarriageReturn

28、 int 21h;CallDOS,符号常数实例,51/96,6.地址计数器与对准伪操作,定位伪指令控制数据的偏移地址 ORG 参数 ;将当前偏移地址指针指向参数表达的偏移地址: ORG 100h;从100h处安排数据或程序 ORG $+10 ;使偏移地址加10,即跳过10个字节空间 MASM中,符号“$”表示当前偏移地址值 EVEN;从偶地址开始 ALIGN n;从n的整数倍地址开始,52/96,org $+10 arraydb 45,45h .code mov ax,seg array mov ds,ax mov bx,offset array ;等价于 lea bx,array mov c

29、l,array+4 ;等效于 mov cl,array4 mov ax,es:2000h,地址操作符实例,53/96,ARRAY DW 1, 2, + 4, 3, 4, + 4假设汇编时ARRAY 分配的偏移地址为0074H,则汇编后,+ 4所在的两个字单元: (ARRAY+4)=0078+4=007CH(ARRAY+0A)=007E+4=0082H,地址操作符实例,54/96,1. 设X和X+2单元的内容为双精度数P,Y和Y+2单元的内容为双精度数Q,X、Y为低位字。下列程序段使2PQ时(AX)1,2P=Q时(AX)2。请将程序段填写完整。MOV DX,X2MOV AX,XADD AX,XA

30、DC DX,X2CMP DX,Y2 L2 L1CMP AX,Y L2L1: MOV AX,1JMP EXITL2: MOV AX,2EXIT:,JL,JG,JLE,55/96,2. 假设程序中的数据定义如下, PARTNO DW ?PNAMEDB 16 DUP(?)COUNTDD ?PLENTH EQU $-PARTNO问PLENTH的值为多少?,56/96,3. 给出赋值语句如下:ALPHA EQU 100BETA EQU 25GAMMA EQU 2下列表达式的值是多少? (1) ALPHA * 100 + BETA(2) ALPHA MOD GAMMA + BETA(3) ( ALPHA+

31、2 ) * BETA - 2(4) ( BETA/3 ) MOD 5(5) ( ALPHA+3 ) * ( BETA MOD GAMMA ) (6) ALPHA GE GAMMA(7) BETA AND 7(8) GAMMA OR 3,57/96,4. 对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?FLDB DB ?TABLEA DW 20 DUP(?)TABLEB DB ABCD(1)MOV AX, TYPE FLDB (2)MOV AX, TYPE TABLEA(3)MOV CX, LENGTH TABLEA(4)MOV DX, SIZE TABLEA(5)MOV

32、CX, LENGTH TABLEB,58/96,本节小结,本节重点掌握: 1)DB、DW、DD、DQ、DT功能 2)EQU、ORG、END、EVEN伪指令功能 3)段定义伪指令SEGMENT/ENDS 4)过程定义伪指令,作业:P142 5,6,10,11,首页,59/96,四、 简单汇编语言程序设计,一、顺序程序设计 计算机执行程序的方式是“从头到尾”,逐条顺序执行指令语句,直到程序结束。,例5.1:把BUF开始的两个字节单元中的压缩BCD数相加,结果存入字单元RES中。 NAME EXAM1 DATA SEGMENT BUF DB 89H,34H RES DW? DATA ENDS COD

33、E SEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX,LEABX,BUF MOVAL,BUF ;取加数 ADDAL,BX+1 ;做二进制加法 DAA ;调整为十进制结果 LAHF ;(AH)(PSW低字节) ANDAH,01H;取CF位 MOVRES,AX;存结果 MOVAH,4CH INT21H CODE ENDS ENDSTART,60/96,1. 顺序程序设计,例:试编写一程序计算以下表达式的值。 =(v-(*+-540)/x 式中x、v均为有符号字数据。 设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图4

34、.1所示。,图4.1 顺序运算程序流程图,61/96,DATA SEGMENT ;数据段 XDW200 YDW100 ZDW3000 VDW10000 WDW2 DUP(?) DATA ENDS STACK SEGMENT STACK ;堆栈段 DB 200 DUP(0) STACKENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,例:源程序(1):,62/96,START: MOVAX,DATA MOVDS,AX;DATAAX,指定数据段段名 MOVAX,X IMULY ;(X)*(Y)DX:AX MOVCX,AX MOVBX,DX ;(DX

35、:AX)(BX:CX) MOVAX,Z CWD ;(Z)符号扩展,在(DX:AX) ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540(BX:CX) MOVAX,V,例:源程序(2):,63/96,CWD;(V)符号扩展 SUB AX,CX SBB DX,BX ;(DX:AX)-(BX:CX)(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX;商W MOVW+2,DX;余数DXW+2 MOVAH,4CH;返回DOS INT 21H CODE ENDS;ENDSTART,例:源

36、程序(3):,64/96,2. 分支程序设计,在设计中经会遇到判断“相等”和“不相等”、“负”和“正”、 “满足条件”和“不满足条件”等等。 例5.3:将内存中以STRI1为首址的50个字节单元中的数据传送到以STRI2为首址的50个单元中。 分析:根据源数据块与目的数据块位置的不同,可分为两种情况: 1)源数据块的首址高于目的数据块的首址,考虑到两块部分没重叠,用增址方式传送; 2)源数据块的首址低于目的数据块的首址,考虑到有可能两块部分重叠,用减址方式传送。程序流程图见4.2所示。,65/96,2. 分支程序设计,66/96,2. 分支程序设计方式(1),NAME EXAM3;将内存中以S

37、TRI1为首址数据传送到以STRI2为首址的单元 DATA SEGMENT STRI DB200 DUP(?) STRI1 EQU STRI+30 STRI2 EQU STRI+70 COUNT EQU 50 DATA ENDS STACK SEGMENTPARA STACK STACK STAPN DB100 DUP(?) TOP EQULENGTH STAPN STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START:MOVAX,DATA MOVDS,AX;数据段地址装填 MOVES,AX;附加段地址装填 M

38、OVSP,TOP;送堆栈指针 MOV CX,COUNT;送字节数 MOV SI,OFFSET STRI1;送STRI1地址指针 MOV DI,OFFSET STRI2;送STRI2地址指针,CMP SI , DI ; 从首址开始? JA A2 ; 是,转移 ADD SI , CX ; 否,以末地址开始搬家 ADD DI , CX DEC SI DEC DI A1: MOV AL , SI ; 从首址开始搬家 MOV DI ,AL DEC SI DEC DI DEC CX JNE A1 JMP A3 A2: MOV AL,SI MOV DI,AL INC SI INC DI DEC CX JNE

39、 A2 ;未完,继续 A3:MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,67/96,2. 分支程序设计方式(2):串操作,NAME EXAM3;将内存中以STRI1为首址数据传送到以STRI2为首址的单元 DATA SEGMENT STRI DB 200 DUP(?) STRI1 EQU STRI+30 STRI2 EQU STRI+70 COUNT EQU 50 DATA ENDS STACK SEGMENTPARA STACK STACK STAPN DB100 DUP(?) TOP EQULENGTH STAPN STACK ENDS COD

40、E SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START:MOVAX,DATA MOVDS,AX;数据段地址装填 MOVES,AX;附加段地址装填 MOVSP,TOP;送堆栈指针,MOV CX,COUNT;送串长 MOV SI,OFFSET STRI1;送STRI1地址指针 MOV DI,OFFSET STRI2;送STRI2地址指针 CLD ;正向 CMP SI,DI ;两串首地址比较 JA RES ;(SI)(DI),转移 ADD SI,COUNT-1;源块尾址 ADD DI,COUNT-1;目的块尾址 STD ;反向 RES:REP

41、MOVSB;数据块传送 MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,68/96,3. 循环程序设计,循环程序是强制计算机重复执行某一指令系列的一种程序结构形式。 1、循环程序的构成 循环初始部分:为进入循环做必要的准备工作; 循环体:是程序中重复执行的程序段 循环控制部分:为进入下一次循环,修改地址指针、计数器内容等项参数;检测循环是否已执行了规定的次数,从而确定继续循环还是结束循环。 循环结束部分:进行循环之后的处理。,69/96,3. 循环程序设计,2、控制循环次数的方法: 1)计数控制循环:对于循环次数已知的程序,或是在进入循环前可由某变量确

42、定循环次数的程序,通常用计数器来控制循环。 例5.4:把BUF开始的10个字节单元中的二进制数据累加,求得的和放到RES字单元。,70/96,例:计数控制循环,NAMEEXAM5 DATASEGMENT BUF DB 1,4,9,5,21,64,12,6,10,23 RESDW ? DATAENDS STACKSEGMENT PARA STACK STACK DB 100 DUP(?) STACKENDS CODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX,MOV AX,0;AL清0 MOV CX,0

43、AH;置计数器初值 MOV BX,OFFSET BUF;置地址指针 LP:ADD AL,BX;取一个数累加到AL上 ADC AH,0 INC BX;地址加1 LOOP LP;不为0,循环 MOV RES,AX;传送结果 MOV AH,4CH ;返回DOS INT 21H CODEENDS,71/96,例:条件控制循环,2)用条件控制循环:适用于某些循环次数未知的程序,或循环次数可变的程序,可以由问题给出的条件控制循环结束。 例5.5:编制程序 使S=1+2*3+3*4+4*5+N*(N+!),直到N*(N+!)项大于200为止。,72/96,例: 条件控制循环,CMP AX,00C8H ;和数

44、大于200? JNA A1 ;不大于,继续 A2: INT 03H ;单步中断 CODE ENDS END START,STACK SEGMENG STACK DW 64 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, 0001H MOV BL, 02H A1: MOV AL,BL INC BL MUL BL;(AL)*(BL) ADD DX,AX;保存和数,73/96,4. 子程序设计,子程序是具有独立功能的程序模块,可供程序其它地方需要时调用。在汇编语言中,子程序又称过程。 子程序的执行过程: 保护现场(一些将在子

45、程序运行时将要被破坏的寄存器的内容)。 依入口参数从指定位置取要加工处理的信息。 加工处理。 依出口参数向指定位置送经加工处理后的结果信息。 返回调用程序。,74/96,(1) 子程序(过程)的定义,指令格式: 过程名 PROC NEAR 或 FAR 过程名 ENDP 注意: 1)PROC和ENDP必须成对使用。 2)过程名是自定义符,可以作为标号被指令CALL调用。 调用格式: CALL 过程名 3)过程由RET指令返回,返回调用程序的操作与过程的属性有关。NEAR型过程属于段内调用,则RET是段内返回;FAR型过程属于段间调用,RET是段间返回。系统设定的缺省类型为NEAR。,75/96,

46、(2)子程序应用举例,例5.6 求无符号字节序列中的最大值和最小值。 设有一字节序列,其存储首址为BUF,字节数为COUNT。利用子程序的方法编程求出该序列中的最大值和最小值。,76/96,例: 程序清单:,;出口:(AH)=大数;(AL)=小数 NAMESHIYAN4 DATASEGMENT BUF DB 1,4,9,5,21,64,12,6,10,23 COUNTEQU 10 DATAENDS STACK SEGMENT STACK DW 64 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE;DS:DATA;SS:STACK START:MOV

47、 AX, DATA MOV DS, AX LEA SI,BUF MOV CX,COUNT CALL BRANCH ;调用判断最大和最小值的子程序 INT 03H,BRANCH PROC NEAR JCXZ A4;(CX)=0则退出 PUSH SI;保护现场 PUSH CX PUSH BX MOV BH,SI ;取源数据到BH中 MOV BL,BH ;存入BL中 A1:LODSB;取SI指向的单元中的数据到AL中 CMP AL,BH ;AL和BH中的数据比较 JBE A2 ;(AL)(BL),则转移 MOV BL,AL;存小数到BL中 A3:LOOP A1;比较完否? MOV AX,BX ;大数

48、存AH中,小数存AL中 POP BX;恢复现场 POP CX A4:RET BRANCH ENDP CODE ENDS END START,77/96,本节小结,汇编语言程序结构一般分为顺序、分支、循环和子程序几种。 分支程序一般根据有条件转移指令进行转移判断,根据条件可以形成二分支及多分支转移。 循环程序要注意循环的条件的选择,一般有计数器控制和条件控制两种循环模式。串操作是循环的一种简便模式。 学习中要多参考例题,多模仿,多训练,首页,78/96,5. 宏指令,5.4.1 宏定义伪指令 汇编语言程序设计中,当多处使用一组功能相同的程序段,而只是每次参与操作的参数不同时,就可以用宏指令将这段

49、程序定义为一个宏名字。宏名可以当作指令使用,汇编过程中,汇编程序将它所代表的源程序重现在宏名字处。 1. 宏定义 用于将程序中重复出现的一组语句定义为一条宏指令,并确定形式参数。指令格式如下: 宏指令名 MACRO 形式参数1, 形式参数2 , 宏体 ENDM,79/96,注意:宏指令名是用户自定义符号,它可以作为一条指令,直接用在汇编语言程序中。形式参数是可选项,简称形参或哑参数。宏体是一段可重复引用的指令序列。宏指令必须先定义后调用。宏定义可以嵌套。 例5.31用宏指令定义两个字节数相加,结果存入RESULT单元的操作。 宏定义: ADDM MACRO OPR1,OPR2,RESULT ;形参是OPR1,OPR2,RESULT MOV AL , OPR1 ADD AL, OPR2 MOV RESULT,AL ENDM,(1) 宏定义,80/96,宏调用:在汇编语言程序中,使用宏指令称为宏调用。 宏调用格式为: 宏指令名 实在参数1 , 实在参数2 , 宏展开:源程序汇编时,在引用宏名

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论