《微型计算机汇编语言及汇编程序.ppt》由会员分享,可在线阅读,更多相关《微型计算机汇编语言及汇编程序.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7章章 微型计算机汇编语言及汇编程序微型计算机汇编语言及汇编程序7.1 宏汇编语言的基本语法宏汇编语言的基本语法7.2 伪指令伪指令7.3 宏指令宏指令7.4 系统功能调用系统功能调用汇编语言汇编语言源程序源程序目的程序目的程序汇编程序汇编程序汇编汇编7.5 综合举例综合举例7.6 汇编语言程序设计汇编语言程序设计7.1 宏汇编语言的基本语法宏汇编语言的基本语法一、伪指令语句格式一、伪指令语句格式标号名标号名伪指令伪指令操作数操作数;注释注释 ,DATA1 DB 17HDB 78HDATA2 DW 617H,0A345H,89H说明说明:标号名可以是常量名、变量名、过程名、结构名、记录名等
2、标号名可以是常量名、变量名、过程名、结构名、记录名等二、常数、变量和标号二、常数、变量和标号1.常数常数8086/80888086/8088宏汇编中允许如下几种常数:宏汇编中允许如下几种常数:二、八、十、十六进制常数二、八、十、十六进制常数十进制科学表示法表示的实数,如:十进制科学表示法表示的实数,如:12.35E-212.35E-2字符串常数,如字符串常数,如ABAB值是值是4142H4142HABCD 41HABCD 41H,42H42H,43H43H,44H44H2.2.变量变量是代表存放在内存单元中的变化的数据。是代表存放在内存单元中的变化的数据。(1)变量的定义与预置变量的定义与预置
3、:DATASEG SEGMENT DATA1 DB 17H DATA2 DW 8976H DATA3 DD 45673212HDATASEG ENDSv段属性段属性v偏移量属性偏移量属性v类型属性类型属性标标号号是是一一条条指指令令语语句句的的符符号号地地址址。标标号号可可作作为为转转移移类类指指令令的的操操作作数数,即即转移地址。转移地址。v标号:在代码段中定义,后跟冒号标号:在代码段中定义,后跟冒号,位于指令语句左边位于指令语句左边 。3.标号标号【例】【例】符号地址表示。符号地址表示。NEXTNEXT:MOV ALMOV AL,SI SI DEC CX DEC CX JNE NEXT J
4、NE NEXT段属性:段属性:定义标号的段起始地址,标号的段属性总是在定义标号的段起始地址,标号的段属性总是在CSCS寄存器中。寄存器中。偏移地址:偏移地址:代表从代码段起始地址到标号位置之间的字节数。代表从代码段起始地址到标号位置之间的字节数。类型属性:类型属性:分分NEARNEAR和和FARFAR两类,两类,NEARNEAR表示在同一代码段内引用,表示在同一代码段内引用,FARFAR表示在段外引用。表示在段外引用。v标号有段、偏移及类型三种属性。标号有段、偏移及类型三种属性。表达式是由常数、寄存器、标号、变量和操作符组合而成。表达式是由常数、寄存器、标号、变量和操作符组合而成。1 1、算术
5、操作符、算术操作符三、表达式和运算符三、表达式和运算符算术运算符可用于数值表达式和地址表达式中,算术运算符可用于数值表达式和地址表达式中,例如:例如:MOV AL,10*5+4 ;数值表达式;数值表达式 MOV SI,OFFSET BUF+12 ;地址表达式;地址表达式 MOV CX,NUM2-NUM1 ;两地址差送;两地址差送CX MOV CX,NUM2+NUM1 ;无意义;无意义汇编语言程序使用的操作符有:汇编语言程序使用的操作符有:有有+、-、*、/和和MODMOD(取余)(取余)在使用地址表达式时要注意地址表达式的物理意义。在使用地址表达式时要注意地址表达式的物理意义。2、逻辑操作符、
6、逻辑操作符有有AND、OR、NOT和和XOR四个。只用于数值表达式中。四个。只用于数值表达式中。3、关系运算符、关系运算符有有EQ(相等)(相等),GT(大于)(大于),LT(小于)(小于)NE(不等)(不等),GE(大于或等于)(大于或等于),LE(小于或等于)(小于或等于)例如:例如:AND AL,78H AND 0FH等价于:等价于:AND AL,08HOR AL,3 AND 47H等价于:等价于:OR AL,3逻辑运算的结果为:逻辑运算的结果为:为真时,结果取为真时,结果取0FFFFH为假时,结果取为假时,结果取0注:注:关系操作符的两个操作数必须是数字或同一段内的地址关系操作符的两个
7、操作数必须是数字或同一段内的地址若若val5时,时,结果:结果:4.24.2、伪指令、伪指令汇编的一些汇编的一些伪指令伪指令用于用于定义符号定义符号,定义数据定义数据,分配内存单元分配内存单元,伪指令伪指令只向汇编语言提供有关信息,只向汇编语言提供有关信息,不产生机器代码。不产生机器代码。一、符号定义伪指令一、符号定义伪指令1、等值伪指令、等值伪指令EQU注注EQUEQU不能给一个符号重复定义不能给一个符号重复定义格式:格式:符号名符号名 EQU 表达式表达式功能:功能:给符号名定义一个值、别的符号名、表达式或助记符。给符号名定义一个值、别的符号名、表达式或助记符。CONS EQU 128DA
8、T1 EQU CONS+128B EQU MULAB EQU BXSI二、数据定义伪指令二、数据定义伪指令格式:格式:变量变量 操作符操作符 操作数操作数 ;注释;注释 功能:功能:给变量定义存储单元。给变量定义存储单元。操作符有:操作符有:DB DB,DWDW,DDDD,DFDF,DQDQ,DTDT注:注:用用DTDT定义的十进制数要加后缀定义的十进制数要加后缀D D,否则默认为,否则默认为BCDBCD数。数。2 2、等号伪指令、等号伪指令=与与EQUEQU类似,但在同一个程序中,类似,但在同一个程序中,=可以对一个符号重新定义。可以对一个符号重新定义。DATA SEGMENTVAR1 DB
9、 10HVAR2 DB 10,11,12 DB 0FFH,0BUF1 DW 1234H,5678HBUF2 DD 12345678HDATA ENDS10H0AH0BH0CHFFH00H34H12H78H56H78H56H34H12H(a)(a)、操作数是常数或表达式、操作数是常数或表达式例:例:DATADATA数据段中定义了字节、字和数据段中定义了字节、字和双字变量双字变量(b)(b)、操作数是?、操作数是?此时,只分配存储单元,不定义初值。此时,只分配存储单元,不定义初值。例:例:NUM1 DB 5,?,?,7 NUM2 DW?,?,?VAR1DATAVAR2BUF1BUF2(c)(c)、
10、操作数是字符串、操作数是字符串当定义的字符串中多于当定义的字符串中多于2个字符时,只能用个字符时,只能用DB定义。定义。注:注:STR2 DB AB STR2 DW BA STR2 DW AB等价等价BUF2 DW 1,2,3 DUP(6)等价于:等价于:BUF2 DW 1,2,6,6,6ARB1 DB 10 DUP(2)ARB2 DB 10H DUP(ABC)ARB3 DW 20 DUP(?)(?)(d)(d)、带、带DUPDUP的表达式的表达式变量名变量名DBDWDD表达式表达式1 DUP(表达式表达式2)如:如:STR1 DW ABCD 三、段定义伪指令三、段定义伪指令格式:格式:段名段
11、名 SEGMENTSEGMENT 定位定位 组合组合类型类型段长度段长度 ;段体;段体段名段名 ENDSENDS段定义伪指令应用举例段定义伪指令应用举例DATASEGMENT ;DATA段定义开始段定义开始 BUF1 DB 2DHDATAENDS ;DATA段定义结束段定义结束EXTRA SEGMENT ;EXTRA段定义开始段定义开始BUF2 DB?EXTRA ENDS ;EXTRA段定义结束段定义结束STAKSEGMENT ;STAK段定义开始段定义开始 TOP DW 50 DUP(?)STAK ENDS ;STAK段定义段定义四、段寻址伪指令四、段寻址伪指令 运行程序时,需要通过段寄存器
12、访问存储单元,运行程序时,需要通过段寄存器访问存储单元,ASSUMEASSUME指令就是用来建立段寄存器与段之间关系,但不能用来设置指令就是用来建立段寄存器与段之间关系,但不能用来设置段寄存器的内容。段寄存器的内容。三点说明三点说明格式:格式:ASSUME ASSUME 段寄存器:段名,段寄存器:段名,段寄存器:段名段寄存器:段名功能:功能:指示相关的段寄存器访问哪个逻辑段。指示相关的段寄存器访问哪个逻辑段。例如:例如:ASSUME ASSUME CS CS:CODECODE,DSDS:DATADATAASSUMEASSUME通常放在代码段的第一个语句通常放在代码段的第一个语句ASSUMEAS
13、SUME并没有给段寄存器赋值并没有给段寄存器赋值CSCS的值由的值由DOSDOS自动给加载的可执行文件赋的,其他段寄存自动给加载的可执行文件赋的,其他段寄存器的值需要通过器的值需要通过MOVMOV指令来设置指令来设置程序段程序段1:DATA SEGMENTPUBLIC VAR1 DB 5DATA ENDSCODE SEGMENTPUBLIC ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX CODE ENDSEND START 格式:格式:PROC NEAR/FAR (缺省为(缺省为NEAR)RET ENDP五、过程定义伪指令五、过程定义伪指
14、令 六、六、置汇编地址计数器伪指令置汇编地址计数器伪指令ORGORGDATADATASEGMENTSEGMENT ORG ORG1010;置值为置值为1010 VAR1VAR1DW DW 1A0H1A0H,2FAH2FAH ORG ORG+5+5;置的值为置的值为14+514+5,即为,即为1919 VAR2VAR2DBDB 1 1,2 2,11 11,1212 N N EQU EQU-VAR2-VAR2;()()=23=23DATADATAENDSENDS格式:格式:ORG ORG 数值表达式数值表达式功能:将数值表达式的值赋给汇编地址计数器。数值表功能:将数值表达式的值赋给汇编地址计数器。
15、数值表达式的值须为达式的值须为065535065535之间的非负整数。之间的非负整数。【例】给汇编地址计数器赋值。【例】给汇编地址计数器赋值。返回本章返回本章7.3 7.3 宏指令宏指令宏定义:宏定义:宏定义用一组伪操作实现:宏定义用一组伪操作实现:宏名宏名 MACROMACRO 形参列表形参列表 (宏体)(宏体)ENDMENDMSHRT SHRT MACROMACRO MOV CLMOV CL,3 3 SAR DL SAR DL,CLCLENDMENDM 例例:用宏指令实现将:用宏指令实现将DLDL寄存器右移寄存器右移3 3位位注意:注意:宏定义可出现在源程序的任何位置,但必须出现在宏定义可
16、出现在源程序的任何位置,但必须出现在宏调用之前,也就是必须先定义后调用。宏调用之前,也就是必须先定义后调用。宏调用的格式是:宏调用的格式是:宏展开宏展开宏展开就是用宏替代源程序中的宏名,用实参取代宏定义宏展开就是用宏替代源程序中的宏名,用实参取代宏定义中的形参。中的形参。宏调用宏调用经过宏定义后,宏指令就可以在源程序中调用,即宏调用。经过宏定义后,宏指令就可以在源程序中调用,即宏调用。宏名宏名 实参实参1 1,实参,实参2 2,实参,实参3 3,例:用宏指令定义两个字节数据相加,并存放到一例:用宏指令定义两个字节数据相加,并存放到一个单元中个单元中 ,并作宏调用和宏展开。,并作宏调用和宏展开。
17、ADDB ADDB MACRO MACRO AD1AD1,AD2AD2,RESULTRESULT ;宏定义宏定义 PUSH AXPUSH AX MOV AL MOV AL,AD1AD1 ADDADD ALAL,AD2AD2 MOVMOV RESULTRESULT,ALAL POP AX POP AXENDMENDM ADDB ADDB 5CH5CH,43H43H,DLDL ;宏;宏调调用用 1 PUSH AX 1 PUSH AX ;宏展开宏展开1 MOV AL1 MOV AL,5CH5CH1 ADD AL1 ADD AL,43H43H1 MOV 1 MOV DLDL,ALAL1 POP AX1
18、 POP AX 返回本章返回本章7.4 系统功能调用系统功能调用功功能能:将将DL寄寄存存器器中中的的字字符符送送显显示示器器显显示示,如如果果DL中中为为CTRL+BREAK的的ASCII码,则退出。码,则退出。1单字符输入(单字符输入(1号调用)号调用)格式:格式:MOV AH,1 INT21H功能:功能:从键盘输入字符的从键盘输入字符的ASCII码送入寄存器码送入寄存器AL中,并送中,并送显示器显示。显示器显示。2单字符显示(单字符显示(2号调用)号调用)格式:格式:MOV DL,待显示字符的,待显示字符的ASCII码码 MOV AH,2 INT 21H开始开始初始化循环计数值初始化循环
19、计数值BX循环左移一个数位循环左移一个数位把最右面的数位把最右面的数位转换为转换为ASCII是是ASCIIAF加上加上7显示一个字符显示一个字符循环计数值循环计数值=0NYYNMOV CH ,4ROTATE:MOV CL ,4ROL BX ,CLMOV AL ,BLAND AL ,0FHADD AL ,30HCMP AL ,3AHJL PRINTIT ADD AL ,7HPRINTIT:MOV DL ,ALMOV AH ,2INT 21HDEC CHJNZ ROTATERETMOV BX ,0AB78H结束结束例例1 接收键盘输入并对其进行测试接收键盘输入并对其进行测试GET_KEY:MOV
20、AH,1 INT 21HCMP AL ,YJE YESCMP AL ,NJE NOJNE GET_KEY例例2 检测键盘输入的字符是否是回车键检测键盘输入的字符是否是回车键GET_KEY:MOV AH,1 INT 21HCMP AL ,0DHJNE GET_KEY例例3 检测键盘输入的功能键检测键盘输入的功能键 MOV AH,1 INT 21HCMP AL ,0JE GET_ECJMP ERRORGET_EC:MOV AH,1 INT 21HCMP AL ,3BHJE OPTION1CMP AL ,3CHJE OPTION2CMP AL ,3DHJE OPTION3JMP ERROR功能:终止
21、当前程序并返回调用程序。功能:终止当前程序并返回调用程序。3打印输出(打印输出(5号调用)号调用)格式:格式:MOV DL,待打印字符的,待打印字符的ASCII码码 MOV AH,5 INT21H功能:将功能:将DL寄存器中的字符送打印机打印。寄存器中的字符送打印机打印。4结束调用(结束调用(4CH号调用)号调用)格式:格式:MOV AH,4CH INT21H5显示字符串(显示字符串(9号调用)号调用)格式:格式:LEADX,待显示字符串首偏移地址,待显示字符串首偏移地址 MOV AH,9 INT21H功能:功能:将当前数据区中以将当前数据区中以结尾的字符串送显示器显示。结尾的字符串送显示器显
22、示。MESSAGE DB CHARACTER COUNTMOV DX ,SEG MESSAGEMOV DS ,DXMOV DX ,OFFSET MESSAGEMOV AH ,9INT 21H功能:功能:从键盘上输入一字符串到用户定义的输入缓冲中,从键盘上输入一字符串到用户定义的输入缓冲中,并送显示器显示。并送显示器显示。6字符串输入(字符串输入(10号调用)号调用)格式:格式:LEADX,缓冲区首偏移地址,缓冲区首偏移地址 MOV AH,10 INT21H中断中断 21H 的功能的功能 A 能从键盘读入一串字符并把它存入用户定义的缓冲区中能从键盘读入一串字符并把它存入用户定义的缓冲区中.MAX
23、LEN DB 32ACTLEN DB?STRING DB 32 DUP(?)在数据区定义的字符缓冲区如下在数据区定义的字符缓冲区如下:输入字符串的指令如下输入字符串的指令如下:LEA DX ,MAXLENMOV AH,0AHINT 21H字符串开始字符串开始实际输入的字符数实际输入的字符数最大字符数最大字符数DATA SEGMENTSTR DB 50,0,50 DUP(?)CODE SEGMENTREAD_KEYS PROC FARMOV AX ,DATAMOV DS,AXLEA DX ,STRMOV AH,0AHINT 21HSUB CH,CHMOV CL,STR+1ADD DX ,2EXI
24、T:MOV AX,4C00H INT 21HREAD_KEYS ENDP20 8 C O M P U T E R 0DRETURNDATA ENDSASSUME CS:CODE,DS:DATACODE ENDSENDCODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK【例若要在屏幕上显示字符串【例若要在屏幕上显示字符串“Example of string display!”DATASEGMENT STR DB 0DH,0AH,Example of string display!DATAENDSSTACK SEGMENT STACK DB 100 DUP(0)
25、STACK ENDS程序如下:程序如下:BEGIN:MOV AX,DATA MOV DS,AX LEADX,STR MOV AH,9 INT21HMOVAH,4CH INT21HCODE ENDSENDBEGIN返回本章返回本章综合举例综合举例请画出该数据段数据存储的形式。请画出该数据段数据存储的形式。【例】已知一数据段中的数据为:【例】已知一数据段中的数据为:DATADATA SEGMENTSEGMENT A ADW DW MM BUFBUF DB AB DB AB,0DH0DH,0AH0AH C CEQU 500HEQU 500H B BDW 0FFAAHDW 0FFAAH D DDD D
26、D BUFBUF MMDB 2 DUPDB 2 DUP(1 1),2 DUP,2 DUP(2 2,BB)DATADATA ENDSENDS0CH00H41H42H0DH0AHAAHFFH02H00H01H01H02H42HABUFBDM【例】阅读下列程序,指出此程序所完成的功能以及在显示【例】阅读下列程序,指出此程序所完成的功能以及在显示器上显示的内容。器上显示的内容。DATA SEGMENT NUM DB 01000101B BUF DB 0DH,0AH,(NUM)=STR DB 4 DUP(?)(?)DATA ENDSSTACKSEGMENT STACKDB200 DUP(0)STACKE
27、NDSMOV AX,DATA MOV DS,AX LEA DI,STRMOV AL,NUM MOV CL,4SHR AL,CLOR AL,30HMOV DI,ALINC DIMOV AL,NUM AND AL,0FHOR AL,30HMOV DI,ALSTART:INCDIMOV BYTE PTR DI,HINCDIMOV BYTE PTR DI,LEADX,BUF MOV AH,9INT21HMOV AH,4CHINT21HCODE ENDS END STARTCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODEDATA SEGMENT INFO1DB0DH,0
28、AH,INPUT STRING:INFO2DB0DH,0AH,OUTPUT STRING:BUFADB81 DB?DB 80 DUP(0)【例】从键盘上输入一串字符到输入缓冲区,然后将输入的【例】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。字符串在显示器上以相反的顺序显示。BUFB DB81 DUP(0)DATA ENDSSTACKSEGMENTDB200 DUP(0)STACKENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODELEADX,INFO1MOV AH,9;9号调用,显示输入提示信息号调用,显示输入提示信
29、息INT21HLEADX,BUFAMOV AH,10 ;键盘输入字符串到缓冲区键盘输入字符串到缓冲区BUFAINT21HLEASI,BUFA+1 MOV CH,0;取字符长度取字符长度CX MOV CL,SIADDSI,CX ;SI 指向字符串尾部指向字符串尾部LEADI,BUFB;DI指向字符串变量指向字符串变量BUFBMOV AX,DATAMOV DS,AXSTART:MOV AL,SIMOV DI,ALDECSIINC DILOOP NEXTMOV BYTE PTR DI,LEADX,INFO2MOV AH,9 ;9号调用,显示输出提示信息号调用,显示输出提示信息INT21HNEXT:LEADX,BUFBMOV AH,9 ;反向显示字符串;反向显示字符串INT21HMOV AH,4CHINT21HCODE ENDS END START