《微机原理章》PPT课件.ppt
1,第四章 汇编语言程序设计,汇编语言程序结构概述4.1 汇编语言的程序格式4.2 汇编语言的伪指令语句4.3 DOS系统功能调用和BIOS中断调用4.4 程序设计基本方法4.5 宏汇编及条件汇编,2,汇编语言程序的处理过程,编辑,源程序:文件名.asm,汇编,目标程序:文件名.obj,链接,可执行程序:文件名.exe,调试,运行应用程序,运行错误,错误,错误,错误,负责把汇编源程序翻译成目标程序的一种系统软件。又称汇编程序。不同汇编器的语法和功能相差很多 MASM(宏汇编)MASM4.0 MASM5.0 MASM6.15 TASM,汇编语言概述,选择汇编编译器是开始工作的第一步,链接:LINK,assembler,3,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件.ASM汇编(编译)目标文件.OBJ链接 可执行文件.EXE调试 最终程序 执行,4,在DOS时代,学习汇编就是学习系统底层编程的代名词,汇编是有特权的语言。WINDOWS就像一堵巨大的墙,把我们和计算机硬件隔离开。对硬件的一些操作被WINDOWS封装到内核中去了。由于保护模式的存在,无法像DOS那样闯入系统内核为所欲为。用汇编语言编制:计算机系统程序、实时通信程序、实时控制程序。WINDOWS下进行加密解密、逆向工程、病毒、木马等有害代码的分析和防治。汇编是唯一的选择。,5,程序设计语言 编译原理(汇编器、解释器、编译器)操作系统形式语言与自动机数据结构、算法,用来控制计算机的动作,语言如何最终控制了计算机的动作-如何把语句变成计算机能”懂”的命令.,计算机如何执行这些动作,程序到底能做什么,不能做什么,怎样能高效地用程序来解决问题,6,例:Hello world!,stacksegment stack;定义堆栈段 dw 512 dup(?)stackends;堆栈段结束datasegment;定义数据段stringdb Hello,world!db 0dh,0ah,$dataendscodesegment;定义代码段 assume cs:code,ds:data,ss:stackstart:mov ax,data;建立DS段地址 mov ds,ax mov dx,offset string mov ah,9 int 21h mov ah,4ch int 21h;利用功能调用返回DOScode ends;代码段结束 end start;程序结束汇编结束,同时指明;程序起始点,7,段定义、段分配、设置段地址、返回DOS语句及程序结束。汇编源程序由若干段组成,每个段有段名,可为代码段、数据段、堆栈段、附加段。只有代码段是必不可少的,其他类型段可根据程序实际需求决定是否需要。每一段由若干语句行组成。每一行语句有4个字段 名字或标号 操作码 操作数;注释代码段中要有实现退出程序返回DOS系统的语句。整个源程序以END语句来结束,主程序的END语句要指明程序的入口,汇编语言的程序结构,8,汇编语言源程序结构,数据段名 SEGMENT 数据段名 ENDS附加段名 SEGMENT 附加段名 ENDS,堆栈段名 SEGMENT 堆栈段名 ENDS代码段名 SEGMENT 代码段名 ENDS END,9,一、语句的种类和格式,指令语句由CPU指令系统中的指令构成语句,能够生成目标代码(机器码),只出现在程序的代码段中。标号:前缀 指令助记符 操作数,操作数;注释伪指令语句由汇编程序汇编源程序时处理的语句。没有对应的机器码。可完成汇编程序结构的定义、数据的定义和存储区的分配。名字 伪指令助记符 操作数,操作数;注释,指令的符号地址,标号后要有冒号,常量名(符号名)、变量名、段名或过程名,其后不加冒号,4.1 汇编语言程序语句的格式,10,标号和名字的 命明规则:,以字母开头由字母AZ(不分大小写)、数字(09)及部分特殊字符(?$和 下划线_等)组成字符串长度不超过31个标识符不能是汇编语言中有特定意义的保留字、助记符、Reg等。,11,二、操作数(数据项、表达式),指令语句的操作数可以是立即数、寄存器和存储器操作数及变量、标号或表达式。伪指令的操作数可以是常数、变量、表达式等,可以有多个,参数之间用逗号分隔。语句操作数有更丰富的表达方式方便:操作数的表示要能充分体现出汇编语言中使用符号操作数和指令助记符的优越性,使程序员能尽可能地减少在存储分配和地址计算方面的工作。本质没变:要能被汇编程序有效地翻译成对应的特定处理器所具有的各种寻址方式。,12,1、常量:汇编时已有确定数值的量,在程序运行期间也不会变化,即固定的值。用于做立即数、端口地址、存储器操作数的组成部分或数据定义语句中给变量赋初值。数字常量:300(300D),01001011B,0A4H 字符串常量:单引号内的12个字符;A=41H,AB=4142H 多于两个字符的字符串。ABC(只能在DB 指令中用),13,变量:专指存放在存储单元中的数据,数据的值是可变的。在程序中以变量名形式出现,是数据在内存中存放地址的符号表示。标号:某条指令的符号地址。是程序转移指令的操作数。变量和标号都和存储器地址相关连。变量和标号都具有三种属性:段属性、偏移量属性、类型属性 变量类型:字节(BYTE)、字(WORD)、双字(DWORD),四字,十字。标号的类型(距离属性):NEAR、FAR,缺省类型为NEAR。,2、变量、标号(存储器操作数),14,3、表达式操作数,表达式用来做操作数表达式由运算符、操作符和运算对象组成运算对象:常量、变量、标号、各种存储器寻址方式运算符、操作符:IBM宏汇编中有5种运算符表达式的值:运算结果。表达式不是指令,由汇编程序对源程序进行汇编时运算,结果作为操作数参加指令规定的操作。,15,IBM宏汇编中有5种运算符,即:算术运算符(Arithmetic operators)逻辑运算符(Logical operators)关系运算符(Relational operators)数值返回(分析运算符,Analytic operators)修改属性(合成运算符,Synthetic operators)其他运算符 方括号:寻址()圆括号:改变运算符优先级,16,表达式运算结果的类型(汇编语言中有2种)数值表达式:在汇编时产生一数值,仅具有大小而无其他属性。可作为指令中的立即数和数据定义伪指令中数据区中的初值使用。地址表达式:它表示存储器地址,地址中存放和数据和指令。具有变量和标号的三种属性。,17,一、数据定义伪指令语句,格式:变量名 数据定义符 操作数,操作数 功能:为某一类型的数据项分配存储单元;可用一个变量名做存储单元的名称(变量名具有三种属性),该变量名指向所分配空间的首单元地址;空间大小由操作数部分决定,也可由操作数初始化存储单元。,初值表,DBDWDD,DQ 定义的变量为4字型(8字节)DT 定义的变量为10字节型,可选的,18,初值表,初值表:用来给出要申请 内存空间的大小,和初值 的多个数据(用逗号分隔)。主要由数值常数、表达式、字符串、?、DUP等组成?表示初值不确定,即未赋初值,实际为0;DUP重复操作符。表示重复初值。,19,数据定义语句的具体形式和功能1、X DB 25H Y DW 4142H Z DD 12345678H A DB?B DW?2、B_TABLE DB 1,4,2,7,16 W_TABLE DW 1122H,3,20,1、算术运算符+-*/MOD 运算对象:常量、标号、变量 可构成数值表达式或地址表达式例:3+4 19 MOD 7 结果为数值 197 L2-L1 同一段内两个标号相减,结果为数值 B_TABLE+1 Y-1,只能做+-,结果为存储单元的地址,MOV AL,B_TABLE+1,21,2、逻辑运算符 AND、OR、XOR、NOT运算对象:只能是常数,结果为数值例 10101010B AND 00001111B=00001010B NOT 11111111B=00000000B AND DX,0ADH AND 0EAH 1111 0000B XOR SUM,22,3、关系运算符运算对象:同为数值,或为同一段内的存储器地址(变量)结果为一数值:关系不成立 为 0 关系成立 为 0FFFFH例:3 GT 4 SUM1 LT SUM2 一般关系运算符和逻辑运算符组合使用 AND BX,(PORT LT 5)AND 30,EQ(=)NE()LT()GT()LE()GE(),23,对存储器操作数的属性进行操作,4、数值返回运算符(分析)5、修改属性运算符(合成)6、其他运算符:表示地址表达式或多重变量的下标值 BX+2、M10、M13,24,25,4.2 伪指令语句,宏汇编中的伪指令语句:数据定义语句 DB、DW、DD表达式赋值语句(符号定义)EQU、PURGE、=段定义语句 SEGMENT、ENDS ASSUME过程定义语句 PROC、ENDP程序开始和结束语句 NAME ORG END功能:变量定义、存储器分配、指示程序开始和结束、段定义、段分配等。简单了解4.2.6、内容,26,一、数据定义语句,格式:变量名 助记符 操作数,操作数 功能:将操作数存入变量名指定的存储单元中,或者只分配存储空间不存入数据。为某一类型的操作数分配存储单元;可用一个变量名做存储单元的名称(变量名具有三种属性),该变量名指向所分配空间的首单元地址;操作数:可以是常数、字符串、变量、标号、表达式等。多个操作数用逗号分隔。操作数给出要申请 内存空间的大小,和初值,DBDWDD,DQ DT,可选的,n DUP(操作数,操作数),27,数据定义语句的具体形式和功能1、操作数是常数或表达式 X DB 25H Y DW 4142H Z DD 12345678H A DB?B DW?B_TABLE DB 1,4,-2,7,16 W_TABLE DW 1122H,3*20H,见例4.21,见例4.19,28,2、定义字符串,STRING1 DB A,B,C,D STRING2 DB ABCD,41H,当字符串长度为两个字符时,也可以 用 DW来定义。例:STRING1 DBAB STRING2 DWAB STRING3 DWAB,CD,注意:3个及其以上的字符,只能用DB定义。例:str1 DW abc str2 DD abcd,见例4.20,29,3、重复数据定义操作符 DUP,格式:重复次数 DUP(重复参数)功能:为一个数据区的各单元设置相同的初值例:ALL_ZERO DB 0,0,0,0 ALL_ZERO DB 4 DUP(0)DW 20 DUP(0)DB 3 DUP(22H,11H,?)DB 3 DUP(1,2,3 DUP(0),见例4.22,30,4、当操作数是变量和标号或表达式时可用DW或DD将标号或变量操作数的偏移地址或全地址存入存储器。例:ONE DW DEMO1,DEMO1+3;偏移地址 TWO DD DEMO1;全地址 为数值表达式时 DEMO6 DW DEMO5-DEMO4,注意:变量名在不同场合的用法。,见例4.23,31,5、变量名及其表达式作指令语句的操作数,DEMO1 DB 3 DEMO2 DB 5,7,8,mov al,demo2 mov bl,demo2+2lea bx,demo2 add demo2,2 INC DEMO1;字节加 mov al,demo2bx,一个变量名加/减一个数字后形成新的变量,有相同的类型,变量所指存储单元与原单元地址不同,,类型要匹配,见例4.24,32,二、表达式赋值语句,1、等值语句 EQU格式:符号名 EQU 表达式 功能:给表达式赋予 一个名字。表达式可以是其它的符号名,常量,变量、标号、指令、寄存器名、表达式等。但并不申请内存空间。例:SUM EQU 1 SUM2 EQU SUM+1 A1 EQU BX+SI LD EQU MOV SUM3 EQU SUM2 PORT1 DB 35H;事先定义好的变量 OUT_PORT EQU PORT1;再起个别名,33,2、解除语句 PURGE格式:PURGE 符号1,符号2,符号n例:SUM EQU 212 PURGE SUM SUM EQU 3133、等号语句=格式:名字=参数 功能:与EQU类似,但可对符号再定义例:SUM=1 SUM=2 SUM=SUM+1;SUM=?,34,功能:用于返回变量或标号(存储器操作数)的属性格式:运算符 标号或变量 OFFSET 析取变量或标号的偏移地址 SEG 析取变量或标号的段基址 TYPE 取变量和标号的类型(见表4.2)LENGTH 取所定义变量所包含的元素个数 SIZE 取所定义变量包含的总字节数 LENGTH*TYPE,数值返回运算符,35,例:DEMO1 DW 3,4 DEMO2 DW 6 DUP(9)MOV AX,SEG DEMO1 MOV DS,AX MOV BX,OFFSET DEMO1;LEA BX,DEMO1 MOV BX,TYPE DEMO1;1 MOV CX,LENGTH DEMO2;6 LENGTH DEMO1;1 SIZE DEMO1;1 LEA BX,DI MOV BX,OFFSETDI,36,1、PTR 运算符功能:PTR是类型运算符,它用来说明其后变量或标号的类型。使其临时兼有与原定义所不同的类型属性。但它们原来的段属性和偏移地址属性保持不变。格式:类型 PTR 地址表达式,标号、变量及各种存储器寻址方式,根据地址表达式的不同性质,类型可以是BYTE、WORD、DWORD、NEAR、FAR等。,修改属性(合成)运算符 PTR、THIS 由已存在的存储器操作数生成一个段值和偏移量相同,而类型不同的新的存储器操作数。,37,例:ADD BYTE PTRDI,23HDATA SEGMENT BUF1 DB 30H,60H DATA ENDS L1:MOV AL,BUF1;AL=30H MOV AX,WORD PTR BUF1;AX=6030H BUF2 EQU WORD PTR BUF1 MOV AX,BUF2JMP FAR PTR L1,类型要匹配,38,2、THIS格式:THIS 类型功能:为当前存储单元指定一个新的属性。使用方法:标号或变量名 EQU THIS 类型例:BUF1 EQU THIS BYTE BUF2 DW 1,2,3,4;BUF1是由BUF2新建的存储器操作数,但类型不同。L1 EQU THIS FAR MOV AL,30H JMP L1;在其他段远跳到L13、SHORT 标号 4、段前缀 MOV AX,ES:BX5、HIGH/LOW,它后面能分配的第一个存储单元。,39,指示汇编程序如何按段来组织程序和使用内存区域。SEGMENT/ENDS,ASSUME,ORG,GROUP1、段定义伪指令SEGMENT ENDS 格式:段名 SEGMENT 定位类型 组合类型 分类名 段名 ENDS 段名不可省略,隐含该段的首地址,即段基址,三、段定义语句,SEG1 SEGMENT SEG1 ENDS MOV AX,SEG1 MOV DS,AX,逻辑段内容,即语句序列,40,参数用来增加类型及属性说明定位类型:确定逻辑段的起始边界地址。4种。缺省为PARA,段首址 XXXX0H组合类型:确定在不同模块程序中同名段的组合连接方式。6种。缺省为NONE,独立 通常堆栈段定为 STACK,会自动初始化SS和SP。覆盖方式组合。AT 表达式,由表达式指定段首址的高16位。xxxx0H,但不能用来指定代码段。类别名:为单引号括的字符串。不同模块连接时将相同类别的段组成一个段组,放在连续的内存区域中。如stack,code,data,也可为其它名。,STACK1 segment stack DW 100 dup(0)STACK1 ends,41,PARA:不要搭接,段的起点从节边界开始(16个字节为1节)BYTE:段的起点从存储器任何地址开始WORD:允许搭接,段的起点从偶地址开始PAGE:段的起点从页边界开始(256个字节 为1页),定位类型,42,组合类型,与其它模块中的同名段在满足定位类型的前提下具有的组合方式:NONE:不组合PUBLIC:依次连接(顺序由LINK程序确定)COMMON:覆盖连接STACK:堆栈段的依次连接,且自动初始化SS和SP。AT 表达式:段定义在表达式值为段基的节边界MEMORY:相应段在同名段的最高地址处。,43,2、段分配语句ASSUME,格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名,功能:定义4个逻辑段,指明段寄存器与段的关系。通知 MASM 用指定的段寄存器来寻址对应的逻辑段。但ASSUME伪指令并未真正将段基址装入相应的段寄存器。ASSUME ES:NOTHING 也可取消关系,44,?段寄存器如何赋值连接程序LINK 和DOS将正确设置CS:IP。DS、ES中的段基址是在程序开头部分写相应的赋值代码(段初始化程序),在执行代码时装入的。堆栈段的定义和SS、SP赋值的几种情况:1、程序中定义堆栈段,并给该段设置了组合类型参数为 STACK,则LINK程序会自动给SS与SP 赋值。用户不用再赋值了。2、程序中定义堆栈段,但没给该段设置组合类型参数 STACK,则要在主程序开头部分写代码给SS与SP赋值。3、不定义堆栈段,连接程序会自动为程序设置堆栈段,位置在程序段前缀里。但堆栈空间大小有限。,45,DATA1 SEGMENT X DB 16 DUP(5)DATA1 ENDSDATA2 SEGMENT Y DB 32 DUP(3)DATA2 ENDSSTACK SEGMENT STACKSTT DB 100 DUP(?)TOP EQU LENGTH STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2,SS:STACKSTART:MOV AX,DATA1 MOV DS,AX,例:,把段基址赋给DS,MOV AX,DATA2 MOV ES,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV BL,X;MOV BL,0000H MOV CL,Y;MOV CL,ES:0000H CODE ENDS END START,把段基址赋给ES,把段基址赋给SS,并设SP的值,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是 ASSUME 伪指令的主要功能。,46,格式:END 标号或 过程名功能:,四、程序开始和结束语句 NAME、ORG、END 1、END,是汇编结束的标志;指明主程序执行时,第一条要执行的指令的地址。用在子模块时不能带参数,47,2、ORG格式:ORG 偏移地址值功能:段内数据从偏移地址处开始分配空间例:DATA SEGMENT ORG 0004H BUF1 DB 5DUP(08H)ORG 000CH BUF2 DB 3 DATA ENDS,DATA,BUF1,08H,08H,08H,08H,08H,0004H,3,000CH,BUF2,48,五、过程定义语句格式:过程名 PROC 类型 RET 过程名 ENDP 过程名代表过程中第一条要执行的指令的地址过程被CALL语句调用 NEAR 为段内调用和段内返回 FAR 为段间调用和段间返回 过程中一定要有RET语句,它是该过程执行时最后一条被执行的指令。过程是模块式程序设计的基础,NEARFAR,过程体,49,CODE SEGMENT ASSUME CS:CODE,START:.MOV AH,4CH INT 21HPRO1 PROC P1:.RETPRO1 ENDPPRO2 PROC P2:.RETPRO2 ENDPCODE ENDSEND START,非标序时程序结构,CODE SEGMENT ASSUME CS:CODE,MAIN PROC FAR L1:PUSH DS MOV AX,0 PUSH AX RET START ENDPPRO1 PROC P1:.RETPRO1 ENDPPRO2 PROC P2:.RETPRO2 ENDPCODE ENDSEND MAIN,标准序时程序结构,主程序,主程序,子过程,子过程,子过程,子过程,50,伪指令小结伪指令不是可执行指令,不翻译成机器码。在汇编时起到帮助汇编程序正确汇编硬指令的作用。但数据定义伪指令汇编后要产生目标码。是对申请的内存空间进行初始化的数据。最后生成的*.EXE 文件由数据和机器码组成。指令只能写在代码段,而伪指令可以写在任意一个段。,51,一个完整汇编程序的要点:1、段的定义:数据,堆栈,代码2、代码段的功能结构要点:程序的结构:由主程序(主过程)和若干子过程构成始点:主程序要执行的第一条指令性语句;END 始点如有必要需给DS、ES、SS(SP)段寄存器赋值;主程序结束时,要有退出程序返回DOS的语句;,52,解释:数据定义语句的分配内存空间并初始化是如何实现的?,53,my_data segment buf db 16 dup(01h)my_data ends my_stack segment stack db 16 dup(0)my_stack ends my_code segment assume cs:my_code,ds:my_data,ss:my_stackL1:mov ax,data mov ds,ax int 20h my_code ends end L1,01h 01h 01h 01h 01h 01h 01h 01h 01h 01h 01h01h 01h 01h01h01h 00h00h00h00h 00h00h00h00h 00h00h00h00h 00h00h00h00h B8 机器码.,汇编时生成的,54,解释:数据定义语句的分配内存空间并初始化是如何实现的?,程序段前缀256个字节,返回DOS的指令,程序的数据与机器码,DOS把它装入内存执行,数据堆栈代码,内存,存放在硬盘里的*.EXE,1,2,4,3,55,实验2:两个组合BCD数的相乘.,DATA SEGMENT A1 DB 54H A2 DB 61HSUM DW 0000HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX MOV AL,0 MOV CH,0 MOV CL,A2 LEA BX,SUMAGAIN:MOV AL,BX ADD AL,A1 DAA MOV BX,AL,MOV AL,BX+1 ADC AL,0 DAA MOV BX+1,AL MOV AL,CL SUB AL,1 DAS MOV CL,AL OR CX,CX JNE AGAIN MOV AH,4CH INT 21H CODE ENDS END START,LEA BX,STRING1 MOV CH,4 MOV AX,SUM MOV CL,4L1:ROL AX,CL MOV DL,AL AND DL,0FH OR DL,30H MOV BX,DL INC BX DEC CH JNE L1 LEA DX,STRING1 MOV AH,09H INT 21H,STRING1 DB 4 DUP(0),$,输出结果的代码,56,当程序中要使用键盘、显示器、打印机或串口等硬件设备进行 I/0(输入输出)时,要编制相应的程序段来实现这些功能。可直接调用DOS、ROM-BIOS提供的I/O功能(一些子程序)。以中断服务程序的形式提供。,中断向量号 中断向量 中断服务程序的入口地址,4.3 DOS功能调用、ROM-BIOS调用,57,调用步骤:给出入口参数。在指定寄存器中设置入口参数(根据所调功能的规定设置)在AH中设置子程序编号(功能号)发软中断命令:INT N常用的有INT 21H(DOS)或 INT 10H(BIOS),相应的中断服务程序运行完返回后,可按规定取得出口参数(返回值)。,58,DOS常用软中断INT 20HINT2FH其中 21H 中断号称为DOS系统功能调用。退出程序软件中断 INT 20H INT 27H INT 22H、INT 23H、INT 24H MOV AH,4CH INT 21H,59,DOS的系统功能调用,中断向量号为21H的中断服务程序。该程序对应100多个子程序,每个子功能由功能号来区分。我们这里只讲其中的一个字符的输入输出、字符串的输入输出。(DOS键盘和显示功能调用)功能号:一个字符的输入 01H 输出 02H 字符串的输入 0AH 输出 09H,60,1、一个字符的输入功能号:AH=01H出口参数:AL中存放输入的字符的ASCII码功能:等待键盘输入,直到按键后才读取该键 值,并在当前光标位置显示(除Ctrl-Break外)。例:MOV AH,1 INT 21H CMP AL,Y JNE L1 L1:,DOS键盘功能调用,61,2、一个字符的输出功能号:02H入口参数:DL=字符的ASCII码功能:在当前光标位置显示给定字 符,且光标右移一格。例:MOV AH,02HMOV DL,1INT 21H,DOS显示功能调用,62,3、字符串的输入功能:从键盘接收字符串存入以DS:DX为首址的内存缓冲区,同时显示该字符,输入过程以回车键结束。多输入的字符无效。功能号:AH=0AH入口参数:DS:DX 指向用户定义的内存空间。,DATA SEGMENT BUF DB 10 LEN DB?STRING DB 10 DUP(?)DATA ENDSMOV AX,DATAMOV DS,AXLEA DX,BUF MOV AH,0AHINT 21H,预先填入最多要输入的字符个数(包括 回车)实际输入的字符个数(不包括回车)存放输入的字符串(包括 回车),注意内存空间的定义方法,例:,按如上规定,此例最多可输入9个字符,(0255),DOS键盘功能调用,63,4、字符串输出功能:将一个以$字符结束的字符串(不包括$)输出到显示器。功能号:AH=09H入口参数:DS:DX指向欲显示字符串的首地址。字符串必须以$结束。字符串中可加回车(0DH)、换行(0AH)字符,以产生回车换行的作用。例:STRING DB HOW ARE YOU,0DH,0AH,$.MOV AH,09H LEA DX,STRING INT 21H,DOS显示功能调用,64,DATA SEGMENT BUF DB 10 LEN DB?STRING DB 10 DUP(0)DATA ENDSMOV AH,0AHLEA DX,BUF INT 21H MOV AH,02H MOV DL,0AHINT 21HMOV BL,LENMOV BH,0MOV STRINGBX,$LEA DX,STRINGMOV AH,09HINT 21H,10 7 W E L C O M E 0dh 0 0,输入字符的ASCII 码,BUF LEN STRING,例:输入字符串。并换行输出该字符串,回车,65,ROM-BIOS的功能调用,中断向量号10H为视频显示I/0。功能号:设置光标位置 02H 清除屏幕 06H 控制光标的大小和显示与否 01H,(10H1FH),66,ROM BIOS 中断调用5、设置光标位置 功能号:AH=02H 入口参数:光标位置(行,列)DH=行,DL=列页号 BH=0;例:MOV AH,02H MOV DH,15 MOV DL,30;(15,30)MOV BH,0 INT 10H,(0,0),(24,79),显示屏,可显示25行,80列字符,67,6、清除屏幕功能号:AH=06H入口参数:清屏区域的左上角坐标 CH,CL=行,列 清屏区域的右下角坐标 DH,DL=行,列 显示属性 BH AL=0 清屏例:MOV CX,0000H MOV DX,184FH MOV BH,70H MOV AL,0 MOV AH,06H INT 10H,68,例:输入字符串,在清出的屏幕区域反显。,DATA SEGMENT BUF DB 10 LEN DB?STRING DB 10 DUP(0)DB$DATA ENDSMOV AH,0AHLEA DX,BUF INT 21H MOV AH,06H MOV CX,0505H;(5,5)MOV DX,0A10H;(10,16)MOV BH,70H;白底黑字MOV AL,0 INT 10H;清屏,MOV AH,02HMOV DH,5MOV DL,5;(5,5)MOV BH,0INT 10H;设置光标位置LEA DX,STRINGMOV AH,09HINT 21H;显示,69,4.4 汇编语言程序设计及举例,一、程序设计的一般步骤汇编语言程序设计基本上与高级语言程序设计一样,一般步骤:1分析问题并抽象出数学模型。2确定最佳算法。3画出程序流程图。4合理分配内存单元和合理的使用寄存器,并了解I/O接口地址。5编程并调试。(有时需要用注释行说明程序,便于阅读和修改。),二、评价程序质量的标准1合理组织数据,发挥存贮器、Reg的作用。2程序逻辑结构好,便于二次开发。3可读性强。4高可靠性和可维护性。5效率高(代码少)。,70,算法设计 解题步骤的流程图算法实现 编程,程序的基本结构:顺序分支(选择)循环子程序设计与调用技术字符串处理码转换,71,一、顺序结构程序,按事件发展的先后,选择合适的指令有序地加以组合。例:见教材P165 例4.55,72,二、分支结构程序,用转移指令实现分支(选择),分支2,分支1,分支N,出口,判定条件,73,条件满足,分支体语句,N,Y,条件满足,分支体语句1,N,Y,分支之体语句2,JMP,单分支结构,双分支结构,74,例 1:单分支 DATA SEGMENT D1 DW-123;补码FF85H D2 DW-120;补码FF88H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN:MOV AX,DATA MOV DS,AX MOV BX,D1 CMP BX,D2 JGE NEXT MOV BX,D2 NEXT:MOV AH,4CH INT 21H CODE ENDS END BEGIN,例 2:双分支 DATA SEGMENT D1 DW-123;补码FF85H D2 DW-120;补码FF88H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN:MOV AX,DATA MOV DS,AX MOV BX,D1 CMP BX,D2 JGE L1 MOV AX,0 JMP DONE L1:MOV AX,0FFFFH DONE:MOV AH,4CH INT 21H CODE ENDS END BEGIN,75,JCC条件满足,分支体语句1,N,Y,分支体语句2,分支之体语句3,JCC条件满足,N,JMP,Y,JMP,三分支结构,(三分支)MOV AL,XX CMP AL,0JGE GE LESS:MOV AL,-1 JMP SET GE:JE EQUL BIGER:MOV AL,1 JMP SET EQUL:MOV AL,0 SET:MOV YY,AL,76,判断某一个数的特征的方法:cmp ax,0 sub ax,0 add ax,0 or ax,ax and ax,ax 不改变数本身的值,但可以设置标志位,反映数的特征。,77,进行分选,按类计数09 30H39HDHA Z 41H5AHDL其它N-DH-DL次数计数CH数据指针BX,P172例4-65:在以BUF为首地址的内存,存放着一个长度为N(N256)的字符串,编程统计其中数字,字母和其它字符的个数,统计数存放在串后三个单元中。,78,初始化:N送CX;0送DX;0送BX;BX为串偏移量,MOV AL,BUFBX,79,2.多分支:串联测试法,N次判断形成N+1路分支。,。,80,有的分支结构为多分支,可依次测试条件是否满足,若满足条件则转入相应分支入口,若不满足继续向下测试,直到全部测试完。简单,直观,速度慢。,例4-66:有8个加工子程序,入口地址分别为P1,P2,P8。编程实现检测键盘输入命令,使系统分别转向8个加工子程序。,MOV AH,1 INT 21H;1号功能调用,键盘输入 CMP AL,1 JE P1;键值为1,转P1 CMP AL,2 JE P2;键值为2,转P2 CMP AL,8 JE P8;键值为8,转P8 JMP ST;非法键,转停机P1:;1号键加工子程序 P2:;2号键加工子程序 P8:;8号键加工子程序 ST:HLT,优点:编程简单缺点:速度慢,81,3、跳转表实现多分支,利用跳转表实现多分支,可以直接找到相应入口,利用该法需建立一个跳转表,表中含每个分支的入口地址。,(1)根据表内地址分支 跳转表中存放了每个分支程序的入口地址,只要找到表地址,再将其内容取出,即可得到每个分支程序的入口地址。表地址=跳转表首址+偏移地址,AND AL,0FH ADD AL,AL,ADD BX,AX,JMP WORD PTR BX,MOV BX,OFFSET BASE,82,跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去。,MOV AH,1;键入到ALINT 21HAND AL,0FHMOV AH,0MOV BL,ALADD AL,ALADD AL,BL;偏移量=键值*3MOV BX,OFFSET BASEADD BX,AX;得转移地址JMP BX;转入转移指令,(2)根据表内指令分支,转移指令跳转表,83,(3)根据关键字分支,关键字跳转表,分支流程图,跳转表中存放关键字及相应分支地址。,84,例4-68:首地址为BUFFER的数组已按升序排好,长度为N(=10),在数组中查找数M(=80),若找到则从数组中删掉,否则将它插入正确的位置,DX中记录数组最后的长度。,98,AX CX=9,AX CX=8,AX CX=7,AX CX=6,AX CX=5,AX CX=4,AX CX=3,AX CX=2,AX CX=1,AX CX=0,AX=80 CX=10 DX=10,AX BUFFERSI,90,82,AX BUFFERSI-2,AX BUFFERSI-2,80,DX=11,AX BUFFERSI-2,数组中无M,寻找插入位置SI=2*(DX1)CMP AX,BUFFERSI,搜索有无关键字MOV DI,OFFSET BUFFERCLDREPNE SCASW,元素下移MOV BX,BUFFERSIMOV BUFFERSI+2,BX,插入MOV BUFFERSI+2,AX,85,AX CX=9 DI=BUFFER+2,AX CX=8 DI=BUFFER+4,AX CX=7 DI=BUFFER+6,AX CX=6 DI=BUFFER+8,AX CX=5 DI=BUFFER+A,AX CX=4 DI=BUFFER+C,AX CX=3 DI=BUFFER+E,AX=CX=2 DI=BUFFER+10H,AX=80 CX=10 DI=BUFFER,90,98,BX=DI=(BUFFER+10H)DI-2 CX-1=1,BX=DI+2=(BUFFER+12H)DI-2 CX-1=0,DX=9,数组中有数M,搜索有无关键字MOV DI,OFFSET BUFFERCLDREPNE SCASW,搜索到,后续元素前移MOV BX,DIMOV DI-2,BXADD DI,2,86,初始化:M送AX;N送CX,DX;地址偏移量送DI;增量修改指针 CLD,87,DATA SEGMENT BUFFER DW 5,10,32,47,53,77,89,106,115,124 N DB 10 M EQU 80DATA ENDSCODE SEGEMENT ASSUME CS:CODE,DS:DATA,ES:DATAMAIN PROC FARSTART:PUSH DS SUB AX,AX PUSH AX MOV AX,DA