Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计

Similar presentations


Presentation on theme: "第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计"— Presentation transcript:

1 第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计
宏定义与宏调用 汇编语言程序设计实例

2 几个概念 汇编语言 汇编语言源程序 汇编 汇编程序

3 4.1 8086汇编语言的语句 汇编语言由指令性语句和指令性语句组成 一、指令性语句格式 二、指示性语句格式
4. 汇编语言的语句 汇编语言由指令性语句和指令性语句组成 一、指令性语句格式 [标号:] 操作码 [操作数1,] [操作数2] ;[注释] 二、指示性语句格式 [标识符(名字)] 指示符(伪指令) 表达式 三、有关属性 存储器操作数的属性有三种:段值、段内偏移量和类型。

4 4.2 8086汇编中的伪指令 一、 符号定义语句 1、等值语句 格式:符号名 EQU 表达式 例: ⑴ PORT EQU 1234
4. 汇编中的伪指令 一、 符号定义语句 1、等值语句 格式:符号名 EQU 表达式 例: ⑴ PORT EQU 1234 ⑵ BUFF EQU PORT+58 ⑶ MEM EQU DS:[BP+20H] ⑷ COUNT EQU CX ⑸ ABC EQU AAA

5 2、等号语句 格式: NUM=34 …… NUM=34+1

6 二、变量定义语句 格式: 符号名 DB/DW/DD 表达式

7 1、定义一组数据 2、定义一串字符 例2: STR DB ‘ Welcome !’ 3、定义保留存储单元 例3: SUM DW ? , ?
例1: BUFF DW 1234H, 0ABCDH, 8EH DW –79DH, 7B6AH 2、定义一串字符 例2: STR DB ‘ Welcome !’ 3、定义保留存储单元 例3: SUM DW ? , ?

8 4、复制操作 复制操作符DUP(Duplication)可预置重复的数值 5、将已定义的地址存入内存单元 例5: LIT DD CYC
例4: ALL_ZERO DB 0,0,0,0,0 用复制操作可改为: ALL_ZERO DB 5 DUP(0) 5、将已定义的地址存入内存单元 例5: LIT DD CYC CYC: MOV AX , BX

9 三、段定义语句 1、 段定义语句格式: 只需要掌握 段名 SEGMENT 段名 SEGMENT [定位类型] [组合类型] [‘类别’]
1、 段定义语句格式: 段名 SEGMENT [定位类型] [组合类型] [‘类别’] …… 段名 ENDS 只需要掌握 段名 SEGMENT

10 2、段假设语句 ASSUME 段寄存器名:段名[,…] 3、 ORG伪指令与地址计数器 $ ORG伪指令格式: ORG <表达式> 4、PUBLIC和 EXTRN伪指令

11 四、过程定义语句 过程名 PROC NEAR/FAR …… RET 过程名 ENDP

12 4.3 8086汇编中的运算符 一、常用运算符 1、算术运算符 2、逻辑运算符 +(加)、-(减)、*(乘)、/(除)、MOD(求余)。
4. 汇编中的运算符 一、常用运算符 1、算术运算符 +(加)、-(减)、*(乘)、/(除)、MOD(求余)。 2、逻辑运算符 AND、OR、XOR、NOT

13 3、关系运算符 例: MOV DL , 10H LT 16 EQ(相等)、NE(不等、) LT(小于)、GT(大于)、
LE(小于等于)、GE(大于等于)。 例: MOV DL , 10H LT 16 例: AND AX , 555 GT 222

14 二、 常用的操作符 例:MOV BX , OFFSET BUFF 4、分析操作符 1)SEG操作符 2)OFFSET操作符
二、 常用的操作符 4、分析操作符 1)SEG操作符 例: MOV AX , SEG BUFF 2)OFFSET操作符 例:MOV BX , OFFSET BUFF

15 3)TYPE操作符 对于变量有3种: 1 字节型; 2 字型; 4 双字型; 对于标号有2种:-1 NEAR(段内),
对于变量有3种: 字节型; 字型; 双字型; 对于标号有2种:- NEAR(段内), - FAR(段间)。 例: BUFF DB 20H MOV BX , OFFSET BUFF  MOV BX,01

16 4)LENGTH操作符 5)SIZE操作符 SIZE=TYPE×LENGTH 例:BUFF DB 10DIP(?) MOV CX,LENGTH BUF  MOV CX,10 MOV CX,SIZE BUF  MOV CX,20

17 5、综合运算符(合成操作符) 1)PTR运算符 格式: 类型 PTR 表达式 例:INC WORD PTR [BX] 2)THIS操作符
例:FIRST EQU THIS BYTE SECOND DW DUP (?)

18 4.4汇编语言程序设计 常用的汇编语言程序框架: DATA SEGMENT ;定义数据段 VAL1 DB 12H , 8EH ;定义变量
…… DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME DS:DATA , CS: CODE ;段属性说明 START: MOV AX , DATA ;初始化DS MOV DS , AX MOV AX , 4C00H ;返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束

19 一、汇编语言程序设计基本步骤 分析问题-> 绘制流程图->编写程序->检查和调试 二、汇编语言程序的基本结构

20 1、顺序结构

21 2、分支结构

22 3、循环结构

23

24 4、子程序 Call proc1 ret

25 4.5 宏定义与宏调用 1、宏定义 宏指令名 MACRO <形式参量表> ENDM 2、宏调用 宏指令名 实元表

26 …… 例: MULTY MACRO OPR1,OPR2,RESULT ;宏定义 PUSH AX MOV AL, OPR1
MOV AH, OPR2 IMUL OPR2 MOV RESULT , AX POP AX ENDM …… DATA SEGMENT XX DB 12 YY DB 34 ZZ DW ? MULTY XX,YY,ZZ ;宏调用,实参替代虚参

27 4.6汇编语言程序设计实例 1、算术运算例题 例1:在偏移首地址为ARRAY的内存储区,有100个字型数据,要求将数组的每个元素加1,试编写汇编语言程序完成该要求。 DATA SEGMENT ARRAY DW DUP (?) ;定义100个字型随机数 DATA EDNS CODE SEGMENT ASSUME DS:DATA,CS:CODE ……

28 完整程序请参看教材 LEA BX , ARRAY ;设数组首地址指针 MOV CX , LENGTH ARRAY ;数组数据长
AA1: INC WORD PTR [BX] , ;指定为字型数加1 ADD BX , ;移动地址指针 LOOP AA ;循环操作 …… 完整程序请参看教材

29 例2: 有两个无符号字节型数组,设数组元素个数相等,编程将数组中的对应元素相加,结果存入另一内存区。
DATA SEGMENT M DB DUP (?) M DB DUP(?) M DW 20 DUP (0) DATA ENDS CODE SEGMENT ……

30 …… LEA SI , M1 ; 设数组1的地址指针 LEA DI , M2 ;设数组2的地址指针
LEA BX , M ;设结果区的地址指针 MOV CX , 20 AA1: MOV AL , [SI] ADD AL , [DI] MOV [BX] ,AL ADC BYTE PTR[BX+1] ,0 ;存结果的进位 INC SI INC DI ADD BX , 2 LOOP AA1

31 2、逻辑处理题 例1:将寄存器AL中高、低4位交换 …… MOV AL , 0ABH MOV CL , 4
ROL AL , CL ;移出位补充移空位4次

32 例2:将AX中的内容按相反顺序存入BX中 …… MOV AL , 1234H MOV CX , 16
AA1: SHL AX , ;移出的位进到CF RCR BX , ;AX中移出的位进入BX LOOP AA1

33 例1:编程将以$结束的字符串中的小写字母改为大写字母。
3、代码转换例题 例1:编程将以$结束的字符串中的小写字母改为大写字母。 DATA SEGMENT STR DB ‘heLLo,eveRyboBY !’,’$’ DATA ENDS ……

34 LEA BX , STR A1: MOV AL ,[BX] CMP AL , ‘$’ ;是$符,则结束 JE DONE CMP AL , ‘a’ JB NEXT ;低于,则为大写字母 CMP AL ,’z’ JA NEXT ;高于,则不是字母 SUB AL , 20H ;将小写字母改为大写 MOV [BX] , AL NEXT: INC BX JMP A1 ……

35 例2:十六进制数到十进制数的转换。 除10取余法

36 …… MOV AX , 4B6CH MOV CX , 0 ;统计除法次数 MOV BX , 10 ;
A1: MOV DX , ;被除数扩展为32位 DIV BX PUSH DX ;将转换好的数存入堆栈 INC CX OR AX , AX ;转换直到商为0 JNZ A1

37 4、表格处理题 例1:编程序将0-9的数字转换成所要求的密码 明码和密码的映射关系为: 0 1 2 3 4 5 6 7 8 9
DATA SEGMENT TABLE DB 2,7, 1, 6 ,9, 0, 8, 3, 4, 5 ;密码表 VAL1 DB 8, 4, 1, 7, ; 被加密码(明码) VAL2 DB 5 DUP(?) DATA ENDS ……

38 …… MOV SI , OFFSET VAL1 MOV DI , OFFSET VAL2 MOV CX , 5 LEA BX , TABLE ;表格首地址指针 A1: MOV AL ,[SI ] ;取明码 XLAT ;转换为密码 MOV [DI] , AL INC SI INC DI LOOP A1

39 6、按数据大小排序题 例1:编程序实现,从一串带符号字型数据中找出最大值。 …… DATA SEGMENT
BLOCK DW 762EH,6A8BH,-664AH,0B945H,-85DH COUNT EQU ($-BLOCK)/2 DATA ENDS ……

40 LEA SI , BLOCK MOV CX , COUNT MOV AX , [SI] ;取第1个数 DEC CX ;准备与下个数比较 AA1: ADD SI , 2 CMP AX , [SI] ;与下个数比较 JG AA ;前一个数大,则保留下次再比 MOV AX , [SI] ;否则,取后一个数下次再比 AA2: LOOP AA1 ……

41 4.7 DOS功能调用与子程序设计 调用过程为: ⑴ DOS功能调用号送AH寄存器;
⑵ 如果需要,按要求给定输入参数(有的不需要输入参数); ⑶ 写入中断指令INT 21H。 调用结束,按功能使用其输出参数。

42 1、单字符输入-1号 功 能:从键盘输入1个字符 输入参数:无 输出参数:AL=ASCII码

43 2、单字符输出-2号 例:从键盘输入两个1位十进制数,求两数之和并在屏幕上显示结果。 功 能:在屏幕上显示1个字符(ASCII码)
输入参数:DL=ASCII码 输出参数:无 例:从键盘输入两个1位十进制数,求两数之和并在屏幕上显示结果。

44 MOV AH , ;DOS调用输入第一个数 INT 21H MOV BL , AL ;保存输入的第一个数 MOV AH , 1 ADD AL , BL ;两个ASCII码相加 AAA ; 调整加法结果为非压缩BCD数 MOV DL , AL ADD DL , 30H ;加法结果转换成ASCII码 MOV AH , ;DOS调用输出到屏幕

45 3、多字符输入-0AH 功 能: 多个字符输入到缓冲区 输入参数:DS:DX=输入缓冲区首地址 输出参数:DS:DX=输入字符串所在缓冲区
功 能: 多个字符输入到缓冲区 输入参数:DS:DX=输入缓冲区首地址 输出参数:DS:DX=输入字符串所在缓冲区 地址

46 4、多字符输出-9号 功 能:多个字符输出到屏幕显示 输入参数:DS:DX=输出字符缓冲区首地址 输出参数:无
功 能:多个字符输出到屏幕显示 输入参数:DS:DX=输出字符缓冲区首地址 输出参数:无 例1:在屏幕上显示一串字符 。 DATA SEGMENT BUFF DB ‘How do you do?’,0DH,0AH,’$’ DATA ENDS

47 CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX , DATA MOV DS , AX LEA DX , BUFF MOV AH , 9 INT 21H ……

48 5、单字符输入/输出-6号 6号DOS功能实际上是1号和2号功能的组合,当DL寄存器的内容为0FFH时,6号功能与1号功能同,即从键盘输入单个字符;而当DL寄存器中放入字符的ASCII值,它就是2号功能。

49 6、过程终止-4CH号 该调用的功能是结束当前程序,并返回调用它的程序,如在DEBUG状态下运行,则返回DEBUG;如果在DOS下运行,则返回DOS。在汇编语言程序结束处放上MOV AX ,4C00H和INT 21H两条指令,以利于程序执行完毕,返回操作系统控制。

50 7、子程序设计 设计子程序要提供以下信息: ⑴子程序的功能 ⑵调用时需要的输入参数(入口参数) ⑶调用后提供的输出参数(出口参数) ⑷子程序中所使用的寄存器(以便调用前做必要的保护)

51 例1:编写一子程序,完成一个2位十六进 制数到对应的ASCII码的转换。 子程序名: CONHA 功 能: 将2位十六进制数转换成对应
功 能: 将2位十六进制数转换成对应 的ASCCII码 输入参数: AL=待转换的数 输出参数: BX=转换好的ASCII码 使用寄存器:AL、AH、BX、CL

52 CONHA PROC FAR MOV AH , AL ;保存待转换的数 AND AL , 0FH ;处理十六进制数低位
CMP AL , 0AH ;是16进制中的字母吗? JB ASC ;否,转移 ADD AL , ;是,先加7 ASC1: ADD AL , 30H ;转换为ASCII码 MOV BL , AL ;保存转换好的低位 MOV CL , ;移位控制 SHR AH , CL ;将原数右移,处理高位 CMP AH , 0AH ;是16进制中的字母吗? JB ASC ;否,转移 ADD AH , ;是,先加7 ASC2: ADD AH, 30H MOV BH , AH ;保存转换好的高位 RET CONHA ENDP

53 例2:用子程序调用形式,编写从键盘输入4位16进制数的程序。
子程序名: ZH 功 能:检查键盘输入错误,将键入值转换成16进制数 输入参数:AL 输出参数:AL 使用寄存器:BX,CX

54 CODE SEGMENT ASSUME CS :CODE START: MOV CX , 4 ;输入4次
MOV DX , CX ; 转换4次 MOV BX , ;用BX保存输入数 RE1: MOV AH , ; 从键盘输入 INT 21H CALL ZH ;通过子程序转换 SHL BX , CL ;组合成16进制数

55 ADD BL , AL DEC DX JNZ RE ;循环输入4个数 MOV AX , 4C00H INT 21H

56 ZH PROC CMP AL , ‘9’ ;将ASCII码转换为16进制 JBE A2 ;键入值≤’9’(’0’-‘9’)则减30H CMP AL, ‘a’ ;键入值<’a’(‘A’-‘F’) 则减37H JB A1 SUB AL , 20H ;值在’a’ -‘f’则先减20H,再减37H A1: SUB AL , 7 A2: SUB AL , 30H RET ZH ENDP CODE ENDS END START


Download ppt "第4章 8086汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计"

Similar presentations


Ads by Google