第四章汇编语言程序设计课件.ppt

上传人:小飞机 文档编号:2111807 上传时间:2023-01-12 格式:PPT 页数:69 大小:205.33KB
返回 下载 相关 举报
第四章汇编语言程序设计课件.ppt_第1页
第1页 / 共69页
第四章汇编语言程序设计课件.ppt_第2页
第2页 / 共69页
第四章汇编语言程序设计课件.ppt_第3页
第3页 / 共69页
第四章汇编语言程序设计课件.ppt_第4页
第4页 / 共69页
第四章汇编语言程序设计课件.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

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

1、第四章 汇编语言程序设计,第一节 汇编语言源程序汇编语言是用指令的助记符、符号地址、标号和伪指令等来书写程序 一、汇编语言源程序的结构一个完整的汇编语言源程序通常由若干个逻辑段(SEGMENT)组成,包括代码段、数据段、附加段和堆栈段,它们分别映射到存储器中的物理段上,第四章 汇编语言程序设计 第一节 汇编语言源程序,例4-1 两个字(A6B8H,206DH)相加的完整的汇编语言程序,DATA SEGMENT;定义数据段DATA1DW 0A6B8H;定义被加数DATA2 DW 206DH;定义加数SUM DW 2 DUP(?);定义和 DATAENDS;数据段结束CODESEGMENT;定义代

2、码段ASSEME CS:CODE,DS:DATA;段寄存器说明 START:MOVAX,DATAMOVDS,AX;初始化DSLEA SI,SUM;存放结果的偏移地址送SIMOVAX,DATA1;取被加数ADDAX,DATA2;两数相加MOVSI,AX;和送入SUMMOV AH,4CH INT21H;返回DOSCODEENDS;代码段结束ENDSTART;源程序结束,例4-1 两个字(A6B8H,206DH)相加的完整的,二、汇编语言语句类型及格式指令性语句的格式:标号:前缀 操作码 操作数,操作数;注释 例如指令性语句:START:MOV AX,DATA;将立即数DATA送累加器AX指示性语句

3、的格式:名字 伪操作 操作数,操作数,;注释 例如指示性语句:DATA1 DB 56H,78H,9AH;定义字节型数据,“DB”是伪操作,二、汇编语言语句类型及格式,指令性语句与指示性语句在格式上的区别:,指令性语句中的“标号”表示指令的符号地址,其后面通常要加上“:”。指示性语句中的“名字”通常表示变量名、段名和过程名等,其后不加“:”。名字在多数情况下表示的是变量名,用来表示存储器中一个数据区的地址。指令性语句中的操作数最多为两个操作数,也可以没有操作数。而指示性语句中的操作数可根据需要有多个,当操作数有不止一个时,相互之间用逗号隔开。,指令性语句与指示性语句在格式上的区别:指令性语句中的

4、“标,汇编语言语句中的操作数,三、数据项及表达式操作数可以是寄存器、存储器单元或数据项。而数据项又可以是常量、标号、变量和表达式 1常量 二进制常量 十进制常量 十六进制常量 字符串常量,汇编语言语句中的操作数 三、数据项及表达式,2标号 指令的标号是由编程者确定的,它不能与指令助记符或伪指令重名,也不允许由数字开头,标号的字符个数不超过31个。指令性语句中的标号代表存放一条指令的存储单元的符号地址,其后通常加一个冒号。,2标号,标号具有3种属性:段、偏移量和类型。标号的段属性是就是标号所在段的段地址。标号的偏移量就是标号所在段的起始地址到定义该标号的地址之间的字节数(即偏移地址)。偏移量是一

5、个16位无符号数。标号的类型有NEAR和FAR两种。前一种标号称为近标号,只能在段内被引用,地址指针为2个字节。后一种标号称为远标号,可以在其他段被引用,地址指针为4个字节。,标号具有3种属性:段、偏移量和类型。,3变量 变量名由字母开头,长度不超过31个字符。变量是存储器中某个数据区的名字,因为数据区中的内容是可以改变的,因此变量的值也可以改变。变量在指令中可以作为存储器操作数引用。变量也具有3种属性,即:段、偏移量和类型。变量的段属性就是它所在段的段地址。因为变量一般在存储器的数据段或附加段中,所以变量的段值在DS或ES寄存器中。变量的偏移量属性是该变量所在段的起始地址到变量地址之间的字节

6、数。变量的类型有BYTE(字节)、WORD(字)、DWORD(双字)、QWORD(四字)、TBYTE(十个字节)等,表示数据区中存取操作对象的大小。,3变量,使用变量时需注意以下两点:变量的类型与指令的要求要相符。例如指令MOV AX,VAR中,要求VAR必须定义为字类型变量。在定义变量时,变量名对应的是数据区的首地址。如果数据区中有多个数据,则对其他数据操作时,需修改地址。例如:BUFFERDB 56H,78H,9AH MOVAL,BUFFER+2;将9AH送(AL),使用变量时需注意以下两点:,4表达式表达式是由常数、操作数、操作符和运算符组合而成 表达式中常用的运算符有以下几种:算术运算

7、符算术运算符有(加)、(减)、*(乘)、/(除)、MOD(取余)等 逻辑运算符逻辑运算符包括AND(与)、OR(或)、NOT(非)、XOR(异或)例如:指令MOV AL,0A6H XOR 0CEH等价于MOV AL,68H,4表达式,关系运算符关系运算符包括EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。关系运算符连接的必须是两个数值,或同一段中的两个存储单元地址。关系运算符的运算结果是一个逻辑值,当关系不成立(为假)时,结果为0;当关系成立(为真)时,结果为0FFFFH,关系运算符,取值运算符取值运算符用来分析一个存储器操作数的属性 OFFSET

8、利用运算符OFFSET可以得到一个标号或变量的偏移地址。例如:MOV SI,OFFSET DATA1;将变量DATA1的偏移地址送SI该指令等同于以下指令:LEA SI,DATA1 SEG利用运算符SEG可以得到一个标号或变量的段地址。例如:MOV AX,SEG DATA;将变量DATA的段地址送AX MOV DS,AX;(DS)(AX),取值运算符,属性运算符属性运算符PTR用来指定其后的存储器操作数的类型。例如:MOV AX,WORD PTRSI;将SI和SI+1所指向的两个存储单元送AX 段超越运算符运算符“:”跟在某个段寄存器名(DS、ES、SS或CS)之后表示段超越,用来指定一个存储

9、器操作数的段属性。例如:MOV AX,ES:BX;将ES段中由BX指向的字操作数送(AX),属性运算符,第二节 伪指令,一、数据定义伪指令数据定义伪指令用来定义一个变量的类型,给存储器赋初值,或给变量分配存储空间 1定义字节(DB)DB(Define Byte)用来定义一个变量,并初始化其内存单元。格式:变量名 DB 表达式表达式可以是以下情况之一:一个常数表达式;问号(?)作为非确定的初始值;一个或多个字符的字符串;重复子句:重复次数 DUP(表达式),第二节 伪指令 一、数据定义伪指令,例如:DATA1 DB 11H,22H,33,44H,55H;定义了5个字节常数 STRING1DB A

10、;定义了一个字符 STRING2DB How Are You?;定义了一个字符串SUMDB?;预置了一个不确定的值(变量)BUFFER DB 10 DUP(?);预置了10个具有不确定值的单元,例如:,2定义字(DW)DW(Define Word)定义一个字(两个单元)。DW伪操作后面的每个操作数都占用两个字节,在内存中存放时,低字节在前,高字节在后。DW的格式和表达式与DB类似。例如:DATA2 DW 1234H,5678H,9ABCH BUFFERDW 50 DUP(?)数据定义伪指令还有DD、DQ、DT,2定义字(DW),二、符号定义伪指令符号定义伪指令EQU用于给一个表达式赋予一个名字

11、。以后在程序中凡是用到该表达式的时候,就用这个名字来代替;在需要修改该表达式的值时,只需在赋予名字的地方修改即可。其格式为:名字 EQU 表达式格式中的表达式可以是一个常数、符号、数值表达式、地址表达式,甚至可以是指令助记符。,二、符号定义伪指令,例如:COUNTEQU 100;常量 VAREQU 64*1024;数值表达式 ADDR EQU DS:BP+8;地址表达式 GOTO EQU JMP;指令助记符 EQU指令不能对同一个符号重复定义。若希望对同一个符号重复定义,可以用“”伪指令。例如:EMP=60H;EMP代表数值60H EMP=80H;在此将EMP重新赋值,EMP代表数值80H,例

12、如:,三、段定义伪指令段定义语句可使编程者按段组织程序和使用存储器。段定义伪指令有SEGMENT和ENDS 段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS,三、段定义伪指令,1定位类型:表示此段的起始边界要求,可以是PAGE,PARA,WORD和BYTE。它们表示如下的地址要求:PAGE=BPARA=B(隐含值)WORD=BBYTE=B分别称它们为以页、节、字、字节为边界。若该项省略,则其默认值位PARA。,1定位类型:表示此段的起始边界要求,可以是PAGE,PA,2组合类型:用来告诉连接程序本段与其他段的关系,分别为NONE,PUBLIC,COMMON,AT表达式以及STAC

13、K和MEMORY。,2组合类型:用来告诉连接程序本段与其他段的关系,分别为N,四、设定段寄存器伪指令伪指令ASSUME告诉汇编程序一个段属于哪个段寄存器。当汇编程序遇到一个段名时,它就自动地引用给出的段寄存器将段名加以汇编。格式为:ASSUME 段寄存器名:段名,段寄存器名:段名,格式中的段寄存器名可以是CS、DS、ES或SS。,四、设定段寄存器伪指令,在一个源程序中,ASSUME伪指令要放在可执行程序开始位置的前面。例如,以下程序是一个完整代码段的定义方法。CODESEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACK

14、MOVAX,DATAMOVDS,AXMOVAX,EDATAMOVES,AXMOVAX,STACKMOVSS,AX CODEENDS,在一个源程序中,ASSUME伪指令要放在可执行程序开始位置,五、过程定义伪指令过程就是子程序。调用过程和从过程返回的指令是CALL和RET。过程定义伪指令的格式为:过程名PROC NEAR/FARRET过程名ENDP,五、过程定义伪指令,例4-2 编写一个软件延时的子程序。,DELAYPROC;定义一个过程PUSHBX;保护BX原来的内容PUSH CX;保护CX原来的内容MOVBL,50;外循环次数NEXT:MOVCX,2000;内循环次数WAITS:LOOPWA

15、ITS;(CX)0则循环DECBL;修改外循环计数值JNZNEXT;(BX)0则继续外循环POPCX;恢复CX原来的内容POPBX;恢复BX原来的内容RET;过程返回DELAYENDP;过程结束,例4-2 编写一个软件延时的子程序。DELAYPRO,六、结束伪指令END伪指令表示程序到此为止,告诉汇编程序汇编任务到此结束。其格式为:END 标号END伪操作后面的标号表示程序的开始地址。,六、结束伪指令,第三节 DOS功能调用,所有的DOS系统功能调用都是利用软中断指令INT 21H来实现的。INT 21H是一个具有90多个子功能的中断服务程序,这些子功能大致可分为设备管理、目录管理、文件管理和

16、其他等四个方面。INT 21H对每一个子功能都进行了编号称为功能号。DOS系统功能调用的方法为:AH功能号;在其他寄存器中放入该功能所要求的入口参数;INT 21H;,第三节 DOS功能调用 所有的DOS系统功能调用都是利用软,INT 21H的几个最常用的功能,1键盘输入单字符功能号1和功能号8都可以接收键盘输入的单字符,输入的字符以ASCII码的形式放在累加器AL中。其中1号功能有回显,即键盘输入的内容在放入累加器AL的同时,在显示其上也显示出来;8号功能无回显。键盘输入单字符的功能常用来回答程序中的提示信息,或选择菜单中的可选项以执行不同的程序段。,INT 21H的几个最常用的功能 1键盘

17、输入单字符,例4-3 从键盘输入“Y”或“N”来选择程序的走向,SECLE:MOVAH,01H INT21H CMPAL,Y JEYES CMP AL,N JENOJMPSECLEYES:NO:,例4-3 从键盘输入“Y”或“N”来选择程序的走向 SE,2键盘输入字符串键盘输入字符串通过0AH号功能来实现。该功能要求用户定义一个输入缓冲区来存放输入的字符串 在调用本功能前,应把键入缓冲区的起始地址预置入DX寄存器。,2键盘输入字符串,例4-4 从键盘上输入字符串HOW ARE YOU?,并在串尾加结束标志$。,DATA SEGMENTSTRINGDB 20,?,20 DUP(?)DATAEND

18、SCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DX,STRING MOV AH,0AH INT21H,MOV CL,STRING+1 XOR CH,CH ADD CX,2ADD DX,CX MOV BX,DXMOV BYTE PTRBX,$MOV AH,4CH INT 21HCODE ENDS END START,例4-4 从键盘上输入字符串HOW ARE YOU?,3显示器显示单字符 2号功能用于在显示器上显示单个字符。其程序段如下:MOV DL,;待显示字符的ASCII码必须放在DL中MOVAH,02H;

19、功能号02HAHINT21H;执行系统功能调用,3显示器显示单字符,4显示器显示字符串9号功能用于在显示器上显示一个字符串,要求被显示的字符串必须以“”字符作为结束符,否则会引起屏幕混乱。显示时如果希望光标能自动换行,则应在字符串结束前加上回车及换行的ASCII码0DH和0AH MOV DX,;要显示字符串的首地址送DXMOVAH,09H;功能号09HAHINT21H;执行系统功能调用,4显示器显示字符串,例4-5 在数据段内定义两句话:“PRESS ANY KEY IN THE KEYBOARD.”,“THE RESULT WILL DISPLAY IN SCREEN”。将这两句话在屏幕上分

20、两行显示出来,DATA SEGMENTSTRING DB PRESS ANY KEY IN THE KEYBOARD.,0DH,0AH DB THE RESULT WILL DISPLAY IN SCREEN.,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVDX,OFFSET STRING MOVAH,09H INT21H MOVAH,4CH;返回DOS INT 21H CODEENDS END START,例4-5 在数据段内定义两句话:“PRESS ANY K,5.返回DO

21、S一个程序执行完后,应使程序正常退出并返回到DOS,可使用DOS系统功能调用的4CH号功能。用4CH号功能返回DOS的程序段如下;MOVAH,4CH;功能号送AH INT21H;返回DOS,5.返回DOS,第四节 汇编语言程序设计基础,设计汇编语言源程序的基本步骤为:分析实际问题,并抽象出描述问题的数学模型,确定解决问题的算法与思路;画程序流程图(简单程序可省略此步);为数据和程序代码分配内存单元和寄存器;编写源程序;上机调试与修改,进行结果分析。在进行汇编语言源程序设计时,通常用到四种基本程序结构:顺序程序、分支程序、循环程序、子程序。,第四节 汇编语言程序设计基础设计汇编语言源程序的基本步

22、骤为,1顺序程序顺序程序是最常见、最基本的程序结构,其特点是程序顺序地执行,无分支,无循环与转移。CPU按照指令的排列顺序逐条执行。例4-6 内存中自TABLE开始存放09的平方值,通过人机对话方式,对任意输入的数x(09),查表得到x的平方值,将其放在AL中。,1顺序程序,DATA SEGMENTTABLEDB 0,1,4,9,16,25,36,49,64,91BUFDB PLEASE INPUT ONE NUMBER(09):,0DH,0AH,$DATA ENDSSTACKSEGMENT PARA STACK STACKDB 100 DUP(?)STACKENDSCODE SEGMENT

23、ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVBX,OFFSET TABLE;TABLE的偏移地址送BX,DATA SEGMENT,MOVDX,OFFSET BUF;9号功能调用,显示字符串MOVAH,09H;提示输入一个数INT 21HMOVAH,01H;1号功能调用,键入数送ALINT21HMOVAH,0;AH清零ANDAL,0FH;屏蔽高4位ADDBX,AX;得到输入数的平方在表中的地址MOVAL,BX;输入数的平方送ALMOVAH,4CH;返回DOSINT21HCODEENDSE

24、NDSTART,MOVDX,OFFSET BUF,2分支程序除最基本的顺序程序外,经常会碰到根据不同的条件而转移到不同程序段去执行的各种分支程序。分支结构程序通常采用条件转移指令来实现。例4-7 变量x的符号函数如下所示:1 当x0 y=0 当x=0 1 当x0编程程序,根据x的值给y赋值。,2分支程序,DATASEGMENTxDW?yDW?DATA ENDSSTACKSEGMENT STACK STACKDB 100 DUP(?)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,S

25、TACKMOVSS,AXMOVAX,x;取x的值 ANDAX,AX;建立标志,DATASEGMENT,JZZERO;x=0转ZEROJNSPLUS;x0转PLUSMOVBX,0FFFFH;x0令bx=1JMPDONEZERO:MOVBX,0JMPDONEPLUS:MOVBX,1DONE:MOVy,BX;存放结果 MOVAH,4CH;返回DOSINT21HCODEENDS ENDSTART,JZZER,3循环程序凡是程序中需要重复做的工作,都可以用循环结构程序来实现。包括以下四个部分:初始化:为循环作准备,设置循环计数值,设置变量初值。循环体:循环部分的核心,包括循环的全部指令。修改参数:修改操

26、作数地址,为下次循环作准备。循环控制:修改计数器值,判断循环控制条件,决定是否跳出循环。,3循环程序,例4-8,例4-8 把从TABLE单元开始的100个16位无符号数按从大到小的顺序排列。本题是一个排序问题。因为是无符号数的比较,所以可直接用比较指令CMP和条件转移指令JNC来实现。本题用双重循环。先使第一个数与下一个数比较,若大于则其位置不变,若小于则使两数交换位置。以上完成了一次排序工作。再通过第二重的99次循环,即可实现100个无符号数的大小排序。,例4-8例4-8 把从TABLE单元开始的100个1,DATA SEGMENT TABLEDW 100 DUP(?)DATA ENDS C

27、ODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOVDS,AX LEADI,TABLE;DI指向要排序的数的首址 MOVBL,99;外循环需99次;外循环从此开始NEXT1:MOVSI,DI;SI指向当前要比较的数 MOVCL,BL;CL为内循环计数器,循环次数每次少1;以下为内循环NEXT2:MOVAX,SI;取第一个数Ni ADDSI,2;指向下一个数Nj CMPAX,SI;NiNj?,DATA SEGMENT,JNCNEXT3;若大于,则不交换 MOVDX,SI;否则,交换Ni和Nj MOVSI-2,DX MOVSI,AXNEX

28、T3:DECCL;内循环结束?JNZNEXT2;若未结束,则继续;内循环到此结束DEC BL;外循环结束?JNZNEXT1;若未结束,则继续;外循环结束MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART,JNCNE,4子程序在使用子程序时应注意以下几点:参数传递。参数传递可通过寄存器、存储器、堆栈等方式进行。相应寄存器内容的保护与恢复。为保护调用程序中寄存器的内容,在子程序的入口处,将子程序中将要用到寄存器的原来的内容压入堆栈保存;在子程序结束之前,将压入堆栈寄存器的原来内容恢复出来。子程序嵌套。每一个子程序都包括在过程定义伪指令PROCENDP中间。与子程序调用有关的

29、CPU指令为CALL和RET。,4子程序,例4-9 某一外设的状态端口为0378H,数据端口为03F8H。当状态端口的第1位(Bit1)为0时,表示外设忙;为1则表示外设可以接收数据。编写一个子程序,将当前段中从BUFFER开始的连续100个字节的内容从数据端口输出到外设。通过接口向外设输出数据时,要判断外设是否处于忙的状态,只有外设不忙时,才能进行输出。,例4-9 某一外设的状态端口为0378H,数据端口为0,SENDATAPROCFAR;定义为远过程PUSH AX;保护子程序中用到寄存器的原来内容PUSHDX PUSHSIPUSHCXLEASI,BUFFER;数据的起始地址送SIMOVCL

30、,100;要输出的字节数AGAIN:MOVDX,0378H;I/O状态端口WAITING:INAL,DX;读入I/O状态端口TESTAL,02H;外设忙?(测试Bit1)JZWAITING;若外设忙(Bit1=0),则循环等待MOVAL,SI;否则,取一个数准备输出MOVDX,03F8H;I/O数据端口OUTDX,AL;输出一个字节INCSI;指向下一个字节DECCL;计数器减1JNZAGAIN;若未输出完,则循环POPCX;恢复寄存器原来的内容POPSIPOPDXPOPAXRET;返回主程序SENDATAENDP;过程定义结束,SENDATAPROCFAR;定义,在主程序中调用这个子程序的语

31、句为:MOVAX,DATAMOVDS,AXCALLSENDATA,在主程序中调用这个子程序的语句为:,第五节 常见程序设计举例,例4-10 统计一个数据区中负数的个数。DATASEGMENTMEMDB 1,0,1,55,100,23,2,10;带符号数 DB 36,1,2,0,125,101,66,99LENEQU$MEM;数的个数RESULTDW?;存放结果DATAENDSSTACK SEGMENT PARA STACKDW 100 DUP(?)STACKENDSCODE SEGMENTASSEME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOVDS

32、,AXMOVAX,STACKMOCSS,AX,第五节 常见程序设计举例 例4-10 统计一个数据区中,MOVBX,OFFSET MEMMOVCX,LENMOVDX,0;结果的初值AGAIN:MOV AL,BXCMPAL,0JGEDOINCDXDO:INCBXLOOPAGAINMOVRESULT,DX;负数的个数送RESULTMOVAH,4CH;返回DOSINT21HCODEENDSENDSTART,MOVBX,例4-11 把用ASCII码形式表示的数转换为二进制码。ASCII码存放在以MASC为首地址的存储单元中,转换结果放在MBIN。分析:通常从键盘上输入的数都是以ASCII码的形式存放在内

33、存中的。另外数据区中以字符形式定义的数(用单引号括起来的数),在内存中也是以其对应的ASCII码存放的。对16进制数来说,09的ASCII码分别为30H39H。所以对这十个数,只需将其ASCII码减去30H,就可得到对应的二进制数。AF的ASCII码分别为41H46H,所以要减去37H。若取的数不在0FH范围内,则出错。,例4-11 把用ASCII码形式表示的数转换为二进制码,DATASEGMENTMASCDB 6,3,B,2;要转换的ASCII码MBINDB 2 DUP(?)DATAENDSCODE SEGMENTASSEMU CS:CODE,DS:DATABEGIN:MOVAX,DATAM

34、OVDS,AXMOVCL,4;循环次数送CLMOVCH,CL;保存循环次数LEASI,MASC;ASCII码单元首地址送SICLD;按地址增量方向XORAX,AX;中间结果清零XORDX,DX,DATASEGMENT,NEXT1:LODS MASC;装入一个ASCII码到ALAND AL,7FH;得到7位ASCII码CMP AL,0JLERROR;若(AL)9,则转NEXT2SUBAL,30H;若为数字09,则转换为二进制数JMPNEXT3NEXT2:CMP AL,AJLERROR;若(AL)F,则转ERRORSUBAL,37H;若为数字AF,则转换为二进制数,NEXT1:LODS MASC;

35、装,NEXT3:ORDL,AL;一个数的转换结果送DLRORDX,CL;整个转换结果在(DX)中依次存放DECCHJNZNEXT1;未转换完则转NEXT1MOVWORD PTR MBIN,DX;最后结果送MBINMOVAH,4CH;返回DOSINT21HCODEENDSENDBEGIN,NEXT3:ORDL,AL;一个数,例4-12 把在内存变量NUMBER中的16位二进制数的每一位转换为相应的ASCII码,并且存入串变量STRING中。,DATA SEGMENTNUMBERDW 5E8AHSTRINGDB 16 DUP(?)DATA ENDSSTACKSEGMENT PARA STACK S

36、TACKDB 100 DUP(?)STACKENDSCODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AX,例4-12 把在内存变量NUMBER中的16位二进制数的,LEADI,STRINGMOV CX,16PUSH DIPUSH CXMOV AL,30H;使缓冲区全置为0REPSTOSB POPCXPOPDIMOVAL,31HMOVBX,NUMBER,LEADI,STRING,AGAIN:RCLBX,1;左移BX,相应位进入CF标志 JNCNEXT;若为零则转

37、至NEXT MOV DI,AL;若为“1”,则把“1”置入缓冲区NEXT:INC DI LOOP AGAIN MOV AH,4CH;返回DOS INT 21HCODEENDSENDSTART,AGAIN:RCLBX,1;左移BX,,例4-13 在键盘上输入一个字符串,并在内存中已有的一张表中查找该字符串,若找到则在屏幕上显示“OK!”,否则显示“NO!”,若输入字符长度大于表长度,则显示“WRONG!”。分析:在查找前,首先要判断输入字符串的长度是否大于已有表的长度。若大于则表示输入的字符串太长,显示“WRONG!”。否则才能进行比较。先在表中查找字符串的第一个字符,若找到,再比较字符串的其他

38、字符是否一致。在屏幕上显示一个字符串可用DOS功能调用中的09H号功能;从键盘上接收一个字符串可用DOS功能调用中的0AH号功能。,例4-13 在键盘上输入一个字符串,并在内存中已有的一,DATASEGMENT TABLEDB ABCDEFGHIJKLMNOPQRSTUVWXYZ STRING1DB PLEASE ENTER A STRING:,0DH,0AH,$STRING2DB WRONG!,0DH,0AH,$STRING3DB OK!$STRING4DB NO!$BUFFERDB 40,?,40 DUP(?);键盘输入缓冲区TAB_LENEQU 26DATAENDSSTACKSEGMEN

39、TDB 100 DUP(?)STACKENDSCODESEGMENTASSUME CS:CODE,DS;DATA,ES:DATA,SS:STACK,DATASEGMENT,START:MOVAX,DATAMOVDS,AXMOVES,AXLEADX,STRING1;显示“PLEASE ENTER A STRING:”MOVAH,09HINT21HLEADX,BUFFER;从键盘读字符串MOVAH,0AHINT21HMOVSI,DX;串首地址送SIINCSIMOVBL,SIMOVBH,0;串长度送BXINCSI,START:MOVAX,DATA,LEADI,TABLE;表首地址送DIMOVCX,T

40、AB_LEN;表长度送CXCMPCX,BX;表长串长?JNCGOON;是则转GOONLEADX,STRING2;否则显示“WRONG!”JMPEXITGOON:CLD;按增地址方向进行比较MOVAL,SI;字符串中第一个字符送(AL)SCAN:REPNZSCASB;在表中搜索第一个字符JZMATCH;找到则转MATCHERROR:LEA DX,STRING4;没有找到,显示“NO!”JMPEXIT,LEADI,TABLE,MATCH:INCCXCMPCX,BX;剩余表长串长?JCERROR;不大于,显示“NO!”PUSHCX;保存循环变量PUSHSIPUSHDIMOVCX,BXDECDIREP

41、ZCMPSB;比较串中其余字符POPDI;恢复循环变量POPSIPOPCXJZFOUND;若找到字符串,转FOUNDJCXZERROR;否则,且全表搜索完,显示“NO!”JMPSCAN;全表未搜索完,转SCAN,MATCH:INCCX,FOUND:DECDI;找到的字符串偏移地址送(DI)LEADX,STRING3;显示“OK!”EXIT:MOVAH,09HINT21HMOVAH,4CH;返回DOSINT21HCODEENDSENDSTART,FOUND:DECDI,第六节 汇编语言程序的上机过程,汇编语言程序的上机过程包括四个环节,即源程序编辑、汇编、连接、运行调试。要运行汇编程序,需要有以

42、下几个文件:NE(或其他)全屏幕文本编辑程序MASM 宏汇编程序文件LINK 连接程序文件用NE等全屏幕文本编辑程序将已编写好的汇编语言程序键入计算机,检查无误后,存入磁盘中,文件的扩展名必须为.ASM。用MASM对存入磁盘的源程序(.ASM)进行宏汇编,产生目标程序文件(.OBJ);用LINK对目标程序文件进行连接,产生可执行文件(.EXE),第六节 汇编语言程序的上机过程 汇编语言程序的上机过程包括,例4-14 下面的一个汇编语言源程序为在屏幕上显示数据段中的一串英文字符:How are you!。,DATA SEGMENTSTRINGDB How are you!,$DATA ENDSSTACKSEGMENT PARA STACK STACKDB64 DUP(?)STACKENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOV DS,AXMOVAX,STACKMOVSS,STACK,例4-14 下面的一个汇编语言源程序为在屏幕上显示数据段,MOVDX,OFFSET STRINGMOVAH,09HINT21H MOVAH,4CHINT21HCODE ENDSENDSTART,MOVDX,OFFSET STRING,上机的过程:1.源文件编辑 2.源文件汇编 3.连接 4.执行,上机的过程:,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号