1、2/25/2019,1,第3章 汇编语言程序设计,本章主要内容: 1、汇编语言的基本元素 2、伪指令 3、汇编程序设计,2/25/2019,2,汇 编 语 言,用汇编语言编写源程序,经过汇编程序和连接程序生成目标程序和执行程序 文件名.ASM 文件名.OBJ 文件名.EXE,汇编语言 源程序,汇编,目标 程序,连接,执行 程序,编辑程序 EDIT.EXE,汇编程序 MASM.EXE,连接程序 LINK.EXE,2/25/2019,3,STACK SEGMENTDB 100 DUP( ? ) STACK ENDS DATA SEGMENTSUR DB ?DIS DB ? SQTAB DB 0,1
2、,4,9,16,25,36,49,64,81 DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,SQTAB;取平方表基地址MOV AH,0MOV AL,SUR ;AL=XADD BX,AX ;计算地址偏移MOV AL,BX ;取出X的平方值MOV DIS,AL CODE ENDSEND BEGIN,2/25/2019,4,汇编语言的语句格式,汇编语言的语句有指令语句、伪指令和宏指令。 指令:在程序运行期间由计算机来执行,汇编程
3、序汇编后可产生机器指令代码; 。 伪指令:在汇编程序对源程序汇编期间由汇编程序处理的操作,伪指令主要完成数据定义、分配存储区、指示程序结束等操作。 宏指令:是源程序中一段有独立功能的程序代码。,2/25/2019,5,汇编语言的基本元素,汇编语言的语句格式如下: 格式:标识符 助记符 操作数 ;注释 汇编语言源程序中可以用下列字符来表示标识符:字母:AZ,az数字:09专用字符:? _ $ 说明: 1、标识符不能以数字打头,名字中用到则必须是第1个字符 2、符号常量、标号或变量等都是标识符 3、标识符不能和关键词重名。,2/25/2019,6,常量、变量和标号,常量:指在汇编时已经有确定数值的
4、量。 l数值常量:二进制、十进制、十六进制和ASCII码字符如:01100101B 234D(或234) 456Q 1234H AB 符号常量:用伪指令EQU实现例如: P EQU 314 伪指令PURGE可用于释放由EQU伪指令定义的符号常量,这样这些常量就可以被重新定义了。EQU伪指令定义的符号在PURGE伪指令解除前,不能重新定义。 例:PURGE 符号名1,符号名2,符号名N等号赋值伪指令“ = ” 功能与EQU相似,可对已定义的符号名重新定义而无须先释放。如:P = 314,2/25/2019,7,常量、变量和标号,变量:是存储器中的数据或数据区地址的符号表示。变量名即是数据的地址或
5、数据区的首地址。 标号:是指令地址的符号表示或过程名。过程名是过程入口地址的符号表示。标号经常在转移指令或CALL指令的操作数字段出现,用以表示转向地址。 标号的定义:用“:”定义,直接写在指令前。如:NEXT:MOV AL,SI 说明: 1、标号代表指令的符号地址, 在代码段中定义和使用; 2、变量是数据存储单元的符号表示, 在数据段、附加段和堆栈段中定义。,2/25/2019,8,数据定义伪操作指令,变量的定义(重点) 格式:变量名 数据定义伪指令 表达式 数据定义伪指令:DB,DW,DD,DQ,DT 表达式:确定了变量的初值,所使的表达式可以是以下几种: (1) 数值表达式 W1 DW
6、-5,1994H (2) ASCII码字符串 B1 DB AB$ (3) 地址表达式 W2 DW B1 (4) “?”表示所定义变量无确定初值 B2 DB ? (5) n DUP(表达式) 如:DATA1 DB 20 DUP (5)其中n是重复因子,只能取正整数,它表示定义了n个表达式,表达式的类型由数据定义伪指令确定。此处表示定义了20个字节,并全部初始化为5。,2/25/2019,9,数据定义伪操作指令,例1: DATA2 DW 10 DUP (?)表示定义了10个字,但没有初始化。例2: BUFFER DB 100 DUP (0) ;表示以BUFFER为首地址的100个字节中存放00H
7、例3: V1 DB 100 DUP (3, 5, 2DUP (10), 35), 24, NUM表示V1为首地址的区域中存放了( 3,5,10,10,35 )100次,和24, NUM,2/25/2019,10,数据定义伪操作指令,例4: S1 DB ABCDEFS2 DW AB, CD, EFS3 DD AB, CD 这几个变量在存储器中存放情况如下:,注意:定义多于两个以上字符的字符串时,只能使用DB伪指令,不能使用DW和DD等伪指令。,S1,S2,S3,2/25/2019,11,变量的属性,l 变量有三种属性:段地址 SEG偏移地址 OFFSET类型 TYPE 变量的类型:存取该变量中的
8、数据所需要的字节数 例如:用DB定义的变量,其类型为1;用DW定义的变量,其类型为2;用DD定义的变量,其类型为4;依次类推。,2/25/2019,12,标号的属性,l 标号也有3种属性:即段地址、偏移地址和标号的类型(NEAR, FAR)。段地址:标号的段起始地址,此值必须在CS中; 偏移地址:是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。 类型: NEAR:段内转移或调用,只需要改变IP值,不需要改变CS值。标号返回值为-1(0FFFFH) FAR:指段间转移和调用。IP和CS都将改变,标号返回值为-2(0FFFEH),2/25/2019,13,汇编语言的运算符,宏汇编
9、允许对常量进行算术、逻辑和关系3种运算,构成的数值表达式在汇编时完成计算。算术运算符:+、*、/、MOD、SHL和SHR如:PI EQU 31416/10000逻辑运算符:AND、OR、NOT、XOR如:AND AL,MASKB AND OFH 和逻辑运算指令的区别:由逻辑运算符构成的表达式在汇编时完成计算,而指令在运行时才会执行 关系运算符:EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于) 注:关系运算符比较两个操作数并产生一个逻辑值。如果关系成立,则结果为真(0FFFFH);否则为假(0000H)。,2/25/2019,14,汇编语言的运算符,值
10、返回运算符 1$ 运算符:返回汇编器当前地址计数器的值。如: BLOCK DB Read after me! NUM EQU $-BLOCK 结果NUM的值为字符串的长度14又如: W2 DW -5,1994HC1 EQU ($-W2)/2 ;C1表示变量W2中元素的个数。 2SEG和OFFSET运算符:返回变量或标号的段地址和偏移地址。例如:MOV AX,SEG TABLEMOV BX,OFFSET TABLE(相当于LEA BX,TABLE),2/25/2019,15,汇编语言的运算符,3TYPE运算符:用于返回变量和标号的类型例如:MOV AX,TYPE TABLE若TABLE为字节变量
11、,则返回值为1 4LENGTH和SIZE运算符LENGTH:返回分配给该变量的元素的个数;SIZE:返回分配给该变量的字节数。即返回变量的长度LENGTH与类型TYPE之积。 说明:这两个运算符只对用DUP定义的变量有意义。 例如:TABLE DW 100 DUP (?)MOV CX, LENGTH TABLE ; CX=100MOV DX, SIZE TABLE ; DX=200,2/25/2019,16,汇编语言的运算符,属性运算符 1PTR运算符:忽略变量或标号的当前属性,而给出一个临时的类型或属性。 例1: SLOT DW 25MOV AL, BYTR PTR SLOT 例2: MOV
12、 BYTE PTR BX,5 或 MOV WORD PTR BX,5 2THIS运算符:可用来建立一个特殊的变量,而不为其分配存储空间。该变量的段地址和偏移地址就是后面一个变量的段和偏移地址,其类型在THIS运算符后面指定。 例: F1 = THIS BYTEF2 DW 1234HMOV AX, TYPE F1 ; AX=1MOV BL, F1 ; BL=34H,2/25/2019,17,汇编语言的段定义,段定义伪指令 格式:段名 SEGMENT 定位类型组合类型类别段名 ENDS 说明:三个可选项一般情况下可不用。但如果需要用连接程序把本程序与其它程序模块相连接时,就需要使用这些说明。,2/
13、25/2019,18,汇编语言的段定义,定位类型:如何将组合后的段定位到存储器中。 PARA:这是隐含的定位方式,段首址的最低4位为0; BYTE:本段可从任何地址开始; WORD:本段要从偶地址开始; PAGE:段首址的低8位为0。 组合类型:表明本段和其它段的组合关系(共6种,见P76) 类别:必须用单引号括起来,连接时LINK将类别名相同的所有段(它们不一定同段名)存放在连续的存储区域中。典型的类别名有:data, stack, code。 删节号:对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪指令,对于代码段,则是指令及伪指令。,2/25/2019,19,汇编语言的过程
14、定义,过程定义伪指令 一个代码段可以由一个或几个过程组成。 过程的定义格式形式如下:过程名 PROC NEAR或FARRET过程名 ENDP NEAR:默认状态,为段内过程 FAR:为段际过程,2/25/2019,20,设定段寄存器伪指令ASSUME,几乎所有访问存储器的指令都仅使用偏移地址。而段地址来自某个段寄存器,所以源程序在程序代码段的开始就要对段寄存器与段之间的关系做假定。确定段寄存器与段的关系的伪指令ASSUME 格式:ASSUME SEGREG NAME:SEGNAME, 例如:assume ss:stack, cs:code, ds:data注意:伪指令ASSUME只是指定某个段
15、分配给哪个段寄存器,它并不能把段地址装入到段寄存器中。因此要在程序中用两条MOV指令完成这一操作,但代码段不需要这样做,CS的内容将程序初始化时由系统自动完成。,2/25/2019,21,汇编语言源程序结构,RAM底端DS、ES CSRAM高端,EXE文件:分段结构的可执行文件。EXE文件除了程序、数据外,还包含了一个文件头,叫程序段前缀PSP (program segment prefix),占256个字节。 PSP的256个字节包含三部分的信息:有被装入程序与操作系统连接时使用的信息,有供装入程序使用的参数,还有供操作系统本身使用的信息。,2/25/2019,22,标准程序前奏,当执行EX
16、E文件时,操作系统像调用子程序一样,把控制权转移给EXE文件,EXE文件执行完之后也应像子程序返回调用程序一样将控制权返回操作系统。EXE文件返回DOS有两种方法: (1) 使用4CH功能调用即在EXE文件的最后使用以下指令:MOV AH,4CHINT 21H (2) 用软中断INT 20H,其指令机器码是CD20,2/25/2019,23,标准程序前奏,PSP的头两个字节即为一条INT 20H指令,即返回操作系统指令。当程序运行结束时,可以通过把程序流程转移到PSP的这条指令而终止自己的进程。因此需要在程序一开始把PSP的起点地址压入堆栈:PUSH DSXOR AX, AXPUSH AX 这
17、三条指令称为标准程序前奏。这样当程序执行到最后一条RET指令时,它将从堆栈顶部弹出PSP的起点地址送CS和IP,使得INT 20H指令得以执行, 从而把控制权交还给操作系统。 当不把代码段中的程序写成过程时,这三行语句是不必要的,但若将其写成DOS调用的过程,则必须加上这三条标准程序前奏。,2/25/2019,24,结束用户程序返回DOS的方法,1INT 20H 2程序转移到程序段前缀PSP的开始处来返回DOS在子程序中应有如下程序段:PUSH DSXOR AX, AXPUSH AXMOV AX,DATAMOV DS,AXRET 3用4CH功能调用MOV AH, 4CHINT 21H,若程序中
18、用到附加段ES,则还应有将附加段首址送ES的指令,2/25/2019,25,ORG伪指令,ORG:伪指令用于指定段内程序或数据代码存放的起始偏移地址,即用语句中表达式的值作为起始偏移地址,此后的程序或数据代码将连续存放,除非遇到另一个新的ORG语句。一般格式为: ORG 例如: DATA SEGMENTBUFF1 DB 23,56H,EOFORG 2000HBUFF2 DB STRINGDATA ENDS,2/25/2019,26,汇编结束伪指令语句END,汇编结束伪指令语句END END伪指令用在源程序的最后,用以表示整个源程序的结束,即告诉汇编程序,汇编工作到此结束。 格式:END 表达式
19、 说明:表达式为程序第一条可执行指令的地址。如果不带表达式,则该程序不能单独执行,只是供其他程序调用的子模块。,2/25/2019,27,汇编语言源程序结构,RAM底端CS,DS,ES,SS IP=0100HSP=0FFFEHRAM高端,COM文件 所占存储空间比EXE文件小,不允许超过64K。 COM文件不分段,且不允许定义堆栈段,占有的空间所有的过程均应定义为NEAR,其入口点必须是0100H。 只能用来编制较小的程序。由于其小而简单,装入速度比EXE文件要快。,64KB,2/25/2019,28,例题详解,某程序中的数据定义如下:DAT1 DW ?,18 DUP(9)DAT2 DB 90
20、,67,12,176,100,8DAT3 DD ?,?,15CNT1 EQU $-DAT2CNT2 EQU $-DAT3 问CNT1、CNT2的值以及上述数据定义占用多少字节的内存?,答案:CNT1=18CNT2=12共占用字节:56个字节,2/25/2019,29,例题详解,执行以下程序段后,AX的内容为:ORG 0000H TABLE DW 12H,34H,56H,$+1018,78H,90HCOUNT EQU 3LEA BX,TABLEMOV DX,4BXMOV AX,BX+2*COUNTSUB AX,DX,BX = 0000H DX = 0056H AX = 0400H AX = 03
21、AAH,注意:$+1018中的1018是十进制数,即十六进制数3FA,2/25/2019,30,例题详解,执行以下程序段后,CL和AX的内容各为:STR1 DW AB STR2 DB 16 DUP(?) CNT EQU $-STR1MOV CX,CNTMOV AX,STR1HLT,答案:CL = 12H AX = 4142H,2/25/2019,31,例题详解,求下列数据段中每个符号或变量所对应的值:DATA SEGMENT ORG 1000H MAX EQU 0FFH ONE EQU MAX MOD 10 TWO EQU ONE*4 SIZE EQU(TWO LT 20H) AND 10H)
22、+10H BUF DB SIZE*2 DUP(?) COUNT EQU $-BUF DATA ENDS,MAX=FFH ONE=05H TWO=14H SIZE=20H BUF=1000H COUNT=40H,2/25/2019,32,汇编程序设计,在汇编语言程序中,最常见的结构有:l 顺序结构l 分支结构l 循环结构l 子程序结构 这几种程序的设计方法是汇编程序设计的基础。,2/25/2019,33,顺序结构程序设计,顺序结构程序设计是没有分支,没有循环的直线运行程序,它的执行顺序和指令的排列顺序完全一致。例1: 利用查表法计算平方值。已知0 9的平方值连续存在以SQTAB开始的存储区域中,
23、求SUR单元内容X的平方值,并放在DIS单元中。假定0X 9且为整数。 解:(1)了解平方表的存放位置;(2)根据X的值,找到X对应X2在表中位置。,2/25/2019,34,STACK SEGMENTDB 100 DUP( ? ) STACK ENDS DATA SEGMENTSUR DB 2DIS DB ? SQTAB DB 0,1,4,9,16,25,36,49,64,81 DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK BEGIN PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX,DATAMOV D
24、S,AXLEA BX,SQTAB ; 取平方表基地址MOV AH,0MOV AL,SUR ; AL=XADD BX,AX ; 计算地址偏移MOV AL,BX ; 取出X的平方值MOV DIS,ALRET BEGIN ENDP CODE ENDSEND BEGIN,2/25/2019,35,为使程序精练,可采用查表指令XLAT,代码段如下:BEGIN: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,SQTABMOV AL,SUR ;AL=XXLAT SQTABMOV DIS,AL,2/25/2019,36,分支结构程序设计,分支结构:分支程序经
25、常利用改变标志位的指令和转移指令来实现。如采用比较指令CMP和测试指令TEST,产生相应的状态标志,选择适当的条件转移指令,实现不同情况的分支转移。,例 实现符号函数。1 X 0 Y= 0 X = 01 X 0,2/25/2019,37,根据上述要求的程序段为: START:MOV AX,BUFFER ; 取变量XOR AX,AX ; 产生状态标志JE ZERO ; X = 0 则转移,ZERO: MOV BX,0,JMP CONT1,CONT1: ,JMP CONT1 ; 转向出口,JNS PLUS ; X 为正 则转移,MOV BX,0FFFFH ; BX= 1,PLUS: MOV BX,
26、1,2/25/2019,38,循环结构,顺序结构和分支结构程序中的指令,最多只执行一次,若要重复执行某些指令,需用循环结构实现。 循环程序由4部分组成:,(1)循环准备:建立地址指针、置计数器、设置些必要的常数,将工作寄存器或工作单元清零等。 (2)循环体:完成循环的基本操作; (3)循环的修改:修改的内容一般包括计数器、寄存器和基址和变址寄存器等; (4)循环的控制:修改计数器,控制循环继续或终止。,2/25/2019,39,循环结构,例 设内存BUFF开始的单元中依次存放着30个8位无符号字节数,求它们的和并放在SUM单元中。程序如下:MOV SI,OFFSET BUFFMOV CX,30
27、XOR AX,AX AGAIN:ADD AL,SIADC AH,0INC SIDEC CX ;可用LOOP AGAIN JNZ AGAINMOV SUM,AX,2/25/2019,40,例 在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号16位数,现要编写程序将这100个字数据从大到小排序。 程序如下: LEA DI,BUFFER ;取首地址MOV BL,99 ;须经N-1次排序 NEXT0: MOV SI,DI ;SI恢复指向首地址MOV CL,BL ;每次排序的比较次数 NEXT3: MOV AX,SI ;当前16位数放在AX中ADD SI,2 ;SI指向下一个16位
28、数CMP AX,SI ;当前数与下一个数比较JNC NEXT5 ;大于等于则不交换MOV DX,SI ;小于则交换MOV SI 2,DX ;可 XCHG SI,AXMOV SI,AX ; MOV SI-2,AX NEXT5: DEC CL ;计算比较次数JNZ NEXT3DEC BL ;每次排序的比较次数减一JNZ NEXT0HLT,2/25/2019,41,LEA DI,BUFFER ;取首地址MOV COUNT,100 ;排序元素的个数CLD ;地址递增排序 NEXT1: MOV BX,1 ;交换标记DEC COUNT ;每次排序的比较次数减1JZ EXIT ;比较次数为0则结束MOV S
29、I,DI ;SI恢复指向首地址MOV CX,COUNT ;每次排序的比较次数 NEXT2: LODSW ;当前数AX,SI 下一个数CMP AX,SI ;当前数与下一个数比较JNC NEXT3 ;大于等于则不交换XCHG SI,AX ;小于则交换MOV SI 2,AX ;大数存入上一位置XOR BX,BX ;有交换则交换标记清零 NEXT3:LOOP NEXT2 ;一次排序是否结束?CMP BX,0 ;一次排序是否有交换?JE NEXT1 ;有交换则继续 EXIT: MOV AX,4C00HINT 21H,2/25/2019,42,例题详解,下面是实现8A0BH和D705H两个数相加的程序,请
30、在空白处填写正确的指令:,DATA SEGMENT FIRST DB _, _, 0H SECOND DB _, _ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATAMOV DS, AXMOV CX, _MOV SI,0_,答案:0BH 8AH 05H D7H 2 CLC 0,NEXT:MOV AL,SECONDSIADC FIRSTSI, ALINC SILOOP NEXTMOV AL, 0ADC AL, _MOV FIRSTSI, ALMOV AH, 4CHINT 21H CODE ENDSEND START
31、,2/25/2019,43,子程序结构,循环程序设计技术解决了同一程序中连续多次有规律重复执行某个或某些程序段的问题。但对于无规律的重复就不能用循环程序实现。更多的情况是在不同的程序中或在同一个程序的不同位置常常要用到功能完全相同的程序段,如数制之间的转换、代码转换、初等函数计算等。对于这样的程序段,为避免编制程序的重复劳动,节省存储空间,往往把它独立出来附加少量额外的指令,将其编制成可供反复调用的公用的独立程序段,并通过适当的方法把它和其它程序段连接起来。,2/25/2019,44,子程序结构,主程序与子程序间的参数传递: (1)寄存器法:传递的参数和出口参数都在约定的寄存器中,当所传递的参
32、数较少时,一般用这种方法。 (2)堆栈法:在调用子程序前,入口参数由主程序送入堆栈中,子程序从堆栈中取得这些参数,并将处理结果送到堆栈中,返回主程序后,主程序从堆栈取得结果。 (3)参数赋值法:若主程序和子程序在同一代码段时,可把参数存放在主程序调用子程序指令后面的一串单元中。,在参数的传递方法中,寄存器法最简单,堆栈法最节省存储单元,参数赋值法最直观,但它们各有不足,寄存器法不能传递较多的参数,堆栈法和参数赋值法编程较麻烦。经验证明,参数不多时,用寄存器法最适宜;参数较多时用堆栈法或参数赋值法。,2/25/2019,45,子程序结构,主程序和子程序公用寄存器的处理问题子程序不可避免地要使用一
33、些寄存器,因此子程序执行后,某些寄存器的内容会发生变化,如果主程序在这些寄存器中已经存放了有用的数据,则从子程序返回主程序后,主程序的运行势必因原存信息被破坏而出错。解决这个问题的方法是使用这些寄存器之前,将其内容保存起来,使用之后再将其还原。前者称为保护现场,后者称为恢复现场。该工作一般在子程序中完成。如:PUSH AXPUSH BXPOP BXPOP AX,2/25/2019,46,操作系统资源使用,为了方便人们的使用和编程,在计算机内部有很多例行程序可以调用。很多例行程序及功能调用是关于输入、输出的,即通过输入设备(如键盘和磁盘)输入信息,再把输出的结果显示在屏幕、打印机或磁盘上,虽然高
34、级语言也可以处理输入输出工作,但速度慢、级别高。即使是用汇编语言处理输入输出,也可以调用两个层次的例行程序:用户 DOS ROM,对I/O的程序请求,DOS的I/O调用,ROM BIOS调用,操作外设,2/25/2019,47,操作系统资源使用,IBM PC微机系统为汇编用户提供了两个程序接口,一个是DOS系统功能调用,一个是ROM中的BIOS。系统功能调用和BIOS由一系列的子程序构成,但调用和返回不是使用子程序调用指令CALL和返回指令RET,而是通过软中断 INT n 和中断返回指令 IRET 调用和返回。DOS系统功能调用和BIOS的服务子程序,使得程序设计人员不必涉及硬件即可以实现对
35、系统的硬件尤其是I/O的使用与管理。,2/25/2019,48,DOS功能调用,系统功能调用分为字符I/O与磁盘控制功能,文件控制功能,记录和目录操作功能,程序结束、内存分配与其它功能四类。编号亦即调用号从075H。使用系统功能调用的一般过程为:把调用号放入AH中,设置入口参数,然后执行INT 21H指令,最后分析处理出口参数。,2/25/2019,49,1键盘输入(1号调用)入口参数:AH=1出口参数:AL = 相应字符的ASCII码。形式: MOV AH,1INT 21H2字符输出(2号调用)入口参数: DL = 显示字符的ASCII码,AH=2出口参数:无形式: MOV AH,02MOV
36、 DL,30HINT 21H该功能将DL寄存器内容送显示器显示。,DOS功能调用,2/25/2019,50,3控制台输入但无显示(7号调用)入口参数:AH=7出口参数:AL = 相应字符的ASCII码。形式: MOV AH,7INT 21H该调用与1号调用功能相似,区别仅在输入字符不在显示器上显示。往往用于输入密码等。,DOS功能调用,2/25/2019,51,4字符串输出(9号调用) 入口参数:DS:DX=显示缓冲区的字符串首地址,AH=09 出口参数:无 形式: MOV AH,09MOV DX,OFFSET BUFFINT 21H 该调用将DS:DX所指缓冲区的字符串显示在屏幕上,要求以$
37、符结尾。,DOS功能调用,2/25/2019,52,5字符串输入(10号调用) 入口参数:AH=10 ,DS:DX键盘接收输入缓冲区首地址 出口参数:从键盘接收字符串到内存缓冲区。缓冲区第一个字节存储缓冲区能容纳的字符个数,第二个字节存放实际接收的字节数,从第三字节开始存放从键盘接收的字符。形式: MOV AH,10MOV DX,OFFSET BUFFINT 21H,DOS功能调用,2/25/2019,53,6程序结束(4C号调用) 入口参数:AH = 4CH 出口参数:无 形式: MOV AX,4C00HINT 21H,DOS功能调用,三级PC技术上机考题,请编制程序,其功能是:内存中连续存
38、放着20个ASCII字符,如果是小写字母a-z之间的字符,请将其转换成相应的大写字符;若为其他字符,不作转换。 例如:内存中有 61H(a), 62H(b),31H(1)41H(A),42H(B) 结果为 41H(A), 42H(B),31H,41H(A),42H(B) 部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或
39、删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。,EXTRN LOAD:FAR,SAVE:FAR N EQU 20 STAC SEGMENT STACK DB 128 DUP(?) STAC ENDS DATA SEGMENT SOURCE DB N DUP(?) RESULT DB N DUP(0) NAME0 DB INPUT1.DAT,0 NAME1 DB OUTPUT1.DAT,0 DATA E
40、NDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAC START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA DX,SOURCE ;数据区起始地址 LEA SI,NAME0 ;原始数据文件名 MOV CX,N ;字节数 CALL LOAD ;从INPUT1.DAT读取数据,;*BEGIN* LEA SI,SOURCE LEA DI,RESULT MOV CX,N NEXT: MOV AL,SI CMP AL,a JB _ CMP AL,_ J_ UPPER2 SUB _ UP
41、PER2: MOV DI,_ INC _ INC _ _ NEXT ;*END* LEA DX,RESULT ;结果数据区首址 LEA SI,NAME1 ;结果文件名 MOV CX,N ;字节数 CALL SAVE ;保存结果到文件 RET START ENDP CODE ENDS END START,z,UPPER2,A,AL,20H,AL,SI,DI,LOOP,2/25/2019,56,宏定义、宏调用和宏扩展,一、宏定义1、简单的宏定义宏名 MACRO ENDM 2、带参数的宏定义 二、宏调用 三、宏扩展,其中:MACRO和ENDM宏定义的起始和结束标志。省略号表示宏定义体,是一组有独立功
42、能的程序代码。,宏:是源程序中一段有独立功能的程序代码。,2/25/2019,57,LOCAL伪操作,有时宏定义中需要定义变量或标号,如果在同一程序中多次使用宏调用,则汇编程序会产生多个同样的宏扩展,会产生多个相同的变量名或标号名。这违反了汇编程序对名字不能重复定义的规定,使程序运行出错。为此,汇编语言提供了local伪操作用于保证生成的名字的唯一性。 格式:local 形参1,形参2, 其中:形参即为宏定义中使用的变量或标号。,2/25/2019,58,重复伪指令,重复伪指令可以重复执行指令体中的语句。 1、REPT 格式: REPT ENDM 2、IRP 格式: IRP 形参 ENDM 3、IRPC 格式: IRPC 形参,字符串ENDM,2/25/2019,59,条件汇编,当某些条件满足时,才对该程序段汇编。 基本格式: IF 语句块1ELSE语句块2ENDIF 说明:如果IF后的条件成立,则汇编语句块1;若不成立,则汇编语句块2。,2/25/2019,60,上机时间安排: 第10周:星期三上午8:00 9:50 内容:实验一 Debug命令及其操作 要求:提前预习实验内容及附录1的内容 第11周:星期三上午8:00 9:50 实验二 简单程序的编写及汇编连接 要求:提前预习实验内容及附录2的内容,2/25/2019,61,今天就到这儿吧,