微机原理-04_汇编语言程序设计_第1页
微机原理-04_汇编语言程序设计_第2页
微机原理-04_汇编语言程序设计_第3页
微机原理-04_汇编语言程序设计_第4页
微机原理-04_汇编语言程序设计_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

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

文档简介

第4章 汇编语言程序设计,4.1 汇编语言的基本语法 4.2 伪指令 4.3 操作系统资源的使用4.4 汇编程序设计 4.5 子程序设计,三层语言结构: 用来编写计算机程序的语言,即程序设计语言,包括机器语言,汇编语言和高级语言,分别位于三个层次。(1)机器语言 机器语言是位于最底层的程序设计语言,是使用二进制代码表示的指令系统,用机器语言编写的程序称为目标程序; 难理解,难记忆,易出错。,(2) 汇编语言 是一种面向指令系统的程序设计语言,它采用指令助记符来表示操作码和操作数,给程序编写带来了很大方便。程序设计人员可以直接对存储器、CPU内部寄存器和输入/输出端口编程,程序效率高,执行速度快。汇编程序要被编译成机器语言程序,才能被计算机执行。缺点: 但是汇编语言要求程序员必须了解计算机的硬件,并对计算机的指令系统比较熟悉;另外不同计算机之间的汇编语言程序难以移植。,(3) 高级语言 高级语言是一种面向问题或过程的语言,它独立于机器,其编写的程序是可以移植的。高级语言的一个语句相当于许多条汇编语言指令或机器语言指令,高级语言编写的程序也必须编译成机器语言后才能执行,实现这种编译的程序叫做“编译程序”,不同的高级语言有不同的编译程序。用汇编语言或机器语言编写的程序称为“源程序”.,4.1 汇编语言的基本语法,在计算机上运行汇编语言程序的步骤是:(1) 用编辑程序建立 .ASM源文件;(2) 用汇编程序把 .ASM文件转汇编成 .OBJ文件;(3) 用链接程序把 .OBJ文件连接成.EXE文件;(4) 用DOS命令直接键入文件名就可执行该程序。 常用的汇编程序: MASM TASM 操作流程如图所示,4.1.1汇编程序的建立过程,汇编语言程序的建立及汇编过程,汇编程序的主要功能是: (1) 检查源程序语法是否正确。 (2) 测出源程序中的语法错误,并给出出错信息。 (3) 产生源程序的目标程序,并可给出列表文件 (同时列出汇编语言和机器语言的文件,称 为.LST文件)。 (4) 展开宏指令。,建立汇编语言的工作环境为运行汇编语言程序,至少要在磁盘上提供以下文件:(1) 编辑程序,如EDIT.EXE;(2) 汇编程序,如MASM.EXE;(3) 连接程序,如LINK.EXE;(4) 调试程序,如DEBUG.COM。必要时,还要提供CREF.EXE、EXR2BIN.EXE等文件。,4.1.2 汇编语言程序格式 【例】 给出一个完整的汇编语言源程序,该程序的功能是完成两个字节数据相加。DATASEGMENT ;段定义开始(DATA段)BUF1DB34H ;第1个加数BUF2DB2AH ;第2个加数SUMDB? ;准备用来存放和数的单元DATAENDS ;段定义结束(DATA段)CODESEGMENT ;段定义开始(CODE段)ASSUME CS:CODE, DS:DATA ;规定DATA、CODE分别为数据段和代码段,START: MOV AX,DATA MOV DS,AX ;给数据段寄存器DS赋值 MOV AL,BUF1 ;取第1个加数 ADD AL,BUF2 ;和第2个加数相加 MOV SUM,AL ;存放结果 MOV AH,4CH INT 21H ;返回DOS状态 CODE ENDS ;段定义结束(CODE段) END START ;整个源程序结束,完整段定义的程序结构 存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。为此,需要用段定义伪操作,其格式如下:,此外,还必须明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为ASSUME :段名,:段名,.ASSUME :NOTHING其中,段寄存器名必须是CS、DS、ES和SS(对于386及其后继机型还有FS和GS)中的一个,而段名则必须是由SEGMENT定义的段中的段名。ASSUME NOTHING则可取消前面由ASSUME所指定的段寄存器。,例如,下面是一个较为完整的汇编源程序段定义。DATE_SEG1 SEGMENT;定义数据段 DATE_SEG1 ENDSDATA_SEG2 SEGMENT;定义数据附加段 DATA_SEG2 ENDSCODE_SEG SEGMENT ; 定义代码段ASSUME CS:CODE_SEG, DS:DATA_SEG1, ES:DATA_SEG2START: ;开始执行的入口地址,;设置DS寄存器为当前数据段 MOV AX,DATA_SEG1 ;将数据段地址赋予DS MOV DS,AX;设置ES寄存器为当前附加段 MOV AX,DATA_SEG2; 将附加数据段地址赋予ES MOV ES,AX CODE_SEGENDS ;代码段定义结束 END START ;源程序结束,由于ASSUME伪操作只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,要把段地址装入段寄存器中,就必须在代码段中有对段地址装入相应的段寄存器中的指令。如在上面的程序中,分别用两条MOV指令完成这一操作。如果程序中有堆栈段,也需要把段地址装入SS中。但是,代码段CS不需要这样做,这一操作是在程序初始化时完成的。,从上面这个例子可以看出,汇编语言源程序由若干条语句组成,语句分为如下两类。 1. 指令语句 指令语句能完成一定的操作功能,能够翻译成机器代码的语句。 指令语句的格式为: 【标号:】 指令助记符 【操作数】 【;注释】,4.1.3汇编语言程序的语句类型,2. 伪指令语句 伪指令语句也叫指示性语句,它只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码,所以也不占用执行时间。 伪指令的格式为: 【符号名】 伪指令定义符 【参数表】 【;注释】 实际上,汇编语言源程序中还可出现宏指令语句。宏指令语句就是由若干条指令语句形成的语句体。一条宏指令语句的功能相当于若干条指令语句的功能。,1) 操作码 操作码用来指明操作的性质或功能,指令中的助记符都是操作码。操作码与操作数之间用空格分开,如MOV、ADD等都是操作码。2) 操作数 指令中的操作数是用来指定参与操作的数据。可以有一个或两个操作数,也可以没有操作数;对于伪指令和宏指令,可以有多个操作数,操作数之间用逗号分开。操作数可以是常数和表达式。3) 注释项 注释是用来增加程序的可读性。汇编源程序时,注释部分不产生机器代码。,4.2.1 常量 1常量的类型 常量是汇编时已确定的值,在程序运行中,常量的值不会改变。例如,立即寻址时所用的立即数,直接寻址时所用的地址等都是常量。 (1)数值型常量 二进制数:例如:10101001B 十进制数:例如:5678、3421D 十六进制数:以字母H结尾,例如:0ABH, 0EFB0H凡是以字母AF开头的十六进制数,必须在字母前加上数字0。,4.2 伪指令,(2)字符串常量 字符串是用单引号或双引号括起来的一个或多个字符 例如:ABC ,“ABC”,d字符在机器内是以ASCII存放。 B 在内存中为42H b 在内存中为62H 2常量或表达式赋值伪指令(EQU, =)可以用赋值伪指令给常量或表达式赋于一个新的符号。以后,程序中凡是需要用到该常量或表达式的地方就可以用这个符号名来代替。,(1)等值伪指令(EQU) SUM EOU 34H NUM EQU EBP+31H EQU语句不允许对符号重复定义 (2)等号伪指令 MATH=20H ENG=3 ENG=MATH+ENG+10H 等号语句允许对符号重复定义。,4.2.2 变量 变量用来定义存放在存储单元中的数据。变量名是存放数据的存储单元的地址,变量的值是对应存储单元的内容。 1. 变量的属性 段属性(SEG):变量所在段的段基址,它通常放在DS、ES、SS段寄存器中。 偏移属性(OFFSET):从变量所在段的起始地址到定义变量位置之间的字节数。对于16位的段,则是16位的无符号数;对于32位的段,则是32位的无符号数。,类型属性(TYPE):指变量占用存储单元的字节数。 1个字节,字节变量,类型 BYTE: 2个字节,字变量, 类型 WORD; 4个字节,双字变量,类型 DWORD。 2. 变量定义伪指令 DB、DW、DD、DF、DQ、DT 用来定义存储单元的符号名,并初始化该单元或该单元开始的若干连续单元。初始化可以采用确定值,也可以采用不确定值。 DB ( Define Byte) 格式:符号名 DB 表达式1,表达式2,,(1)数值变量定义语句 NUM DB 100,45H SUM DW 3456H TOTAL DD 22334455H 变量NUM、SUM和TOTAL在存储单元中的存放格式如图4-2所示。数值变量存放时采用小端方式,也就是低字节存放在低地址,高字节存放在高地址。,图4-2 数值变量存储格式,(2)字符串变量定义语句 定义字符串变量可以用DB伪指令,它为字符串中的每个字符分配一个字节的存储单元,在存储单元中存放的是字符的ASCII码值。 ABC DB ABCDEF DATE DB BA,DC,低地址,高地址,DATE,ABC,(3)预分配存储单元 “?” 语句可以为数据项分配存储单元,但是存储单元中不预置确定的值,所以常用来预留存储单元。 BVAR DB ? ;预分配1个字节单元 DVAR DW ?,?,? ;预分配3个字单元,(4)重复数据定义 DUP语句可以重复进行数据定义操作,用带DUP的表达式可以为若干重复数据分配存储单元,DUP表达式也可以嵌套。,D1 DB 3 DUP(0) D2 DW 10 DUP(0ABCDH) D3 DD 2 DUP (20H, 2 DUP(10H)D4 DB 4 DUP(?)D5 DW 8 DUP(?),4.2.3 标号 标号是可执行语句的符号地址,用来表示指令在存储器中的位置。经常在转移指令中目标操作数字段出现,用以表示转移指令的目标地址。标号之后必需有一个冒号“:” 。 1标号的属性 (1)段属性(SEG):指标号所在段的段基址,它通常放在DS、ES、SS段寄存器中。 (2)偏移属性(OFFSET):指标号所在段中的偏移地址,即标号所在的地址与段基址之间的字节数。 (3)类型属性或距离属性(TYPE):用来说明该标号是段内引用还是段间引用。段内引用时为NEAR属性,指针占两个字节;段间引用时为FAR属性,指针占4个字节。,2定义类型属性伪指令LABEL LABEL伪指令为当前存储单元定义个指定类型的变量或标号。如果LABEL定义的是变量,其类型可以是BYTE、WORD或DWORD;如果定义的是标号,其类型可以是NEAR或FAR。语句格式如下: 变量名或标号 LABEL 类型 (1)与变量连用 LABEL与变量连用,用来给下一条语句中的变量取个新的名字,并可重新定义它的类型。 (2)与标号连用 LABEL与标号连用时用来给指令地址定义个新的标号,并可改变其类型属性。,4.2.4 表达式 由运算对象(常量、变量、寄存器、标号等)和运算符组成的合法式子就是表达式,分为数值表达式和地址表达式两种类型。 1. 数值表达式 数值表达式的结果是数值。例如: MOV AX, 2+10H 指令中源操作数是一个数值表达式,其运算结果是个数值,指令执行后AX中存放的是该表达式的值。,2. 地址表达式 地址表达式的结果是一个存储单元的地址。当这个地址中存放的是数据时,称为变量;当这个地址中存放的是指令时,则称为标号。例如: MOV AX,ES:BX+1001H 指令中源操作数是地址表达式,其结果是一个存储单元的地址。,4.2.5 运算符,算术运算符逻辑运算符关系运算符属性运算符数值返回运算符其他运算符,运算符分为,4.2.5 运算符1. 算术运算符 算术运算符:(加)、(减)、*(乘)、(除)等,2. 逻辑运算符,AND (与), OR(或), XOR (异或), NOT (非),用于对常量进行按位操作。,需要注意的是,这4种运算符与逻辑指令的助记符在形式上是一样的,但它们在语句中的位置不同。 例如: OR AL, BH OR 80H MOV AL, CL AND 10000000B,3. 关系运算符 GT、GE、LT、LE、EQ 和 NE 6种。 关系运算符用于对两个操作数进行比较运算,结果为逻辑值。若关系成立结果为真,用全“1”表示;结果为假,用全“0”表示。 例如: MOV AX,11 EQ 1011B;(AX)0FFFFH MOV BX,10H EQ 32 ; (BX)0,4. 修改属性运算符PTR 修改属性运算符PTR可以临时改变变量或标号原有的类型属性并赋予其新的类型属性。DATA DB 10H,11H,12H,13H,14H, 15H,16H, 17HMOV EAX, DWORD PTR DATA ;修改DATA为双字型变量,5. 取值运算符,SEG (返回段地址)OFFSET (返回偏移地址)TYPE (返回类型字节数)LENGTH(返回变量单元数)SIZE (返回变量总字节数),取值运算符,(1)SEG运算符 SEG运算符加在变量名或标号之前,返回的数值是该变量或标号所在段的段基址。例如; MOV AX,SEG VAR 如果变量VAR所在段的段基址为1000H,则该指令执行后AX的内容为1000H。 (2)OFFSET运算符 OFFSET运算符加在变量名或标号之前,返回的数值是该变量或标号的偏移基址。例如: MOV BX,OFFSET VAR 如果变量VAR在段内的偏移地址为2000H,则该指令执行后BX的内容为2000H。,(3)TYPE运算符 TYPE运算符加在变量名之前,返回的数值是该变量的类型字节数,DB为1,DW为2,DD为4,DQ为8,DT为10。当TYPE加在标号之前,返回的数值是这个标号的类型属件值, NEAR为1,FAR为2。 A1 DB 1,2,3,4,5,6,7,8 A2 DW l234H,5678H A3 DD 12345678H SF LABEL FAR SN: MOV BL, TYPE A1 ;BL=1 MOV BH, TYPE A2 ;BH=2 MOV DL, TYPE A3 ;DL=4 MOV DH, TYPE SF ;DH=2,(4)LENGTH运算符 该运算符加在变量名之前,返回的数值是该变量中所定义的元素个数。如果变量是用重复数据操作符DUP说明的,则返回DUP前面的数值;如果没有DUP说明,则返回的值总是1。 B1 DB 100 DUP(0) B1 DW 100 DUP(0) B2 DW 4321H, 3859H MOV BX,LENGTH B1 ;等效于MOV BX,100 MOV AX,LENGTH B2 ;等效于MOV AX,1,(5)SIZE运算符 该运算符加在变量名之前,返回的数值是该变量所分配的字节总数。它等于LEGTH和TYPE两个运算符返回的乘积。例如,对于上例中所定义的变量B1、B2的返回值如下所示。 MOV BX, SIZE B1 ;(BX)=100H MOV CX, SIZE B2 ;(CX)=2,6. 段定义伪指令 8086的内存是分段管理的,程序的不同部分应放在特定的段中。段定义伪指令就是为程序的分段而设置的。 格式: 段名 SEGMENT 段名 ENDS 任何逻辑段总是从SEGMNT语句开始,以ENDS语句结束,伪指令SEGMNT和ENDS总是成对出现。,7段寄存器指派伪指令 ASSUME 段寄存器名:段名,段寄存器名:段名, 该语句通知汇编程序源程序中定义的段由哪个段寄存器寻址。段寄存器可以是:CS、DS、ES、SS、FS和GS。 格式中,ASSUME是伪指令名,是语句中的关键字,不可缺省。段名是指用SEGMENTENDS伪指令定义过的段名。ASSUME语句是非执行语句,要求放在代码段内的段定义语句之后。,ASSUME语句仅仅约定了对逻辑段进行寻址操作时使用哪个段寄存器,而段寄存器的初值还必须在程序中用指令设置。 例如:设数据段段名为DATA MOV AX,DATA MOV DS,AX 操作系统把一个可执行的程序(EXE文件)调入内存之后,自动地把程序代码段的基址赋给CS,所以对CS的赋值是由操作系统系统自动完成的,程序员不用设置。,8移动地址指针伪指令 格式: ORG 表达式 ORG伪指令用来指定该语句之后的程序或数据开始存放的偏移地址。例如 ORG 2000H VAR1 DB 2,3,45H ;从偏移地址2000H开始存放变量VAR1 ORG 2020H VAR2 DW 0080H,0098H ;从偏移地址2020H开始存放变量VAR2 通常ORG伪指令可以出现在程序的任何位置上。,9当前位置计数器$ 在汇编语言中,可以用$表示当前位置计数器的值。 DATA SEGMENT STR DB GOOD COUNT EQU $ STR DATA ENDS 其中,$表示当前的偏移地址,变量名STR表示上一条语句中变量STR的偏移地址,$STR表示两个偏移地址之差,正好是以变量STR为首地址的连续字节数,即STR为首地址的字符个数。,10程序结束伪指令END END伪指令作为汇编语言源程序的结束语句,一般放在源程序的最后一行。一个程序模块只允许有一个END语句。 格式: END 标号,【举例】 实现两个16位二进制数的相乘 STACKS SEGMENT STACK ;堆栈段 ST1 DB 100 DUP(?) TOP EQU LENGTH ST1 STACKS ENDS DATAS SEGMENT ;数据段 M1 DW 0008H M2 DW 0009H P1 DW ? P2 DW ? DATAS ENDS,CODES SEGMENT ;代码段 ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS ;初始化 MOV DS,AX MOV AX, STACKS MOV SS, AX MOV AX,TOP MOV SP,AX,MOV BX, OFFSET M1 MOV AX, BX MOV DX, 00 MOV BX, OFFSET M2 MUL WORD PTR BX MOV BX, OFFSET P1 MOV BX, AX MOV BX, OFFSET P2 MOV BX, DX HLT MOV AX, 4C00H ;退出程序 INT 21H CODES ENDS END START,4.3.1 DOS系统功能调用 MS-DOS是早期IBMPC系列计算机上最普遍的操作系统,它采用层次化的模块结构。有一个引导模块BOOT和3个层次模块组成,这3个模块分别是输入输出模块IO.SYS、文件管理模块MSDOS.SYS和命令处理模块COMMAND.COM。用户可以:1.通过键盘在命令处理模块层次对操作系统访问; 2.通过软件中断和系统功能调用在文件管理模块层次访问。,4.3操作系统资源的使用,BOOT,COMMAND.COM,键盘命令,MSDOS.SYS,应用程序,IO.SYS,I/O设备,软件中断和系统调用,ROM BIOS,用 户,MS-DOS常用的软件中断,MS-DOS常用的软件中断,MS-DOS主要系统功能都是由中断处理程序的形式来提供的,隐蔽了物理特性。调用时设置入口参数。 系统功能调用专指类型为21H的软中断,包含多个子程序,每个子程序对于一个功能号。,1. 系统功能调用方法 系统功能调用步骤(类似高级语言调用函数)(1)在AH寄存器中设置系统功能调用号(2)在指定寄存器中设置入口参数(3)中断调用指令“INT 21H”执行功能(4)根据出口参数分析功能调用执行情况,1. 系统功能调用方法 INT 21H 为系统功能调用,其功能号在AH中。,AH=01 ;键盘输入AH=07 ;键盘输入AH=08 ;键盘输入(无回显)AH=02 ;显示器输出AH=09 ;显示字符串AH=0A ;输入字符串AH=4C ;返回操作系统,2. 基本I/O功能调用,(1)单个字符键盘输入 1号 格式:MOV AH, 1 INT 21H系统等待键盘输入,一旦有键按下,系统先检查是否是ctrl+break键,是则退出,否则将键入字符的ASCII码置入AL寄存器中,并在屏幕上显示该字符。,举例:,BAA : MOV AH, 1 INT 21H CMP AL, Y JE YES CMP AL, N JE NO JMP BAA YES: NO:,(2) 单个字符输出(2号功能),格式: MOV DL, MOV AH, 2 INT 21H将置入DL寄存器中的字符从屏幕上显示输出 在屏幕上显示“3” MOV DL, 33H; 33H为3的ASCII码 MOV AH, 2 INT 21H,(3) 输出字符串(9号功能),将指定的内存缓冲器中的字符串从屏幕显示输出。缓冲器的字符串以$结束。DS:DX为串的首地址。,BUF DB HOW DO YOU DO? $ MOV DX, SEG BUF MOV DS, DX MOV DX, OFFSET BUF MOV AH,9 INT 21H,(4) 字符串输入(A号功能),将键盘键入的字符串存入到内存缓冲区,因此事前必须一个缓冲区。DX为缓冲区首地址,缓冲区的第一个字节为能存放的字符数,第二个字节为实际存放的字符数,从第三个字节开始用来存放键入的字符串,最后键入回车键表示字符串结束。,BUF DB 30, ?, 30 DUP(?) MOV DX, OFFSET BUF MOV AH, 0AH INT 21H,(5) 程序结束返回操作系统(4C号功能),将程序结束并返回操作系统,一般在程序结束时放置此指令。,格式: MOV AH, 4CH INT 21H,4.3.2 BIOS系统功能调用 BIOS(Basic Input/Output System)是IBM-PC机的监控程序,它固化在微型机主板的ROM中,它的内容主要有系统测试程序(POST)、初始化引导程序(BOOT)、I/O设备的基本驱动程序和许多常用程序模块,它们一般以中断服务程序的形式存在。例如,负责显示输出的显示I/O程序为10H号中断服务程序;负责打印输出的打印I/O程序为17H号中断服务程序等。,图4.9是用户程序和操作系统关系示意图,由图可见,BIOS程序直接建立在硬件基础上,磁盘操作系统(DOS)和其他操作系统建立在BIOS基础上,各种高级语言则建立在操作系统基础上。用户程序可以使用高级语言,也可以调用DOS或其他操作系统,还可以调用BIOS,甚至直接指挥硬件设备。,图4.9 用户程序和操作系统关系示意图,通常,应用程序调用DOS提供的系统功能,完成输入/输出或其他操作,这样做用户可以少考虑硬件,实现起来容易。应用程序直接对硬件编程的优点是程序的效率高,缺点是需要程序员对硬件性能有较深的了解,编程复杂,所以一般不直接对硬件编程。 BIOS中断程序处于DOS功能调用和硬件环境之间,和DOS功能调用相比,其优点是效率高,缺点是编程相对复杂;和直接对硬件编程相比,优点是实现相对容易,缺点是效率相对低。在下列情况下可考虑使用BIOS中断。,(1) 有些功能DOS没有提供,但BIOS提供了;(2) 有些场合无法使用DOS功能调用;(3) 其他原因。,4.4 汇编程序设计,进行汇编语言程序设计可参考下述步骤:(1)分析问题,建立数学模型(2)设计算法(3)绘制流程图或结构图(4)编写程序(5)上机调试,4.4 汇编程序设计,汇编语言程序设计采用结构化程序设计方法,其基本结构包括: 顺序结构 分支结构 循环结构,4.4.1 顺序程序设计 顺序结构的程序是一种最简单的程序,是没有分支、没有循环的直线运行的程序。 例4-1 编程计算Z=(x23y) / 2。假设 x、y为单字节正整数,结果Z用两个字节 来存放。,DATA SEGMENT X DB 25 Y DB 32 Z DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA ;初始化DS MOV DS, AX MOV AL, X MUL AL ;求X2,MOV BL, Y ADD BL, BL ;Y+Y ADD BL, Y ;Y+Y+Y SUB AX, BX ;X23Y SHR AX, 1 ;(X23Y)/ 2 MOV Z, AX ;结果送Z MOV AH, 4CH ;返回操作系统 INT 21HCODE ENDS END START ;汇编结束,【例4-2】 用查表的方法将一位十六进制数转换成与它相应的ASCII码。使用查表的方法,首先要建立一TABLE,在表中按照十六进制数从小到大的顺序放入它们对应的ASCII码值。然后再利用查表指令XLAT实现。编制的源程序如下:,DATA SEGMENTTABLES DB 00H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HEX DB 04H ;假定要查的十六进制数为4 ASCII DB ? ;存放查表的结果 DATA ENDSSTACK1 SEGMENT STACK DW 20H DUP(0) ;建立堆栈段STACK1 ENDS,COSEG SEGMENTASSUME CS:COSEG, DS:DATA, SS:STACK1BEING: MOV AX, DATA MOV DS, AX MOV BX, OFFSET TABLES MOV AL, HEX ;表内位移量送AL XLAT ;查表BX+AL AL MOV ASCII,AL ;结果送ASCI MOV DL, AL MOV AH, 2 ;调用DOS中断2号 INT 21H MOV AH, 4CH ;返回操作系统 INT 21HCOSEG ENDS END BEING,4.4.2 分支程序设计,例4-3 奇校验程序。 标准ASCII码的最高位没有使用,可以用作传输的校验位。如果使包含校验位在内的数据中“1”的个数恒定为奇数,就是奇校验。程序首先通过键盘输入一个字符,如果字符的ASCII码中“1”的个数为奇数,则令最高位为“0”,否则令最高位为“1”。程序如下:,CODE SEGMENT ;定义代码段,此题没有数据段 ASSUME CS: CODESTART: MOV AH, 1 INT 21H ;键盘输入, AL输入字符的ASCII码 AND AL, 7FH;最高位置“0”、其他位不变, 同时标志PF反映“1”的个数 JNP NEXT ;个数为奇数,不需处理,转移 OR AL, 80H ;个数为偶数,高位置“1”、其 他 位不变 NEXT: MOV AH, 4CH ;返回操作系统 INT 21HCODE ENDS END START,例4-4 编程计算下列函数的值,X取值范围:128127。,符号函数,DATA SEGMENT X DB 3 ;假定X=3 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATASTART: MOV AX, DATA MOV DS, AX MOV AL, X CMP AL, 0 ;X和0比较 JGE BIGER ;X=0跳转到,MOV AL, 0FFH ;X=0的程序段BIGER: JE EQUL ;X=0跳转到EQUL MOV AL, 1 ;X0,1送Y单元 MOV Y, AL JMP NEXT ;跳过处理X=0的程序段EQUL: MOV Y, AL ;X=0,0送Y单元NEXT: MOV AH, 4CH ;返回操作系统 INT 21HCODE ENDS END START,4.4.3 循环程序设计,循环程序一般由循环初始化部分、循环体部分、循环控制部分和循环结束处理部分组成。,例4-5 设计一个程序,完成从1连加到100(即1+2+99+100)的操作,结果保存在数据段的SUM单元。DATA SEGMENTSUM DW ? ;存放结果DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX,;循环初始化 SUB AX, AX ;工作寄存器清零 MOV CX, 100 ;计数器赋初值 CLC ;清除进位标志 ;循环体开始 LP: INC AX ADC SUM, AX LOOP LP ;循环控制 MOV AH, 4CH INT 21HCODE ENDS END START,例

温馨提示

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

评论

0/150

提交评论