1 / 45

第四章 汇编语言程序设计

第四章 汇编语言程序设计. 第一节 汇编语言指令. 第二节 汇编语言程序设计方法. 第三节 汇编语言程序设计举例. 汇编语言的特点. 汇编语言是一种介于机器语言和高级语言之间的计算机编程语言。. 优点: 目标代码精简、占用内存少、执行速度快。. 缺点: 编程难度大、出错可能性大、程序设计和调试时间长、 可移植性差. 适用范围: 对内存容量和速度要求比较高的编程场合。. 汇编语言语句的分类. 汇编语言的语句可分为指令性语句(符号指令)和指示性语句(伪指令)。. 指令性语句: 是可执行语句,与机器指令相对应,命令 CPU 进行某种操作,其功能由硬件完成。.

damian
Download Presentation

第四章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 汇编语言程序设计 第一节 汇编语言指令 第二节 汇编语言程序设计方法 第三节 汇编语言程序设计举例

  2. 汇编语言的特点 汇编语言是一种介于机器语言和高级语言之间的计算机编程语言。 优点:目标代码精简、占用内存少、执行速度快。 缺点:编程难度大、出错可能性大、程序设计和调试时间长、 可移植性差 适用范围:对内存容量和速度要求比较高的编程场合。 汇编语言语句的分类 汇编语言的语句可分为指令性语句(符号指令)和指示性语句(伪指令)。 指令性语句:是可执行语句,与机器指令相对应,命令CPU进行某种操作,其功能由硬件完成。 指示性语句:是说明性语句,无对应的机器指令,它为汇编程序提供编译信息,为链接程序提供链接信息,其功能由软件完成。

  3. 第一节 汇编语言指令 一、基本语法成分 ★名字:用来标识一定的语法成分,有系统规定与用户定义两类。 ●标号和变量:又称为符号地址 标号和变量的属性: 1)段属性:SEG LABEL 2)偏移属性:OFFSET LABEL 3)类型属性: 标号类型:NEAR,FAR 变量类型:变量的存取单位,由定义方式指定,但可用PTR更改

  4. 例: data segment x dd 02a8b7654h y dw 5abch z dw ? f dw ? data ends code segment … mov ax,word ptr x mov dx,word ptr x+2 mov bx,y … Lab: mov z,ax …. JMP lab 变量 标号

  5. 常量:在汇编时已有确定的值,有立即数、字符串常数 和符号常数三种形式。 • 1)立即数 • 10010011B 35Q 678 0a5dh • 2)字符串常量 • ‘G’‘hjkkkh’ • MOV AL,’A’ • 3)符号常量,可放在任何位置定义 • data segment • x dd 02a8b7654h • aa = 3 不分配空间 • bb EQU 4 不分配空间 • cc = 257 不分配空间 • aa =6 不分配空间 • bb EQU 5 出错 • data ends

  6. ★ 运算符 • ● 数值运算符:算术运算符、逻辑运算符 、关系运算符 • + - * / MOD MOV AX,23*32 • NOT AND OR XOR HIGH LOW MOV AX,LOW 1234h(AX=34h) • EQ NE GT LT GE LE mov al,12 eq 34 • ● 修改属性的运算符:PTR运算符 • 类型说明符 PTR 地址表达式 • mov ax,word ptr x • inc BYTE PTR [DX]

  7. ● 返回属性或数值的运算符: • SEG运算符、OFFSET运算符、TYPE运算符(类型,返回字节数)、$运算符 • 格式:SEG/OFFSET/TYPE 变量名或标号 • Y DD 12345678H • … • MOV AX,TYPE y ● 方括号运算符和地址表达式 MOV AX,[BX+2]

  8. 二、伪指令 ★ 数据定义伪指令:用于定义变量并分配存储区 ● 字节定义伪指令DB DAT1 DB 16H,8/2,11011001B DB 214,-5,0d2h,’ABC’,’C’ COUNT DB $ - DAT1 DAT2 DB ?,7 DUP(‘F’) DAT3 DB 67 DUP(?) ● 字定义伪指令DW DW 1234H,50,’ab’,’c’,? 34h 12h 32h,00,62h,61h,63h,00h,xx,xx 在这里字符串中不允许超过2个字符 ● 双/三/四/五字定义伪指令DD/DF/DQ/DT

  9. ★ 符号定义伪指令:用于给符号定义一个数值,也可定义为别的符号名★ 符号定义伪指令:用于给符号定义一个数值,也可定义为别的符号名 ● 等值伪指令EQU ● 等号伪指令=:类似于EQU,但可以对变量进行再定义 ★ 段定义伪指令:提供了构造程序的手段 ● SEGMENT、ENDS伪指令 任何一个逻辑段从SEGMENT语句开始,到ENDS语句结束 ● ASSUME 伪指令:通知汇编程序,寻址逻辑段使用哪一个段寄存器 ● 0RG伪指令:用以规定目标程序或数据区起始存放单元的偏移量 ★ 过程与宏定义伪指令 ● 过程定义伪指令:PROC/ENDP ● 宏定义伪指令:MACRO/ENDM ● 条件汇编伪指令:MACRO/ENDM ★ 源程序结束伪指令END

  10. 例:DATA SEGMENT ORG 1000H NUM1 DB 12H,34H,56H,78H,90H NUM2 DW 1122H,3344H,5566H NUM3 DD 13572468H,87654321H NUM4 DW NUM1 DATA ENDS CODE SEGMENT … MOV AX,SEG DATA ; MOV DS,AX ; MOV BL,NUM1 ;12h MOV BX,NUM2+2 ;3344H MOV BL,BYTE PTR NUM3 ;68H MOV BX,WORD PTR NUM1+1 ;5634H MOV BL,NUM1[2*2] ;90H MOV BX,NUM2[4] ;5566H MOV BX,WORD PTR NUM3[3] ;2113H MOV BX,3 ; MOV BL,NUM1[BX] ;78H MOV SI,OFFSET NUM1 ;1000H MOV BX,[SI+1] ;5634H MOV BX,NUM4 ;1000H

  11. 段定义结构: 段名 SEGMENT 定位参数 链接参数 字长选择 ‘分类名’ … 段名 ENDS 例: DATA SEGMENT WORD PUBLIC USE16 ‘DATA’ … BYTE MEMORY USE32 任意字符串 PARA COMMON PAGE STACK AT XXXXh DATA ENDS

  12. 例:完整的汇编程序结构 STACK1 SEGMENT STACK DW 100 DUP(?) STACK1 ENDS EDATA SEGMENT BUF DB 100 DUP(?) EDATA ENDS DATA SEGMENT ORG 100H BLOCK DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX … MOV AH,4CH INT 21H CODE ENDS END START

  13. DOS及BIOS功能调用 ★ 调用模式:MOV AH,功能号   设置入口参数 INT n   分析出口参数 ★ 软件中断可分为3部分: ●DOS中断,占用类型号为20H~3FH。 ●ROM BIOS中断,占用类型号为10H~1FH。 ● 自由中断,占用类型号40H~FFH,可供系统或应用程序设置开发的中断处 理程序用。

  14. ★DOS中断及功能调用 ● DOS专用中断:INT 22H、INT 23H和INT 24H 3个中断, 属DOS操作时专用,用户不要直接使用。 ● DOS可调用中断:是指INT 20H、INT 21H、INT 25H、INT 26H、INT 27H和 INT 2FH 6个中断。这6个中断可供用户直接调用,但必须 满足一定的入口条件。 系统功能调用:专指INT 21H中断,供系统程序和应用程序调用的一个极 其重要的中断,内含近百个系统子功能,已经标准化,调 用它们时完全不依赖于任何硬件设备。 ★BIOS中断调用 ● 键盘I/O中断调用:INT 16H ● 打印机I/O中断调用:INT 17H ● 显示I/O中断调用:INT 10H

  15. 几个重要的DOS功能调用 1.从键盘上输入单个字符的 01H号功能 功能: 接收键盘输入的单个字符,并将该字符的 ASCII 码送入 AL寄存 器,同时该字符被显示在屏幕上。 MOV AH,01H INT 21H 例: 从键盘输入字符 A MOV AH,01H INT 21H 执行后:AL = 41H

  16. 2.在屏幕上显示单个字符的 02H号功能 功能: 将待显示字符转换为 ASCII 码送入 DL寄存器 ,采用如下程序段完成显示 MOV DL,待显示字符(ASCII码) MOV AH,02H INT 21H 例: 显示字母 A(ASCII码为 41H ) MOV DL,41H (或 MOV DL,’A’) MOV AH,02H INT 21H

  17. 3.在屏幕上显示字符串(09号) 功能:DS:DX为字符串首地址,以‘$’为结尾 DATA SEGMENT BUF DB ’String$’ DATA ENDS CODE SEGMENT … LEA DX,BUF MOV AH,9H INT 21H …

  18. 4.等待键入字符串(0A号) 功能:DS:DX为缓冲区首地址,存放从键盘输入的字符串,但要注意格式,例: buf db 50 db ? db 50 dup(?) mov ah,0ah mov dx,offset buf int 21h 输入时以回车键结束,回车键作为有效字符存在缓冲区尾,所以实际只能接收49个字符.而?处的数字也不包括回车符号, 为49

  19. 5.设置中断向量(25H号) 功能: 将DS:DX存放的中断向量设置到AL为中断号的中断向量表中 mov ds,中断服务程序段地址 mov dx,中断服务程序偏移量 mov al,中断类型号 mov ah,25h int 21h 使编写的中断服务程序能发生作用

  20. 6.取中断向量(35H号) 功能:从中断向量表中将中断号为AL的中断向量取出并存入ES:BX中 mov al,中断类型号 mov ah,35h int 21h 返回:ES,中断服务程序段地址 BX,中断服务程序偏移量 用于保存原中断向量

  21. BIOS显示中断调用 (INT 10H) ① 光标定位功能主要程序段 MOV AH,2 ;设置光标功能参数 MOV DH,05H ;设置光标行参数 MOV DL,14H ;设置光标列参数 MOV BH,00H ;光标在0页即当前页 INT 10H ;调用显示器中断 ② 清屏功能主要程序段 MOV AH,6 ;向上滚动当前页指定窗口里的内容 MOV AL,00H ;整个窗口都滚动 MOV CH,00H ;设置滚动窗口左上角的位置(行参数) MOV CL,00H MOV DH,24 ;设置滚动窗口右下角的位置(行参数) MOV DL,79 MOV BH,7 ;黑色属性(滚动后腾出空间填充字符属性) INT 10H ;调用显示器中断

  22. P112例4.14,利用DOS功能实现人机对话 DATA SEGMENT MESS1 DB ‘WHAT IS YOUR NAME?’,’$’ ;定义显示字符串 MESS2 DB ‘HOW OLD ARE YOU?’,’$’ BUF1 DB 20,0,20 DUP(?) ;定义输入字符串缓冲区 BUF2 DB 15,0,15 DUP(?) DATA ENDS STACK1 SEGMENT ‘STACK’ DB 100 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START PROC FAR PUSH DS MOV AX,0 PUSH AX MOX AX,DATA MOV DS,AX

  23. MOV DX,OFFSET MESS1 MOV AH,9 INT 21H ;显示字符串 MOV DX,OFFSET BUF1 MOV AH,0AH INT 21H ;输入字符串 MOV DX,OFFSET MESS2 MOV AH,9 INT 21H MOV DX,OFFSET BUF2 MOV AH,0AH INT 21H RET START ENDP CODE ENDS END START

  24. 简单分支程序结构 多分支程序结构 第二节 汇编语言程序设计方法 一、分支结构程序设计 分支结构程序是具有判断和转移功能的程序。 分支程序的分类:简单分支程序、多分支程序

  25. 分支结构程序设计例:教材P91例4.5 DATA SEGMENT BUF1 DW 805AH BUF2 DW 9300H SUM DW ? BUF DB ‘Overflow!$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,BUF1 ADD AX,BUF2 JO DISP MOV SUM,AX JMP DONE DISP: MOV DX,OFFSET BUF MOV AH,9 INT 21H DONE: MOV AH,4CH INT 21H CODE ENDS END START

  26. 多分支结构程序设计例:教材P95例4.7 DATA SEGMENT DAT DB ? BUF DW ADR00 DW ADR01 … DW ADRFF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,DAT ;设AL中放有入口参数 MOV AH,0 ADD AX,AX MOV BX,OFFSET BUF ADD BX,AX MOV CX,[BX] JMP CX ADR00:… ADR01:… … ADRFF:… CODE ENDS END START

  27. 单重循环结构 多重循环结构 二、循环程序设计 循环程序结构的分类:单重循环 、多重循环 循环程序分为:循环初始、循环体和循环控制3部分

  28. 循环程序设计例:找N个无符号数最大值教材P97例4.9循环程序设计例:找N个无符号数最大值教材P97例4.9 DATA SEGMENT BUF DB 12H,34H,0A7H,9FH … DB 74H,88H,01H,0C8H MAX DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV CX,N-1 ;比N-1次 MOV AL,[SI] LP1: CMP AL,[SI+1] JNC LP2 MOV AL,[SI+1] ;C为1,则AL小,用较大的取代 LP2: INC SI LOOP LP1 MOV MAX, AL MOV AH, 4CH INT 21H CODE ENDS END START

  29. 多重循环程序设计例:找0的个数教材P98例4.10 DATA SEGMENT BUF DB 12H,34H,0A7H,9FH,… RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI, BUF MOV CX,80 ;共80个字节 MOV BX,0 ;存放结果 LP1: MOV DH,8 ;移位次数 MOV AL,[SI] LP2: ROR AL,1 JC NEXT INC BX ;C为0,则移出的为0,BX加1 NEXT: DEC DH JNE LP2 INC SI LOOP LP1 MOV RESULT,BX MOV AH,4CH INT 21H CODE ENDS END START

  30. 三、子程序设计 子程序的调用和返回 子程序的调用:CALL指令 子程序的返回:RET指令 子程序的调用可分为:段内调用、段间调用 段内调用:目标地址(子程序入口地址)的段基址是不变的,它与主调程序的 段基址相同;子程序定义为近过程。 段间调用:目标地址的段基址和段内偏移量都将改变;子程序定义为远过程。 子程序的参数传送:调用程序和子程序之间的信息传送称为参数传送,也称为 变量传送或者过程通信。 利用寄存器传送参数:把传送的数据直接放在寄存器中,完成主调程序与子 程序间的传送。 利用堆栈传送参数:由主调程序将参数压入堆栈,子程序把参数从堆栈中 弹出使用。 利用内存单元传送参数:在某逻辑段内建立一个参数表,表内放有子程序所 要使用的参数。

  31. 子程序嵌套与递归 子程序的嵌套:在程序中, 子程序调用另一个子程序的现象 递归子程序:子程序在执行时又调用子程序自身,它是子程序嵌套的特例,

  32. 子程序设计例:求和,并以二进制显示教材P101例4.11子程序设计例:求和,并以二进制显示教材P101例4.11 DATA SEGMENT NUM DB 1234H,5678H,2957H SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX LEA BX, NUM;用BX传递存储器地址参数 CALL ADDSUB;求和结果在CX中 L1: MOV SUM, CX CALL DISP ;CX将和传递给子程序显示 L2: MOV AH, 4CH INT 21H ADDSUB PROC NEAR MOV CX, 0 ADD CX, [BX] ADC CX, [BX+2] ADC CX, [BX+4] RET ADDSUB ENDP

  33. DISP PROC NEAR MOV DI, 16 ;16位,从左到右显示 L3: MOV DL,’0’ RCL CX,1 JNC L4 MOV DL,’1’ L4: MOV AH,2 INT 21H DEC DI JNZ L3 RET DISP ENDP CODE ENDS END START 调用第一个子程序通过存储器传递参数,以BX为指针,第二个子程序通过寄存器CX传递参数

  34. 方法2: DATA SEGMENT NUM DB 1234H,5678H,2957H SUM DW ? DATA ENDS STACK1 SEGMENT STACK DB 100 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: STACK1 START: MOV AX,DATA MOV DS,AX LEA BX,NUM PUSH WORD PTR[BX] PUSH WORD PTR[BX+2] PUSH WORD PTR[BX+4] CALL ADDSUB L1: MOV SUM,CX CALL DISP L2: MOV AH,4CH INT 21H

  35. ADDSUB PROC NEAR POP BP ;保留堆栈值,它是返回地址 MOV CX,0 MOV DI,3 L3: POP BX ADD CX,BX DEC DI JNZ L3 PUSH BP RET ADDSUB ENDP DISP PROC NEAR MOV DI,16 L4: MOV DL,’0’ RCL CX,1 ADC DL,0 ;CF+’0’+0 MOV AH,2 INT 21H DEC DI JNZ L4 RET DISP ENDP CODE ENDS END START;第一个子程序通过堆栈传递参数,第二个子程序通过寄存器CX传递参数

  36. 模块化程序设计 ★ 支持模块化程序的伪指令 ● 全局符号名说明语句:PUBLIC伪指令 ● 外部符号名说明语句 :EXTRN伪指令 ● INCLUDE伪指令 ★ 模块化程序设计的原则 ★ 模块化程序设计举例

  37. 第三节 汇编语言程序设计举例 一、数值计算 多字节减法运算P121 例4.16(多字节组合BCD码减法) DATA SEGMENT DAT1 DB 12H,45H,98H,87H DAT2 DB 98H,44H,23H,11H RESULT DB 4 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,DAT1 LEA BX,DAT2 LEA DI,RESULT CLC MOV CX,4 AGAIN: MOV AL,[SI] SBB AL,[BX] DAS MOV [DI],AL INC SI INC BX INC DI LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START

  38. 多字节乘法运算(p123 例4.17) DATA SEGMENT X DD 13579B02H Y DD 24681034H RESULT DW 4 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,RESULT LEA DI,X LEA BX,Y MOV BP,2 NEXT0: MOV CX,2

  39. NEXT1:MOV AX,WORD PTR [DI] MUL WORD PTR [BX] ADD [SI],AX ADC [SI+2],DX ADC WORD PTR [SI+4],0 ADD BX,2 ADD SI,2 LOOP NEXT1 ADD DI,2 SUB BX,2 SUB SI,2 DEC BP JNZ NEXT0 MOV AH,4CH INT 21HCODE ENDS END START

  40. 二、代码转换 十进制码到二进制码的转换p124 例4.18 DATA SEGMENT STRN DB ‘PLEASE INPUT A NUMBER’ DB ‘(0―65535):’,‘$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET STRN MOV AH,09H INT 21H XOR BX,BX ;BX存乘以10再加下一位的结果 MOV CL,0AH MOV CH,0

  41. AGAIN: MOV AH,1 INT 21H CMP AL,0DH JE DONE SUB AL,30H XOR AH,AH XCHG BX,AX ;上次结果存入AX, BX存本次输入值 MUL CX ADD BX,AX ;上次结果乘以10再加本次输入值 JMP AGAIN DONE: MOV DX,BX MOV AH,4CH INT 21H CODE ENDS END START

  42. 二进制码与ASCII码之间的转换(AL中的低4位转换成ASCII码并显示) p125 例4.19 DATA SEGMENT COUNT DB 20 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,COUNT AND AL,0FH ADD AL,90H DAA ADC AL,40H DAA MOV DL,AL MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END START

  43. 三、字符数据处理 字符查找 p126 例4.20 DATA SEGMENT KEY DB 64H BLOCK DB 23H,98H,77H,55H,… ADR DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,100 MOV AL,KEY LEA DI,BLOCK CLD REPNE SCASB;ES:DI中找AL JZ FOUND MOV DI,0 JMP DONE FOUND:DEC DI MOV ADR,DI DONE: MOV AH,4CH INT 21H CODE ENDS END START

  44. 字符删除 p127 例4.21 DATA SEGMENT BUF DB 50 DB ‘ABCDEFXEGA…’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CH,0 LEA DI,BUF MOV CL,[DI] MOV BL,CL INC DI MOV AL,‘X’ LP:CLD REPNE SCASB; ES:DI中找AL JZ FOUND JMP DONE

  45. FOUND: MOV SI,DI DEC DI PUSH DI PUSH CX CLD REP MOVSB; 从 DS:SI 传送到 ES:DI中 DEC BL POP CX POP DI JMP LP DONE: MOV BUF,BL MOV AH,4CH INT 21H CODE ENDS END START

More Related