单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第七章 8086汇编语言中基本语法,助记符,指令:,CPU,可以执行的能完成特定功能的语句,能产生目标代码它主要由,CPU,指令组成伪指令:是一种不产生目标代码的语句,它仅仅在汇编过程中告,诉汇编程序应如何汇编,宏指令:它是一个指令序列汇编时凡有宏指令语句的地方都用,相应的指令序列的目标代码插入一、汇编语言源程序的一些必要成分,1、段结构的形成,、段定义伪指令:,SEGMENT,与,ENDS,段名,SEGMENT,段名,ENDS,(*),段名字必须在两处出现,而且必须致segment,和,ends,必须成对出现segment,定义一个段的开始,ends,定义一个段的结束,段寄存器说明伪指令:,assume,ASSUME,段寄存器名:段名,段寄存器名:段名,,(*),指出源程序中的逻辑段与物理段之间的关系当汇编程序汇编一个逻辑段时,即可利用相应的段寄存器寻址该逻辑段中的指令或数据只是通知汇编程序有关段寄存器与逻辑段的关系,并没有给段寄存器赋于实际的初值例如:,CODESEGMENT,ASSUMECS:CODE,DS:DATA,SS:STACK,MOVAX,DATA,MOVDS,AX,MOVAX,STACK,MOVSS,AX,CODEENDS,模块伪指令:,name,end,public,extrn,NAME,用于给源程序汇编以后得到的目标程序指定一个模块名,连接时需要使用这个目标程序的模块名。
NAME,模块名,(2),END,表示源程序到此结束,指示汇编程序停止汇编,对于,END,后面的语句可以不予理会END,标号,END,伪指令后面的标号表示程序执行的启动地址END,伪指令将标号的段基值和偏移地址分别提供给,CS,和,IP,寄存器方括号中的标号是任选项如果有多个模块连接在一起,则只有主模块的,END,语句使用标号3),PUBLC,伪指令说明本模块中的某些符号是公共的,即这些符号可以,提供给将被连接在起的其他模块使用,PUBLIC,符号,(4),EXTRN,EXTRN,伪指令说明本模块中所用的某些符号是外部的,即这些符号在将被连接在一起的其他模块中定义(在定义这些符号的模块中还必须用,PUBLIC,伪指令说明),EXTRN,名字:类型,,例如:程序的框架,datasegment,dataends,codesegment,assume,cs,:code,ds,:data,start:,mov,ax,data,mov ds,ax,codeends,endstart,2、数据的定义,常量、变量和标号,常量,:,一个常量如果是一个字符串,该字符串必须用单引号或双引号括起来,汇编语言把它们汇编成相应的,ASCII,码。
变量:,变量实际上代表着内存中一块存储单元,,变量有三个属性:段基址、段内偏移量以及类型变量的类型是指变量元素具有的字节数,字节变量表示一个8位数据,其类型为1;字变量表示一个十六位数据其类型为2;双字变量表示一个32位的数据,其其类型为4;,标号:,实际上是代码段中的某一指令的地址它也有三个属性:段地址、段内偏移量和类型标号的类型有两种:,NEAR,标号,,它只能在定义它的段内被引用,其类型为,l,:,FAR,标号,,它既可以在定义它的段内被引用,也可以在其他段内被引用,其类型为,2,,它代表了指令的段地址和偏移量标号可以在各种转移指令中作为操作数使用它只能定义在可执行的代码段中数据定义伪指令:,DB,DW,DD,DQ,DT,数据定义伪指令的用途是定义一个变量的类型,给存储器赋初值,或者仅仅给变量分配存储单元,而不赋于特定的值,第一种格式:,名字 伪指令 表达式,第二种格式:,名字 伪指令,DUP (,表达式),例题:画出经过如下数据定义后内存中数据的存放情况,var1 db 100,0ffh,var2 db ,abc,注意:字符串定义用,db,var3,dw,?,ab,var4,dw,1,3456h,var5,dd,56789h,var6 db 3 dup(1,2),符号定义伪指令:,equ,=,label,(1)EQU,和=,名字,EQU,表达式,例如:,CHAR EQU HELLO THE WORLD,(*),利用,EQU,伪指令,可以用一个名字代表一个数值,或用一个较,简短的名来代替一个较长的名字。
EQU,伪指令不允许对同一符号重复定义伪指令与,EQU,基本相同只是区别在于它可以对同一个名字,重复定义,(2),LABEL,名字,LABEL,类型,AREAW LABEL WORD MOV AREAW,AX,AREAB DB l00 DUP(?)MOV AREAB,AL,(四)其它的一些伪指令,(1),ORG,和$,ORG,指定了在它之后的代码或数据存放的起始地址的偏移量即 以语句中表达式的值作为起始地址,ORG ,在汇编程序对源程序的汇编过程中,使用地址计数器来保存当前正在汇编的指令的地址地址计数器的值可用$来表示汇编语言允许用户直接,用$来引用地址计数器的值.,ORG$+8,JNZ$+6,ARRAY DW 11H,12H,$+3,13H,(,假设,ARRAY,的起始地址为0070,H),(2).RADIX,定义源程序中书写数据时的隐含进位方式,.,RADIX ,(3),COMMENT,块注释伪指令,COMMENT,定界符 注释 定界符,二、表达式与运算符,1、算术运算符,算术运算符有加(十)、减(一)、乘(,)、除()、模(,MOD)、,左移(,SHL)、,右移(,SHR),七种。
除法返回的是商,而,MOD,操作返回除法操作的余数.例如,PI-INT EQU 3141610000 ;,PI-INT3,P-REM EQU 31416 MOD 10000 ;,P-REM1416,SHL,和,SHR,是移位操作般在建立屏蔽字时使用例如:,MASKB EQU 00110010B,MASKB1 EQU MASKB SHL 2 ;,MASKB1=11001000B,MASKB2 EQU MASKB SHR 2 ;,MASKB2=00001100B,注意:运算符的运算是在汇编时完成的,2、逻辑运算符,汇编语言的逻辑运算符有,AND,逻辑与,OR,逻辑或,XOR,逻辑异或,NOT,逻辑非,逻辑运算符与逻辑运算指令的区别在于前者在汇编时完成逻辑运算,而后者在执行指令时完成逻辑运算,MASKB EQU 00101011B,MOV AL,5EH,AND AL,MASKB AND 0FH;,ANDAL,0BH,;,(AL)=0AH,3、关系运算符,关系运算符有:,EQ,等于;,NE,不等,LT,小于;,GT,大于,LE,小于等于;,GE,大于等于,关系运算符比较两个操作数并产生一个逻辑值。
如果关系成立,则结果为,真(0,FFFFH),;,否则为,假(0000,H),关系运算符一般都,同其他操作结合以构成一个判断表达式例如要实现,AX=5,如果,CHOICE20,AX=6,如果,CHOICE20,那么可以使用下列语句:,MOV AX,(,(CH0ICE LT 20),AND 5),OR,(,(CHOICE GT 20),AND 6),4分析运算符,(1),SEG,求段基址,(2),OFFSET,求偏移地址,(3),TYPE,求符号名类型值,(4),SIZE,求为符号名分配的字节数,(5),LENGTH,求为符号名分配的项数,TABLE DW 100 DUP(?),MOV AX,SEG TABLE ;,把,TABLE,的段地址送,AX,MOV BX,OFFSET TABLE ;,把,TABLE,的偏移地址送,BX,MOV CX,TYPE TABLE ;,MOV DX,LENGTH TABLE,MOV BP,SIZE TABLE,注意:,LENGTH,和,SIZE,运算符只对用,DUP,定义的变量有意义,5.组合运算符,(1),PTR,运算符,PTR,运算符用于指定或暂时改变变量或标号的原有属性。
MOV,BYTE PTR,SI,0FFH,JMP,DWORD PTR,DI,VAR DW 100 DUP(?),MOV,BYTE PTR,VAR,AL,(2)THIS,运算符,LABC EQU THIS BYTE,LABD DW 4321H,MOV AL,LABC,MOV AX,LABD,操作系统使用的两种方式,(1)使用者:命令行方式或图形界面方式,(2)程序员:系统功能调用或应用程序接口(,API),系统功能调用,:,操作系统提供给应用程序的软件接口,完成应用程 序对系统的使用,系统功能调用的使用方法,(1)传送入口参数到指定寄存器中;有的子程序无入口参数,则只需安排后两个语句,(2)功能号送入,AH,寄存器中;,(3),INT 2lH4),系统将出口参数送到指定寄存器中或从屏幕显示出来例题:,从键盘输入一串字符到一个内存变量,遇到回车则结束输入,同时在屏幕上显示相同个数的一串星号DATASEGMENT,VARDB 10 DUP(0),DATAENDS,CODESEGMENT,ASSUME CS:CODE,DS:DATA,START:MOVAX,DATA,MOVDS,AX,LEADI,VAR,LAB:,MOV AH,8,INT21H,CMPAL,ODH,JZNEXT,MOVDI,AL,INCDI,MOVAH,2,MOVDL,2AH,INT21H,JMPLAB,NEXT:,MOVAH,4CH,INT21H,CODEENDS,END START,。