版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言指令到机器指令的示意图
4.1.1汇编语言源程序的结构数据段名SEGMENT ……数据段名ENDS附加数据段名SEGMENT ……附加数据段名ENDS堆栈段名SEGMENT ……堆栈段名ENDS代码段名SEGMENT ……代码段名ENDS END每段以SEGMENT语句开始整个程序以END语句结束以ENDS语句结束下面举例来加以说明:这是一个两个字相加的程序
DSEGSEGMENT
;定义数据段
DATA1DW0F865H;定义被加数
DATA2DW360CH;定义加数
DSEGENDS
;数据段结束
ESEGSEGMENT
;定义附加段
SUMDW2DUP(?);定义存放结果区
ESEGENDS
;附加段结束
CSEGSEGMENT
;定义代码段
ASSUMECS:CSEG,DS:DSEG,ES:ESEGSTART:MOVAX,DSEGMOVDS,AX;初始化DSMOVAX,ESEGMOVES,AX;初始化ESLEASI,SUM;存放结果的偏移地址送SIMOVAX,DATA1;取被加数
ADDAX,DATA2;两数相加
MOVES:[SI],AX;和送附加段的SUM单元中
HLT
CSEGENDS
;代码段结束
ENDSTART
;源程序结束总结:1、标号域语句中的标号是一个标示符,表示一条指令所在的存储单元的地址,或叫符号地址。2、操作码域:所有指令的助记符、伪指令等都在操作码域。3、操作数域:操作数以逗号间隔。操作数可以是常数、寄存器、标号、变量、表达式。4、注释域:说明。4.1.2汇编语言语句类型语句类型:指令性语句、指示性语句指令性语句由指令组成、CPU可以执行;指示性语句用来告诉编译程序MASM如何对源程序进行汇编,它不生成目标代码,不由CPU执行,所以常称为伪操作指令;例如:START:MOVAX,DATA DATADB11H,12H,13H标号指令的符号地址,后边通常加上“:”START是指令性语句的标号;名字通常表示变量名、段名和过程名,后不加“:”指示性语句中的操作数可以有多个,相互之间用逗号分开,DATA是指示性语句的名字。4.1.3数据项及表达式操作数可以是寄存器、存储器单元或数据项。存储器可以按字节、字、双字DoubleWord、四字QuadWord、十字节操作。而数据项又可以是常量、标号、变量或表达式。1、常量:分为数字常数和字符串常数。B:二进制D:十进制,可以省略H:十六进制字符串常数用‘’单引号括起来,编译程序将其翻译成ASCII码。
2.标号Label指令的标号由程序员确定:不能与指令助记符或伪指令重名;不允许由数字打头;字符个数不超过31个;标号代表存放一条指令的存储单元的地址;标号可以作为程序转移、过程调用、循环控制等指令的操作数;标号有三种属性:段、偏移量、类型偏移量是一个16位的无符号数;类型有两种:近标号NEAR(2字节)和远标号FAR(4字节);
3.变量Variable变量是存储器中某个数据区的名字,在指令中可以作为存储器操作数使用;变量也具有三种属性:段、偏移量、类型段值:一般在DS或ES寄存器;变量的类型:有BYTE、WORD、DWORD、QWORD、TBYTE;常用数据类型伪指令DB、DW、DD、DQ、DT来定义。例如: NUMDB11H,22H,33H DATA2 DW100H,200H
变量名与标号名的区别:变量名是变量的符号地址,标号是指令的符号地址。例如:
MOVAX,VAR1;(VAR1字变量) MOVBL,VAR2;(VAR2字节变量)
JMPDONE ……DONE: ADDAL,5变量名对应数据区的首地址,若数据区有多个数据,则在对其他数据操作时需要修改地址:NUMDB11H,23H,33H
MOVAL,NUM+24、表达式表达式不是指令,本身不能执行。表达式中的运算是在汇编时完成的,而不是在指令执行时完成的。表达式常用运算符有:算术运算符:+、-、*、/和MOD(取余数)逻辑运算符:AND、OR、XOR、NOT关系运算符:EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)取值运算符:OFFSET、SEG属性运算符:PTR其他运算符:[]、:表达式中的运算符1、算术运算符:+、-、*、/、求余(MOD)、它们运算的结果都取整数。 MOVAL,8+5 MOVAX,NUM+8×22、逻辑运算符与AND、或OR、异或XOR、非NOT四种,逻辑运算符只能用于数值表达式,结果也是数值。例:ANDAL,0ADHAND0CCH注意:逻辑运算符与逻辑运算指令区别。3、关系运算符相等EQ、不相等NE、小于LT、大于GT、小于等于LE、大于等于GE例:MOVAX,4EQ3 MOVAX,4NE3关系运算符可对两个性质相同的数据进行关系运算,如果表达式成立,则运算结果为真TRUE,输出结果为全1;若表达式不成立,则表示结果为假FALSE,输出为全0。汇编之后:MOVAX,0 MOVAX,0FFFFHSEG、OFFSET又称为数值返回运算符,用以获取变量或标号的属性。例:MOVAX,SEGBUFFER MOVAX,OFFSETBUFFERPTR是类型运算符:
CALLDWORDPTR[BX] MOVAL,BYTEPTR[SI]4、取值运算符和类型运算符4.2 伪指令伪指令由编译程序执行,不参与程序的运行;功能:定义数据、分配存储区、定义段、定义过程等。常用的伪操作指令:数据定义伪指令符号定义伪指令设定段寄存器伪指令过程定义伪指令宏命令伪指令模块定义与连接伪指令4.2.1数据定义伪指令数据定义伪指令用来定义一个变量,说明变量的类型,给变量分配存储空间,并赋初值。一般格式为:
[变量名]伪操作助记符操作数1[,操作数2,…]
常用的数据定义伪操作有5种:
DB:定义字节类型的变量如: DELY1 DB 11H,22H,33H,44H DELY2 DB ‘HELLO’
DATA1 DB ?DW:定义字类型的变量
DATA2 DW 100H,200H NUM DW 100×5+88
11H22H33H44H‘H’‘E’‘L’‘L’‘O’...DELY1DELY2DD:定义双字类型的变量如: DATA3 DD 35F87123HDQ:定义四字类型的变量DT:定义十字节类型的变量,每个操作数 为10个字节的压缩BCD码;SUMDQ0011223344556677H如果一个变量的操作数有多个,而且都一样;可以使用重复操作符DUP来定义:
DATA1DB20DUP(?) DATA2DB20DUP(30)
23H71HF8H35H…77H66H55H44H33H22H11H00H…DATA3SUM2、符号定义伪指令符号定义伪指令EQU用于给一个表达式赋予一个名字;指令格式:符号名EQU表达式例如:DATA EQU 0DH COUNT EQU Ten*2+1024 ADDR EQU ES:[BP+DI+5]注意:若表达式中有变量,则应在EQU命令前定义。例如: P8 EQUDS:[BP+5]注意:不能重复定义同一个符号。
=可以对一个符号重复定义: FACTOR=10H
… FACTOR=25H3、段定义伪指令segment和ends段定义伪指令,定义源程序中的逻辑段;指令格式:段名SEGMENT[定位类型][组合类型][‘类别’]
……段名ENDS[定位类型]:说明该段对起始地址的要求;有四种选择PARA,BYTE,WORD,PAGE PARA表示段必须从能被16整除的地址开始;[组合类型]:在具有多个模块的程序中,它指示在汇编后进行连接时,该段是否和其它的段进行组合,如果一个程序不需要和其他程序组合,也可省略该项。[类别]:用单引号扩起来的字符串。‘STACK’,‘CODE’,‘DATA’具有相同类别的逻辑段装入连续的内存区;
stack segment parastack‘stack’
…… Stack ends该段是堆栈段,段名为stack;segment指明堆栈段开始;para说明该段必须从能被16整除的地址边界开始;stack指明组合类型;‘stack’指明类别是堆栈类。注意:同一个段的起始和结束必须是同一个标号名。4.2.4设定段寄存器的伪指令该伪指令的一般格式为:ASSUMECS:CODE,DS:DATA,ES:EDATA,SS:STACKASSUME伪指令说明用SEGMENT伪指令定义的段的段基址要放在那个段寄存器中;但是段基址装入段寄存器的操作必须由程序实现。
Code segmentparapublic‘code’ assumecs:code,ds:data,es:edata,ss:stackBegin: mov ax,data mov ds,ax mov ax,edata mov es,ax mov ax,stack mov ss,ax
……
4.2.5过程定义伪指令过程也叫子程序,过程名就是子程序的名字,也是子程序入口的符号地址,过程由PROC开始,至ENDP结束。PROC和ENDP之间的部分是过程体,过程体内至少要有一条返回指令RET,以便在过程调用结束后返回主程序。过程定义伪指令一般格式:
NAME1 PROCFAR(NEAR) ……
RET NAME1 ENDP例:编写一个20ms的延时子程序DELAY PROC PUSH BX PUSH CX MOVBL,2NEXT: MOV CX,2801W20ms: LOOP W20ms DEC BL JNZ NEXT POP CX POP BX
RETDELAY ENDP4.2.6宏命令伪指令宏命令名 MACRO[形式参数,…]
…… ENDM宏定义和过程定义类似,但宏定义结束符ENDM前不加宏命令名;例如:DADD MARCOX,Y,Z MOVAX,X ADDAX,Y MOVZ,AX ENDM在源程序中调用:
DADDDATA1,DATA2,SUM形式参数宏调用与过程的区别:宏命令由宏汇编程序MASM在汇编过程中处理,MASM在每个宏调用处,都用其对应的宏定义体替换;宏定义简化了源程序,但不能简化目标程序;不节省内存单元;宏指令执行速度快;汇编结束伪指令格式: END 标号例如:……ENDSTART;源程序结束,程序从START ;处开始执行例:求从TABLE开始的10个无符号数的和,结果放在SUM单元中;
DATA SEGMENT TABLE DB12H,23H,34H,45H,56H DB67H,78H,89H,9AH,0FDH SUM DW? DATA ENDS STACK SEGMENT DW50DUP(?) TOP DW? STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEAAX,TOP MOVSP,AX LEA SI,TABLE MOV CX,10 XOR AX,AXNEXT: ADD AL,[SI] ADC AH,0 INC SI LOOPNEXT MOV SUM,AX
MOVAH,4CH INT21H CODE ENDS END START4.3系统功能调用微机的操作系统中提供的功能调用有两种,一种叫高级调用;另一种称为BIOS功能调用,也叫低级调用;DOS功能调用都是利用软中断指令INT21H来实现的,INT21H包含了90多个子功能,包括:设备管理、目录管理、文件管理和其他功能,用户可以直接使用。DOS操作系统将所有子功能顺序编号,从00~57H。DOS功能调用DOS系统功能调用的方法如下:MOVAH,功能号在其它寄存器中放人该功能所要求的入口叁数;INT21H分析出口参数。1号功能:系统扫描键盘,等待从键盘输入一个字符,将字符送入寄存器AL。如果输入的是CTRL+BREAK,则退出调用;否则将输入的字符存入AL。
MOVAH,1 INT21H功能号1、7、8
[例4-8]从键盘输入一个“Y”或“N”字符。
……KEY:MOVAH,1;有回显的键盘输人。功能号1送(AH) INT21H;当按下键后,返回(AL)=字符的ASCII码
CMPAL,'Y';比较键人的是否是Y JZYES;键入字符“Y”则转至Yes语句处
CMPAL,'N';比较健人的是否是N JZNOT;键人字符“N”则转至NOT语句处
JMPKEY;键入其他字符,转至KEY语句处,继续等待键人YES: ……NOT: ……0A号功能:输入字符串此功能要求用户指定一个键入缓冲区来存放输入的字符串,缓冲区起始偏移地址预置入DX寄存器。缓冲区结构如图,其中第一字节为用户定义的缓冲区长度,第二个字节为实际键入的字符数(不包括回车符),它由0A号功能自动填入;从第三个字节开始存放键入的字符;若实际键入的字符数(包括回车符)大于用户定义的缓冲区长度,则喇叭会嘟嘟响;缓冲区长度n实际字符数…DX保存输入的字符
[例4—9]从键盘上输入字符串‘HELLO’,并在串尾加结束标志‘$’。
DATA SEGMENTSTRING DB10,0,10DUP(?);定义缓冲区
DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX
LEADX,STRING MOVAH,0AH;功能号送AH
INT21H
MOVCL,STRING+1;实际键入的
XORCH,CH ;字符个数送CL100$STRING
ADDDX, 2 ADDDX,CX;得到字符串尾地址
MOVBX,DX MOVBYTEPTR[BX],'$';插入串结束符
MOVAH,4CH INT21HCODE ENDS ENDSTART2、显示器输出(2、6、9)用2号功能显示一个字符:
…
MOVDL,<要显示的字符ASCII> MOVAH,2 INT21H
…
… MOVDL,<要显示的字符> MOVAH,6 INT21H
…用9号功能显示一个字符串:该功能要求被显示的字符串必须以“$”结束;如果希望光标能自动换行,则应在字符串结束前加上回车及换行的ASCII码0DH和0AH;
MOVDX,OFFSETCHARS;字符串起始地址送DXMOVAH,09H;字符串显示功能
INT21H;用6号功能显示一个字符:3.退回到DOS
为了能使程序正常退出并返回DOS,可使用DOS系统功能调用的4CH号功能。用4CH号功能返回DOS的程序段如下:
…MOVAH,4CH;功能号送AHINT21H;返回DOSMOVAX,4C00HINT21H8086/8088汇编语言程序设计一、程序设计的基本步骤:分析问题确定算法画程序流程图为数据和程序代码分配内存单元和寄存器编写源程序汇编、调试与修改二、汇编语言源程序基本设计方法
1、顺序程序设计
2、分支程序设计
3、循环程序设计
4、子程序设计程序设计应尽量采用结构化、模块化的设计方法。将程序按功能划分成一个个独立的模块,每个模块进行独立的编辑和汇编,生成自己的源文件和目标文件,然后通过链接形成一个完整的可执行文件。4.4.2顺序程序没有分支、没有循环、没有转移[例4-11]对于三个8位无符号数86H、34H和21H,编写S=86H×34H-21H的程序。取被乘数求乘积取乘数取第三个数作操作数做减法结果送指定处结束初始化取被乘数求乘积取乘数取第三个数作操作数做减法结果送指定处
NUMDB86H,34H,21HRESULTDW?SI作为数据区的指针;
DI作为结果指针;DATA SEGMENTNUMDB86H,34H,21H;定义源操作数RESULTDW?;定义结果存放单元DATA ENDSCODE SEGMENT
ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEASI,NUM
LEADI,RESULT MOVAL,[SI] MOVBL,[SI+1] MULBL ;求乘积
MOVBL,[SI+2] ;取第三个数作操作数
MOVBH,0 SUBAX,BX MOV[DI],AX ;结果送RESULT
MOVAH,4CH ;返回DOS INT21H
CODEENDS
ENDSTART[例4—12]内存自TABLE开始的连续16个单元中存放着0~15的平方值(称平方表),查表求DATA中任意数X(0≤X≤15)的平方值,并将结果放在RESULT中.DSEGSEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225;定义平方表DATADB?RESULTDB?;定义结果存放单元DSEGENDSSSEGSEGMENTSTACK'STACK'STA DW100DUP(?);定义堆栈空间SSEGENDS014916…TABLEBX
CSEGSEGMENT
ASSUMECS:CSEG,DS:DSEG,SS:SSEGBEGIN: MOVAX,DSEG ;初始化数据段 MOVDS,AX MOVAX,SSEG ;初始化堆栈 MOVSS,AX
LEABX,TABLE ;置数据指针 MOVAH,0 MOVAL,DATA ;取待查数ADDBX,AX ;查表MOVAL,[BX]MOVRESULT,AL ;平方数存RESULT
MOVAH,4CH INT21H
CSEG ENDS ENDBEGIN4.4.3分支程序设计条件1成立?…条件2成立?条件n成立?Pn+1PnP2P1YYYNNN判定条件P1P2YN分支程序的基本结构(a)(b)[例4-13]编写程序,将数据区中以字节变量BUFFER为首地址的100个单元清零。
DATA SEGMENTBUFFERDB100DUP(?)COUNTDB100;定义数据缓冲区长度
DATAENDS
STACKSEGMENT ‘STACK’DW32DUP(?)STACKENDS
CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;初始化数据段 MOV AX,STACK MOV SS,AX;初始化堆栈段MOV CX,COUNT ;置单元长度
LEABX,BUFFERAGAIN:MOV [BX],0;实现100个单元清零 INC BX DECCX JNZ AGAIN
MOV AH,4CH INT 21H
CODEENDSENDSTARTDATA SEGMENTBUFFERDB100DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX MOVCX,100 ;置缓冲区长度
LEABX,BUFFERAGAIN:MOV[BX],0 INCBX
LOOP AGAIN
MOV AH,4CH INT 21HCODEENDS ENDSTART3、循环程序设计1、循环程序设计结构初始化部分工作部分修改部分循环结束?结束部分初始化部分循环结束?工作部分修改部分结束部分先执行后判断先判断后执行循环控制的方法控制循环有多种方法:1、计数器控制循环;2、条件控制循环;3、逻辑尺控制循环;4、开关变量控制循环(分支规律已知,计数次数或循环条件已知);[例4-14]在数据段DATA1开始的80个连续的存储单元中,存放80位同学某门课程的考试成绩(0~100)。编写程序统计成绩≥90分的人数,80~89分的人数,70~79分的人数,60~69分以及<60分的人数。将结果存放到DATA2开始的存储单元中。
DATASEGMENTDATA1DB80DUP(?);假定学生成绩已放入这80个单元中
DATA2DB5DUP(0);统计结果的存放单元
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVCX,80;统计80个学生的成绩
LEASI,DATA1 LEADI,DATA2AGAIN:MOVAL,[SI]CMPAL,90;与90比较
JCNEXT1;小于90分,转NEXT1 INCBYTEPTR[DI];否则90分以上的人数加1JMPSTO;转循环控制处理
NEXT1:CMPAL,80;与80比较
JCNEXT2 ;小于80分,转NEXT2INCBYTEPTR[DI+1];否则80分以上的人数加1 JMPSTONEXT2:CMPAL,70;与70比较
JCNEXT3 ;小于70分,转NEXT3INCBYTEPTR[DI+2];否则70分以上的人数加1
JMPSTONEXT3:CMPAL,60;与60比较
JCNEXT4;小于60分,转NEXT4INCBYTEPTR[DI+3];否则60分以上的人数加1JMPSTO;转循环控制处理NEXT4NEXT4:INCBYTEPTR[DI+4];60分以下的人数加1STO:INCSI;指向下一个学生成绩
LOOPAGAIN;循环,直到所有成绩都统计完
MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART[例如4-21]两个多字节二进制数求和程序;
DATA SEGMENT BUFF1 DB4FH,0B6H,7CH,34H,56H,1FH BUFF2 DB13H,24H,57H,68H,0FDH,9AH SUM DB6DUP(?)
COUNT DB3 DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSETBUFF1 MOV DI,OFFSETBUFF2 MOV BX,OFFSETSUM
MOVCL,COUNT ;初始化计数器
MOV CH,0 CLC ;CF=0GOON: MOVAX,[SI] ADC AX,[DI] INC SI INC SI INCDI INCDI MOV [BX],AX INC BX INCBX LOOP GOON MOV AH,4CH INT 21H CODE ENDS ENDSTART三、多重循环程序设计例在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。冒泡排序算法:从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较:只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。数
10 8 16 90 32第一遍
10 16 90 32 8第二遍
16 90 32 10 8第三遍
90 32 16 10 8程序流程图如图4.9所示。DSEGSEGMENTMEMDWl00DUP(?);假定要排序的数已DSEGENDS ;存入这200个单元中CSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEADI,MEM ;DI指向MEM的首址
MOVBL,99;外循环只需99次即可[例4-15]把从MEM单元开始的l00个16位无符号数按从大到小的顺序排列。
;外循环体从此开始NEXT1:MOVSI,DI ;SI指向当前要比较的数MOVCL,BL;CL为内循环计数器,循环次数每次减l;以下为内循环NEXT2:MOVAX,[SI] ;取第一个数NiADDSI,2 ;指向下一个数Nj,CMPAX,[SI] ;比较Ni和NjJNCNEXT3 ;若Ni大于Nj,则不交换
MOVDX,[SI] ;否则,交换Ni和Nj
MOV[SI-2],DX
MOV[SI],AXNEXT3:DECCL ;内循环结束?JNZNEXT2 ;若未结束,则继续 ;内循环到此结束
DECBL;外循环结束?
JNZNEXT1;若未结束,则继续
;外循环体结束
MOVAX,4C00H;返回DOSINT21HCSEGENDSENDSTART4、子程序设计1、子程序的作用:
功能独立,可重复调用;便于程序设计模块化;
将多次重复的程序段或语句序列设计成可供反复调用的独立的子程序结构。 调用子程序的程序称为主调程序或主程序。 子程序执行完后,返到主程序处继续执行主程序,称为“返回主程序”,即返主。 主程序的概念是相对的。使用子程序的注意事项:参数传递主程序现场保护:常常是子程序用到的寄存器主程序也会用到,为了防止破坏主程序中寄存器的内容,需要在子程序入口处将其所用到的寄存器内容压栈保护。(1)寄存器法(2)约定存储单元法(3)堆栈法子程序设计通常一个完整的子程序由下面五个部分组成:①子程序入口:通常用子程序名作为子程序入口,也就是标号地址。②保护现场:为了不破坏主程序原有信息,进入子程序首先把子程序中将要用到的寄存器、存储单元等压入堆栈或存入空存储单元中。③子程序体④恢复现场:把前边保护的现场信息进行恢复。⑤子程序返回:RET指令,返回到主程序的断点处,继续执行主程序。3.子程序说明文件为方便使用,要建立子程序的文档说明,即子程序说明文件。一般有以下几项内容:(1)子程序名:有一定意义的标识符,同时也是该子程序的入口地址;(2)子程序功能:子程序完成的具体任务;(3)子程序中所用寄存器和工作单元;(4)子程序输入参数:子程序运行所需参数及通过寄存器、存储单元或堆栈传递;(5)子程序输出参数:子程序运行完毕的结果参数由哪些寄存器、存储单元或堆栈传递。(6)调用实例:给出调用示范例子。……….……….MOVAX,LEN1PUSHAXLEAAX,ARY1PUSHAX存放参数PUSHBPMOVBP,SPPUSHAXPUSHBXPUSHCXPUSHF保护现场主程序Flash子程序取得参数MOVCX,[BP+6]MOVBX,[BP+4]ADD1:求和并且保存结果XORAX,AXADDAL,[BX]ADCAH,0INCBXLOOPADD1MOV[BX],AX恢复现场POPFPOPCXPOPBXPOPAXPOPBP返回主程序RET4调用子程序CALLSUM存放参数MOVAX,LEN2PUSHAXLEAAX,ARY2PUSHAX调用子程序CALLSUM用堆栈段传递参数DATASEGMENTARY1DB03H,07H,50H,06H,23H,45H,0F6H,0DFHLEN1EQU$-ARY1SUM1DW?ARY2DB33H,44H,55H,12H,78H,89H,0FFH,0CDHLEN2EQU$-ARY2SUM2DW?DATAENDSSTACKSEGMENTSTACK’STACK’DB100DUP(‘S‘)STACKENDSCODESEGMENTPARA‘CODE’ASSUMECS:CODE,DS:DATA,SS:STACKSTAPROCFAR
PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,LEN1PUSHAXLEAAX,ARY1PUSHAXCALLSUMMOVAX,LEN2PUSHAXLEAAX,ARY2PUSHAXCALLSUMRETSTAENDPFlash
SUMPROCPUSHBPMOVBP,SPPUSHAXPUSHBXPUSHCXPUSHFMOVCX,[BP+6]
MOVBX,[BP+4]
XORAX,AXADD1:ADDAL,[BX]
ADCAH,0 INCBX LOOPADD1 MOV[BX],AX POPF POPCX POPBX POPAX POPBPRET4
SUMENDPCODEENDSENDSTAFlash子程序应用举例例4.12将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为‘10010011’。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8位和16位二进制数的转换。;入口参数:DX存放待转换的二进制数;;CX存放待转换数的位数(8位或16位);;DI存放ASCII码首地址;;出口参数:转换后的字符串存放在以DI作指针的字节存贮区中;程序如下:DATA SEGMENTNUM8 DB 93HNUM16DW 0ABCDHASCBUFDB 20DUP(0)DATA ENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:dataSTART: MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8 ;转换二进制数送DXMOVCX,8 ;置位数8LEADI,ASCBUF ;字符串首址→DICALLBTASC ;调用子程序BTASCMOV[DI],BYTEPTR0DHMOV[DI+1],BYTEPTR0AH
MOV [DI+2],BYTEPTR'$' LEA DX,ASCBUF;显示转换后的字符串
MOV AH,9 INT 21H MOV DX,NUM16 MOV CX,16 ;置位数16 LEA DI,ASCBUF CALL BTASCMOV [DI],BYTEPTR0DH MOV [DI+1],BYTEPTR0AH MOV [DI+2],BYTEPTR'$';显示转换后的字符串
LEA DX,ASCBUF MOV AH,9 INT 21H MOVAH,4CH INT21HBTASC PROC PUSH AX ;保存AX CMP CX,8 ;比较8位数
JNE L1 ;直接转换16位数
MOV DH,DL;8位数转换送DHL1: MOV AL,0 ROL DX,1 ;DX最高位移入CF RCL AL,1 ;CF移入AL最低位
ADD AL,30H MOV [DI],AL
INC DI LOOPL1 POPAX RETBTASC ENDPCODE ENDS END START返回本节运行汇编语言源程序一、运行汇编语言源程序的步骤编辑源程序,调用编辑程序(edit)建立一个扩展名为.asm的源程序文件;汇编源程序。调用汇编程序MASM.EXE对XX.ASM进行汇编,生成XX.OBJ目标文件;连接:调用LINK.EXE连接程序,将XX.OBJ目标程序转换为可执行文件XX.EXE;调试程序:调用DEBUG.COM调试程序进行调试。运行可执行文件XX.EXE;辅助工具程序(.EXE)进行汇编语言程序调试有:
DEBUG.COM动态调试程序
CREF.EXE交叉引用程序
TD(turboDebugger简称)也是动态调试程序,可在DOS和Windows环境下运行,用户界面十分友好。
汇编源程序
用编辑软件建立的源程序.ASM文件,必须经过汇编才能产生.OBJ文件。为此,需键入:
C:>MASM<源文件名>
屏幕上显示:
Microsoft(R)MacroassembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987ALLrightsreserved
OBJfilename[<file>.obj]:
Sourcelisting[nul.lst]:
Cross-reference[nul.crf]:
汇编后生成以下几个文件:(1).OBJ文件
.OBJ文件是目标代码文件,当源程序中无语法错误时,则在当前工作盘上自动存入一个.OBJ文件,供下一步连接用。
若源程序有语法错误时,会出现错误信息提示:
源程序文件行
错误信息代码
错误说明信息
××Warningerrors(警告错误)
××Severeerrors(严重错误)
若严重错误总数不为0,则.OBJ文件没有生成,需回到编辑状态下修改源程序直到无错为止。(2).LST文件(列表文件)
.LST文件对调试程序有帮助,它是将源程序中各语句及其对应的目标代码和符号表以清单方式列出(3).CRF文件(交叉引用文件)
.CRF文件给出了源程序中定义的符号引用情况,按字母顺序排列。.CRF文件不可显示,须用CREF.EXE系统程序将.CRF文件转换成为.REF文件后方可显示输出。
三、
连接目标程序
汇编后生成的.OBJ文件,其所有目标代码的地址都是浮动的偏移地址,机器不能直接运行。必须用连接程序(LINK.EXE)对其进行连接装配定位,产生.EXE可执行文件,方可运行。
在系统提示符下键入:LINK<源程序文件名>屏幕上出现以下提示信息:
Microsoft(R)MacroassembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987ALLrightsreserved
Runfile[<file>.EXE]:
ListFile[nul.map]:
Libraries[.lib]:
LINK<file>;多了一个分号,表示结束后续询问。
连接后,可生成两种文件:.EXE和.MAP
(1).EXE文件(可执行文件)
若连接过程中无错误,则自动在当前工作盘生成.EXE文件。若有错误,则会给出错误信息提示,这时必须重新修改源程序,再汇编、连接。
(2).MAP(连接映像文件)
(3).LIB库文件
连接程序询问是否使用某种库文件,不需使用库文件直接按回车键。
(4)若要连接多个模块目标程序,可用“+”把它们连接起来。如:LINKfiles1+files2+files3如:
LINK<file>;多了一个分号,表示结束后续询问。启动DEBUG程序§1.启动DEBUG程序
①在DOS提示符下键入:DEBUG↙(表示回车) Debug执行,屏幕显示提示符“-”,说明计算机当前处于DEBUG的管理之下,可接受、并执行DEBUG命令。②在DOS提示符下键入:DEBUG[路径\]文件名↙
DEBUG执行,并将指定文件装入内存,供调试。命令格式
§2DEBUG命令和参数的格式
1.命令格式
命令字母[参数]
字母不分大小写;只使用16进制数,不加H;分割符只在两个数值之间是必须的,命令和参数之间可有可无;键入回车键执行命令,Ctrl+Break或Ctrl+C中止命令的执行;如命令不符合DEBUG的规则,则提示“error”并使用“^”指示错误位置。参数格式12.参数格式 ①表示地址(逻辑地址):段地址:偏移地址D0400:2500D10ac:0 Dds:04Dcs:100偏移地址D2505D100;DEBUG认为输入的是偏移地址,段地址采用默认的段寄存器,不同的命令默认不同的段寄存器,例如汇编命令默认CS,显示数据命令默认DS。既不送段地址,也不送偏移地址,段地址采用默认的段寄存器,偏移地址采用当前值。只送段地址,省略偏移地址,非法。 如DDS:或D0400:参数格式12.参数格式 ①表示地址(逻辑地址):段地址:偏移地址D0400:2500D10ac:0 Dds:04Dcs:100偏移地址D2505D100;DEBUG认为输入的是偏移地址,段地址采用默认的段寄存器,不同的命令默认不同的段寄存器,例如汇编命令默认CS,显示数据命令默认DS。既不送段地址,也不送偏移地址,段地址采用默认的段寄存器,偏移地址采用当前值。只送段地址,省略偏移地址,非法。 如DDS:或D0400:参数格式2
②表示范围开始地址结束地址如“DDS:050”,“D2AC0:100200”,“D100120”注意:结束地址不能带段地址开始地址L字节长度如“DDS:0L10”,“D100L20”命令索引命令索引D命令
R命令
U命令
G命令
T命令
Q命令N命令L命令P命令A命令E命令F命令 W命令 C命令H命令 S命令I命令O命令M命令D命令§3.DEBUG命令1.显示命令D①D[地址]②D[范围]
;如不指定范围,一次显示8行×16个字节。-D;默认段寄存器为DS,当前偏移地址-DDS:100/-DCS:200
-D200:100
-D200;200为偏移地址,默认段寄存器DS
-DDS:100110/-D100L10E命令
2.修改命令E ①E地址;从指定地址开始,修改(或连续修改)存储单元内容。DEBUG首先显示指定单元内容,如要修改,可输入新数据;空格键显示下一个单元内容并可修改,减号键显示上一个单元内容并可修改;如不修改,可直接按空格键或减号键;回车键结束命令。 ②E地址数据表;从指定的地址开始用数据表给定的数据修改存储单元。-EDS:100F3‘AB’8D。F命令3.添充命令F F范围数据表;将数据表写入指定范围的存储单元;数据个数多,忽略多出的数据,个数少,则重复使用数据表。-FDS:0L501
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44809-2024物联网工业物联网系统设备兼容性要求和模型
- GB/T 44802-2024柔性直流输电用绝缘栅双极晶体管(IGBT)驱动器技术规范
- 高中历史 第一单元 从“朕即皇帝”到“主权在民”第1节 欧洲的君主专制教案 岳麓版选修2
- 2024秋五年级语文上册 第四单元 15 小岛教案 新人教版
- 2023六年级数学上册 6 百分数教案 新人教版
- 湖南省衡阳市高中数学 第一章 集合与函数概念 1.3 函数的基本性质 1.3.1 单调性与最大(小)值教案 新人教A版必修1
- 八年级地理上册 第二章 第三节 气候与人类活动教案1 中图版
- 2024-2025学年高中化学 第一章 物质结构元素周期律 第二节 元素周期律第3课时教案1 新人教版必修2
- 租用家庭氧气瓶合同(2篇)
- 棕榈油供销合同(2篇)
- 2024年度一级注册消防工程师考试复习题库及答案(共1000题)
- 《人工智能基础》课件-AI的前世今生:她从哪里来
- 人教八年级上册英语第六单元《Section A (1a-2d)》教学课件
- 食品工业技术经济学智慧树知到期末考试答案章节答案2024年西华大学
- 家校携手 同心共育 四年期中考试家长会 课件
- 正确使用网络流行语+课件-2022-2023学年主题班会
- (完整word版)高考英语作文练习纸(标准答题卡)
- 通用技术学考300题
- 公寓购房合同范文
- 迁钢炼钢二期板坯连铸机设备安装施工方案
- 山西《建筑工程预算定额》定额说明及计算规则
评论
0/150
提交评论