资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,第四章 汇编语言程序设计,南理工紫金学院,帅辉明,汇编语言,数据和表达式,伪指令,语法,程序设计,顺序、分支、循环、子程序,DOS,功能调用,本章重点,机器语言:由,0,、,1,代码所组成的语言。面向机器,同一组代码对不同的计算机表示不同的含义。,汇编语言:由助记符表示的语言。面向机器。,高级语言:用一些接近人们书写习惯的英语和数学表达式形式的句子编写程序。这种语言不面向机器,而是面向过程、面向对象。,4.1,程序设计语言概述,高级语言,C,、,C+,、,PASCAL,语言,如:,Turbo C,、,VC+,、,DELPHI,、,GNU GCC,汇编语言,机器语言,高级语言,虚拟机,C#,、,JAVA,.NET,、,JVM,编译,汇编,中间语言,各种语言的关系,1.,数据,(,1,)常数,表示,汇编过程中已经有确定数值,的量,主要用于做指令中的立即数、寻址中的位移量,或在伪指令语句中给变量赋值。,数值常数:由二、八、十和十六进制表达的数,字符串常数:用 (或“ ”)括起来的一串,ASCII,码字符,等效为一组数值常数,4.2 8086,汇编语言介绍,0101,B,3247,O,2873,D,23AB,H,12AB= 31H,、,32H,、,41H,、,42H,内存单元的数据,变量,值在程序运行期间可以改变,。,需要事先定义,通过变量名引用。变量名表示变量的首地址。,在,数据段或附加段用数据定义伪指令定义,。,变量的属性,段:变量所在段基址,偏移量:变量在段内的偏移量,类型:变量的字节数,,DB,、,DW,、,DD,(,2,)变量,在指令前面,代表指令所在存储单元的地址。,通常作为程序中转移、调用、循环指令的转移目标地址。,定义方式 标识符:,标号的属性:,段:变量所在段基址,偏移量:变量在段内的偏移量,距离:,NEAR,段内标号、,FAR,段外标号,(,3,)标号,2,、表达式,由常数、变量或标号、运算符连接而成,分类:数字表达式、地址表达式,(,1,)运算符,算术运算符,+,、,-,、*、,/,、,mod,逻辑运算符,AND,、,OR,、,NOT,、,XOR,关系运算符,EQ,、,NE,、,LT,、,LE,、,GT,、,GE,注意与,算术运算指令,和,逻辑运算指令,的区别,AND,DX, PORT,AND,0FFH,MOV AX, VALUE MOD 7,;VALUE=50,MOV AL, NOT 0FH,MOV AX, 0FH EQ 1111B,举例:,MOV AX, 1,MOV AL, F0H,关系成立结果全为,1,否则全为,0,MOV AX, FFFFH,对存储单元的操作,(,2,)数值返回运算符,段基址运算符,SEG,SEG,变量,/,标号,偏移量运算符,OFFSET,OFFSET,变量,/,标号,类型运算符,TYPE,TYPE,变量,/,标号,长度运算符,LENGTH,LENGTH,变量,字节总数运算符,SIZE,SIZE,变量,SEG,返回变量,/,标号的段基址,OFFSET,返回变量,/,标号的段内偏移,举例:,MOVAX,SEG K1,MOV BX,SEG ARRAY,MOVBX,OFFSET ARRAY,变量,K1,所在段的段基址为,0915H,变量,ARRAY,所在段的段基址为,0947H,,偏移为,0100H,运算符,SEG,和,OFFSET,= MOVAX,0915H,= MOV BX,0947H,= MOVBX,0100H,运算符,TYPE,数据,类型,伪指令,TYPE,值,变量,字节,DB,1,字,DW,2,双字,DD,4,四字,DQ,8,五字,DT,10,标号,近程,NEAR,-1,远程,FAR,-2,LENGTH,返回数组元素的个数,若变量用,重复数据操作符,DUP,定义,,则返回,最外层,DUP,的值,若变量无,DUP,说明则返回,1,SIZE,返回数组变量所占的总字节数,=LENGTH*TYPE,运算符,LENGTH,和,SIZE,K1DB10H DUP(0),K2DB“ABCDEF”,TYPE K1 = TYPE K2 =,LENGTHK1 =LENGTH K2 =,SIZE K1 = SIZE K2 =,举例:,1,10,1*10=10,1,1,1*1=1,(,3,)属性运算符,类型修改运算符,PTR,类型,PTR,地址表达式,短转移运算符,SHORT,JMP SHORT,标号,段超越运算符,段名:地址表达式,(,4,)运算符优先级,优先级,运算符,高,LENGTH,,,SIZE,,, ,段超越运算符,PTR,,,OFFSET,,,SEG,,,TYPE,,,THIS,*,,,/,,,MOD,,,SHL,,,SHR,+,,,-,EQ,,,NE,,,LT,,,LE,,,GT,,,GE,低,NOT AND OR XOR,SHORT,指令语句,伪指令语句,宏指令语句,3.,伪指令,执行语句。经过汇编产生可供计算机硬件执行的机器目标代码。,说明语句。如:程序有几个段,段的名称,是否需要预留存储空间等。不直接产生目标代码。,指令语句,+,伪指令语句。替代源程序中一段有独立功能的程序,汇编时产生相应的目标代码。,定义变量,并关联变量名和存储单元地址。,定义格式:,变量名,类型,数据项表,类型:,DB DW DD DQ DT,数据表项,:变量的长度、数组元素个数、变量的初值,(,1,)变量定义伪指令,DBYTE DB -5H,一个字节变量,值为,-5H,DWORD DW 6*3,一个字变量,值为,18,DDWORD DD 1234H,一个双字变量,值为,1234H,数据定义例数值初值,FBH,12H,00H,34H,12H,00H,00H,DBYTE,DWORD,DDWORD,STRING1 DB AB,一个字节变量,值为,A,STRING2 DW AB,一个字变量,值为,AB,STRING3 DD AB,一个双字变量,值为,AB,数据定义例,字符串,41H,42H,42H,41H,42H,41H,00H,00H,STRING1,STRING2,STRING3,伪指令:,DUP,,重复赋值,格式:重复次数,DUP(,操作数,.,操作数,),SUBBDW1000 DUP (?),包含,1000,数组元素,值不确定,SDKPDB2 DUP (0,2 DUP(1),包含,2,个数组元素,每个元素由,2,部分构成,0,和另一个数组,B,数组,B,包含,2,个元素,值为,1,数据定义例,数组,(1),BUFFDB16 DUP (Welcome),包含,16,个元素,每个元素的值为,Welcome,LINGDB4 DUP (0,1),包含,4,个元素,每个元素的数据为,0,和,1,数据定义例,数组,(2),数组共占,16*7,个字节,!,数组共占,4*2,个字节,!,数组实际所占空间和用,SIZE,求得数值不一定相同,!,赋值伪指令,:,EQU,定义格式:符号名,EQU,表达式,等号伪指令,:,定义格式:符号名 ,表达式,特点,:都不直接产生,机器指令,区别,:赋值伪指令不可以重名,(,2,)符号定义伪指令,COUNT=,5,;,常数,NUM=,13+5-4,;,数值表达式,NUM = NUM+1,ADR1 EQU,DS:BP+4,;,地址表达式,CREGEQU,CX,;,寄存器名,CBDEQU,DAA,;,指令名,L1EQU,SUBSTART,;,标号名,WOEQU,WORD PTR DBYTE,;,变量名,举例:,把源程序划分成若干逻辑段,便于汇编程序生产相应代码,便于连接程序生产可执行程序。,一个汇编语言源程序可以包含若干个逻辑段(代码段、数据段、附加段或堆栈段),段与段之间的顺序可随意排列。需独立运行的程序,必须包含一个代码段,,并指示程序执行的起始点,一个程序只有一个起始点。,(,3,)段定义伪指令,段名,SEGMENT ,定位类型,组合类型,类别名,段名,ENDS,定位类型:表示对该段起始边界的要求,组合类型:段与段之间如果连接和定位,类别名:用于分类排序,逻辑段定义格式,STACK,SEGMENT STACK,.,STACK,ENDS,DATA SEGMENT,.,DATA ENDS,CODE,SEGMENT,ASSUME,CS:CODE,DS:DATA,SS:STACK,.,CODE,ENDS,格式:,ORG,表达式,功能:表明从表达式所指地址开始存放程序或数据,举例:,DATASEGMENT,BUFF1DB23,,,56H,,,EOF,ORG2000H,BUFF2DBSTRING,DATAENDS,(,4,)设置起始地址伪指令,表示整个源程序结束,,停止汇编,。,定义格式:,END,标号,注意:,与第一条指令的标号相同;,必须是最后一条语句;,若有多个,END,语句,只有,第一个有效,。,(,5,)汇编结束伪指令,说明段寄存器和用户编写的段的对应关系,表示出用户编写的段属于系统规定的哪个段,一般设在代码段中,定义格式:,ASSUME,段寄存器名,:,段名,段寄存器名,:,段名,(,6,)段寄存器设定伪指令,注意,:,该语句仅仅说明段寄存器和段的对应关系,但不等于段基址已经装入了段寄存器,3.3,汇编语言程序设计,汇编程序的结构框架,DATA SEGMENT,DATA,ENDS,CODE,SEGMENT,ASSUME,CS:CODE, DS:DATA,;,定义过程,START,:,MOVAX,,,DATA,MOVDS,,,AX,MOVAH,,,4CH,INT21H,CODE,ENDS,END,START,数据段定义变量,段寄存器定义,DS,的装入,退出程序,过程:具有一定功能的子程序,,CALL,调用,定义格式:,过程名,PROC,距离类型,ret,过程名,ENDP,注意:,过程和段可以互相嵌套,但不可交叉覆盖,每个过程一定有返回指令,RET,,可能有多个,最后一条指令必须是,RET,(,7,)过程定义伪指令,名字,操作码,操作数, ,注释,START,:,MOV AX,,,30H ; AX,30H,名字,以字母开头,由字母、数字、特殊字符,(?,、*、,_,、,$,、,等,),组成,不超过,31,字符,不能与保留字相同,任选,多数指令不用,伪指令用,指令语句名字用“,:,”分界,伪指令语句用,空格,分界,标号名、变量名、常量名、过程名、段名等,4,、汇编语言语句结构,操作码,必不可少的核心,规定了所要执行的操作,由指令或伪指令助记符组成,操作数,参与操作的数据或地址,可以有多种表达形式,之间用,隔开,注释,; ,后面的字符串,1,、程序设计的基本步骤,分析题目与,确定算法,合理分配存储空间和存储器,编制程序流程图,编写源程序,调试源程序,4.3,汇编语言程序设计,2,、顺序结构,例,4-15,把,BUF,开始的两个字节单元中的压缩,BCD,数相加,结果存入字节单元,RES,中,BCD,码:为了让计算机能识别十进制数,例如:通常十进制数,49,在计算机中为,31H,,不方便程序员观察和记忆,用,BCD,码存放则直接为,49H,buf,db 89h,34h,res,dw,?,LEA BX,BUF,;BX,为,BUF,的有效地址,MOV AL,BUF,;BUF,中的第一个字节,ADD AL,BX+1,; BX+1,为,BUF,中的第二个字节,DAA,MOV RES,AX,例,4-18,求数,X,的绝对值,并送值回原处,STACK,SEGMENT STACK,DW256DUP(?),STACK,ENDS,DATA,SEGMENT,XADRDW3456H, 8192H,DATA,ENDS,CODE,SEGMENT,ASSUME,CS:CODE,DS:DATA,SS:STACK,3,、分支结构,定义了一个空栈,START:MOV AX, DATA,MOV DS, AX,MOV AX, XADR,AND AX, AX,JNS DONE,NEG AX,MOV XADR, AX,DONE:MOV AH, 4CH,INT 21H,CODE,ENDS,END START,例,4-20,求某数据区内负数的个数,设数据区第一个单元存放数据个数,第二单元开始存放数据,最后一个单元存放结果。,STACK SEGMENT STACK,DW64 DUP(?),STACK ENDS,CODE SEGMENT,ASSUME,CS:CODE,SS:STACK,DS:CODE,4,、循环结构,START:MOVDI, 3000H,;,设置数据区首地址,MOVCL, DI,;,设置循环次数,(,即数据个数,),(设置初值),XORCH, CH,;CH,清,0,MOV BL, CH,;BL,统计负数个数,初值为,0,INCDI,;,指向第一个元素,(循环条件改变),A1:MOVAL, DI,TESTAL, 80H,;,测试数据首位,=1?,JEA2,;ZF=1,数据首位,=0,INCBL,;,负数个数,+1,A2:INCDI,;,指向下一个元素,LOOP A1,MOVDI, BL,;,存放统计结果,注意:,主程序与子程序之间的参数传递,保护和恢复主程序中寄存器的现场数据,主程序与子程序之间的参数传递方式,寄存器传递参数,堆栈传递参数,指定存储单元传递参数,5,、子程序设计,例,4-23,求,2,个,32,位数的和。(利用堆栈传递参数),CODESEGMENT,ASSUME,CS:CODE,DS:CODE,SS:CODE,ORG 100H,;,以下指令从偏移为,0100H,处开始,START:JMPMAIN,ADDT1DW1200H, 1200H,;,数据定义,ADDT2DW2100H, 2100H,SUMDW2DUP(?),MAIN:,MOVAX, CODE,MOV DS, AX,MOVCX, 0002,;,定义调用次数,MOVSI, 0,;,定义数据指针,CLC,;CF,0,REPEAT:MOVAX, ADDT1,;,取当前数,X,PUSHAX,;,压入堆栈,MOVAX, ADDT2SI,;,取当前数,Y,PUSHAX,;,压入堆栈,CALLADDITION,;,调用加法子程序,MOVSUMSI, AX,;,送当次运算结果,INCSI,INCSI,;,指向下一个数据,LOOPREPEAT,MOVAX, 4C00H,;,结束调用,INT21H,ADDITION,PROC,NEAR,MOVBP, SP,;,指向栈顶,MOVAX, BP+,2,;,取第一个加数,ADC,AX, BP+,4,;,取第二个加数,RET4,;,弹出两个加数,ADDITION,ENDP,CODE,ENDS,END,START,DOS,系统功能调用和,BIOS,中断调用,1,常用,DOS,系统功能调用,DOS,系统功能调用即,DOS,为用户提供的一组例行子程序,其调用和返回不是用,CALL,和,RET,,而是用,INT n,和,IRET,。这些子程序可分为以下几个方面:,磁盘的读写及控制管理。,内存管理,基本输入,/,输出管理(如键盘、打印机、显示器),其他管理(如日期、时间),所有这些子程序按顺序编号(调用号),分别为,0,75H,。,调用方法:子程序入口参数送相应寄存器,调用功能号送,AH,INT 21H,(,1,),1,号功能调用(键盘输入并显示),MOV AH,,,1,INT 21H,功能:扫描键盘,等待输入,若有键盘按下,则将键值读入并判断是否为,Ctrl+Break,键,若是,退出;若不是,则将键值(字符的,ASCII,码)送,AL,,同时在,CRT,上显示该字符。,(,2,),2,号功能调用(显示一个字符),MOV AH,,,2,MOV DL,,待显字符,ASCII,码,INT 21H,(,3,),9,号功能调用(字符串显示),MOV DX,,待显示字符串首地址,MOV AH,,,9,INT 21H,功能:将以,$,为结束标志的字符串在屏幕上显示。,说明:,(,1,)执行前要在,DS,数据段定义一个字符串,该字符串必须在,$,结尾。,(,2,)若字符串无,$,结尾,则在其尾部加一,$,;若字符串中间有,$,,则只能采用,2,号功能调用逐个字符输出。,(,4,),10,号功能调用(字符串输入),MOV AH,,,10,MOV DX,,待存数据区首地址,INT 21H,功能:从键盘上接收字符串送到内存数据中。,注意:数据区的定义形式:,BUF DB 50,;数据区长度,DB,? ;实际输入字符的个数,DB 50 DUP,(?) ;存放输入的字符,如果输入的字符数大于数据区所定义的字符个数,就会发出“嘟嘟”声。,(,5,),4CH,号功能调用(返回操作系统),MOV AH,,,4CH,INT 21H,功能:结束当前正在执行的程序,返回操作系统,屏幕显示操作系统提示符。,2,BIOS,中断调用,驻留在,ROM,中的,BIOS,提供了系统加电自检、引导装入,I/O,设备的处理程序及接口控制等功能模块来处理所有的系统中断。与,DOS,系统功能调用类似,用户可以直接用指令设置参数,然后中断调用,BIOS,中的程序。,下面介绍几条常用的中断调用。,(,1,)键盘中断调用(,INT 16H,),软中断,INT 16H,有多个功能,其中常用的是,0,、,1,、,2,号功能,0,号:,MOV AH,,,0,INT 16H,功能:从键盘读字符,并将其,ASCII,码送,AL,。扫描码送,AH,。与,DOS,的,1,、,8,号功能类似。,1,号:,MOV AH,,,1,INT 16H,功能:判断是否有键按下。有键按下,,ZF=0,,且,AL,,,AH,同上。无键按下,,ZF=1,。与,DOS,的,6,号、,0B,号功能类似。,例:按任意键,程序退出执行。,DOS,功能调用(,11,号功能):,MOV AH,,,0BH,INT 21H,CMP AL,,,0FFH,JZ STOP,;有键按下,,AL=0FFH,STOP,:,MOV AH,,,4CH,INT 21H,DOS,功能调用(,6,号功能):,MOV AH,,,06H,MOV DL,,,0FFH,INT 21H,JNZ STOP,;有键按下,,ZF=0,STOP,:,MOV AH,,,4CH,INT 21H,BIOS,中断调用(,INT 16H,):,MOV AH,,,1,INT 16H,JNZ STOP,;有键按下,,ZF=0,STOP,:,MOV AH,,,4CH,INT 21H,(,2,)显示器中断调用(,INT 10H,),INT 10H,的功能调用可以进行屏幕设置。共有,16,种功能号,其中的,0E,号功能与,DOS,的,2,号功能类似。,例:在当前光标位置显示人处字符“,7”,,并使光标进,1,。,MOV AH,,,0EH,MOV AL,,,37H,INT 10H,DOS,调用可实现相同的功能:,MOV AH,,,2,MOV DL,,,37H,INT 21H,
展开阅读全文