汇编程序设计基本方法PPT学习教案_第1页
汇编程序设计基本方法PPT学习教案_第2页
汇编程序设计基本方法PPT学习教案_第3页
汇编程序设计基本方法PPT学习教案_第4页
汇编程序设计基本方法PPT学习教案_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1 汇编程序设计基本方法汇编程序设计基本方法 前面几章主要介绍了指令系统中的各种指令,这些指前面几章主要介绍了指令系统中的各种指令,这些指 令是编写汇编程序的工具。本章将学习编写汇编程序令是编写汇编程序的工具。本章将学习编写汇编程序 。 序言:序言: (1) 分析问题,明确要求;分析问题,明确要求; (2) 建立数学模型:即将解决问题的方法用数学语言表达出来建立数学模型:即将解决问题的方法用数学语言表达出来 (3) 确定算法:即转化为计算机解法;确定算法:即转化为计算机解法; (4)画出程序流程图;画出程序流程图; (5)编码,调试;编码,调试; (6)整理资料,投入使用。整理资料,投入

2、使用。 汇编程序设计基本过程:汇编程序设计基本过程: 汇编程序设计特点:汇编程序设计特点:模块化、结构化模块化、结构化 第1页/共56页 本章学习要求本章学习要求 1 1、掌握三种结构程序的设计方法,领会结构、掌握三种结构程序的设计方法,领会结构 化程序设计的思想。化程序设计的思想。 3 3、掌握几种、掌握几种DOSDOS功能调用,了解功能调用,了解BIOSBIOS功能调用功能调用 ,能从功能调用表中查找到满足自己要求的,能从功能调用表中查找到满足自己要求的 DOSDOS功能并给出正确的调用参数。功能并给出正确的调用参数。 2 2、掌握子程序设计和调用方法。、掌握子程序设计和调用方法。 第2页

3、/共56页 5.1 5.1 汇编语言程序结构汇编语言程序结构 分支结构分支结构 子程序结构子程序结构 复合结构:多种程序结构的组合复合结构:多种程序结构的组合 顺序结构顺序结构 循环结构循环结构 第3页/共56页 一、顺序结构程序设计一、顺序结构程序设计 第4页/共56页 二、循环结构程序设计二、循环结构程序设计 循环结构:循环结构:包括包括当型当型和和直到型直到型两种。两种。 WHILE 结构结构 DO-UNTIL 结构结构 控制条件控制条件 初始化初始化 循环体循环体 Y N 控制条件控制条件 初始化初始化 循环体循环体 Y N 第5页/共56页 循环类型:循环类型: 循环结构的组成部分:

4、循环结构的组成部分: 初始化部分:初始化部分:设置循环的初始状态。设置循环的初始状态。 类似类似C语言语言for(int i=1; i10; i+)中的中的int i=1 循环体部分:循环体部分:循环工作的主体部分。循环工作的主体部分。 调整部分:调整部分:调整循环的次数。调整循环的次数。 类似类似C语言语言for(int i=1; i10; i+)中的中的i+ 控制部分:控制部分:控制循环的结束。控制循环的结束。 类似类似C语言语言for(int i=1; i10; i+)中的中的i10 单重循环单重循环 嵌套循环嵌套循环(多重循环多重循环):即循环结构内又有循环即循环结构内又有循环 第6页

5、/共56页 四条循环控制指令:四条循环控制指令: 循环指令:循环指令:LOOP OPR 循环判断条件:循环判断条件:(CX) 0 为零或相等时循环指令:为零或相等时循环指令:LOOPZ/LOOPE OPR 循环判断条件:循环判断条件:ZF=1 且且 (CX) 0 不为零或不相等时循环指令:不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR 循环判断条件:循环判断条件:ZF=0 且且 (CX) 0 LOOP OPR DEC CX JNZ OPR 因此,用跳转指令也能实现循环因此,用跳转指令也能实现循环 第7页/共56页 单重循环程序举例单重循环程序举例 分析:分析: BXBX 1 2

6、 3 4 第8页/共56页 画流程图:画流程图: 第9页/共56页 ASCII码表码表 第10页/共56页 program segment ;define code segmentprogram segment ;define code segment main proc farmain proc far assume cs:program assume cs:program Start: push ds ;save old data segmentStart: push ds ;save old data segment sub ax,ax sub ax,ax push ax ;0 push

7、 ax ;0偏移地址入栈偏移地址入栈 mov ch, 4 ;number of digitsmov ch, 4 ;number of digits rotate: mov cl, 4 ;set count to 4 bitsrotate: mov cl, 4 ;set count to 4 bits rol bx, cl rol bx, cl mov al, bl mov al, bl and al, 0fh ; and al, 0fh ; 提取出低提取出低4 4位位 add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp

8、al, 3ah cmp al, 3ah ;判断是否是大于;判断是否是大于9 9 jl printit jl printit add al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46H 第11页/共56页 printit: mov dl, al ;printit: mov dl, al ;调用调用DOSDOS功能的入口参数功能的入口参数 mov ah, 2 mov ah, 2 int 21h int 21h dec ch dec ch ;判断是否已显示了;判断是否已显示了4 4个数字个数字 jnz rotate jnz rotate ret

9、ret main endpmain endp program endsprogram ends endend 第12页/共56页 第13页/共56页 Data segmentData segment buffer db 80 dup(?) buffer db 80 dup(?) flag db ? flag db ? Data endsData ends Prognam SegmentPrognam Segment assume cs:Prognam, ds:Data assume cs:Prognam, ds:Data start:start: push ds ; set up stack

10、for reture push ds ; set up stack for reture sub ax,ax sub ax,ax push ax push ax mov ax, Data mov ax, Data mov ds, ax mov ds, ax ; main part of program goes here; main part of program goes here lea bx, buffer lea bx, buffer mov flag, 0 mov flag, 0 第14页/共56页 next: mov ah,01 ; next: mov ah,01 ; 调用调用DO

11、S 1DOS 1号子功能号子功能 int 21h ; int 21h ; 从键盘接收一个字符从键盘接收一个字符 test flag, 01h test flag, 01h jnz follow ; jnz follow ; 判断是否是第一个字符判断是否是第一个字符 cmp al, 20h ; cmp al, 20h ; 判断是否是空格符判断是否是空格符 jnz exit jnz exit mov flag, 1 mov flag, 1 jmp next jmp next follow: cmp al, 20hfollow: cmp al, 20h jz exit jz exit mov bx,

12、 al ; mov bx, al ; 置入缓冲区置入缓冲区 inc bx inc bx jmp next jmp next exit: ret ; return to DOSexit: ret ; return to DOS main endpmain endp Prognam endsPrognam ends end startend start 第15页/共56页 多重循环程序举例多重循环程序举例 序号 地址 数 比 较 遍 数 1234 1 A 32 2 A+2 85 3 A+4 16 4 A+6 15 5 A+8 8 32 16 15 8 85 16 15 8 32 85 15 8 1

13、6 32 85 8 15 16 32 85 冒泡法排序算法冒泡法排序算法 第16页/共56页 mov cx, 5 mov cx, 5 ; ;元素个数元素个数 dec cx dec cx ; ;比较遍数比较遍数 Loop1Loop1: mov di, cx mov di, cx ; ;比较次数比较次数 mov bx, 0mov bx, 0 Loop2Loop2: mov ax, Abx mov ax, Abx ; ;相邻两数相邻两数 cmp ax, Abx+2 cmp ax, Abx+2 ; ; 比较比较 jle continuejle continue xchg ax, Abx+2 xchg

14、ax, Abx+2 ; ;交换位置交换位置 mov Abx, axmov Abx, ax continue:continue: add bx, 2 add bx, 2 loop loop2 loop loop2 mov cx, di mov cx, di loop loop1 loop loop1 第17页/共56页 三、分支结构程序设计三、分支结构程序设计 (选择结构程序设计选择结构程序设计) 选择结构:选择结构:程序中存在判断,并根据判断结果转向不同程序中存在判断,并根据判断结果转向不同 的处理的处理 选择结构包括了选择结构包括了二路分支二路分支和和多路分支多路分支 ? ? case 1

15、case 2 二路分支二路分支 IF-ELSE case 1 case 2 case n 多路分支多路分支 SWITCH 实现多路分支结构实现多路分支结构 的方法:的方法: 跳转表法跳转表法 关键字法关键字法 第18页/共56页 1、无条件转移指令、无条件转移指令 JMP 2、条件转移指令条件转移指令 JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、 JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ 控制转移指令:控制转移指令: 第19页/共56页 DATA SEGMENT ;定义数据段 STR

16、ING1 DB IT IS ODD!, $ STRING2 DB IT IS EVEN!, $ DATA ENDS CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA ;ASSUME伪指令,说明段与 ;段寄存器之间的对应关系 START: MOV AX,DATA ;实现段与段寄存器之间的对应 ;关系 MOV DS,AX 第20页/共56页 MOV AH,01H ;调用1号DOS功能,从键盘上读入一个 ;字符,并将该字符回显在屏幕上 INT 21H CLC RCR AL,1 JNC EVN MOV DX,OFFSET STRING1 ;将字符串Sting1的偏移

17、地址 ;赋给DX CALL DISPMESS EVN: MOV DX,OFFSET STRING2 CALL DISPMESS DISPMESS PROC ;定义一个过程,用于输出字符串 MOV AH,9 ;调用9号子功能 INT 21H ;返回DOS MOV AH,4CH ;结束程序 INT 21H DISPMESS ENDP CODE ENDS END START 第21页/共56页 例:写一程序,由用户输入三个例:写一程序,由用户输入三个单字节无符号数且存放单字节无符号数且存放 于于BUFFER开始的缓冲区中,开始的缓冲区中,用户每输入一位数前屏幕用户每输入一位数前屏幕 显示:显示: E

18、nter the first value(0-9): _ Enter the second value(0-9): _ Enter the third value(0-9): _ 程序将这三个数按从大到小排序。排完序后,显示如下程序将这三个数按从大到小排序。排完序后,显示如下 After sorting. Num1= _ Num2= _ Num3= _ 第22页/共56页 DATA SEGMENT MSG1 DB Enter the first value(0-9):,$ MSG2 DB 0DH,0AH,Enter the second value(0-9):,$ MSG3 DB 0DH,0A

19、H,Enter the third value(0-9):,$ MSG4 DB 0DH,0AH,After sorting.,$ NUM1 DB 0DH,0AH,Num1=,$ NUM2 DB 0DH,0AH,Num1=,$ NUM3 DB 0DH,0AH,Num1=,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MSG1 ;读取第一个数 MOV AH,9 INT 21H MOV AH,01H 第23页/共56页 INT 21H MOV BL,AL MOV D

20、X,OFFSET MSG2 ;读取第二个数 MOV AH,9 INT 21H MOV AH,01H INT 21H MOV CL,AL MOV DX,OFFSET MSG3 ;读取第三个数 MOV AH,9 INT 21H MOV AH,01H INT 21H MOV BH,AL CMP BL,CL 第24页/共56页 JAE NEXT1 ;等价于JNB XCHG BL,CL NEXT1: CMP BL,BH JAE NEXT2 XCHG BL,BH NEXT2: CMP CL,BH JAE DISPLAY XCHG CL,BH DISPLAY:MOV DX,OFFSET MSG4 MOV A

21、H,9 INT 21H MOV DX,OFFSET NUM1 MOV AH,9 INT 21H MOV AH,02H MOV DL,BL INT 21H 第25页/共56页 MOV DX,OFFSET NUM2 MOV AH,9 INT 21H MOV AH,02H MOV DL,CL INT 21H MOV DX,OFFSET NUM3 MOV AH,9 INT 21H MOV AH,02H MOV DL,BH INT 21H MOV AH,4CH INT 21H CODE ENDS END START 第26页/共56页 第27页/共56页 5.2 5.2 子程序设计与调用子程序设计与调用

22、 子程序的作用:子程序的作用: 减少编程工作量;减少编程工作量; 节省存储空间;节省存储空间; 模块化,使程序结构清晰,便于调试;模块化,使程序结构清晰,便于调试; 第28页/共56页 一、过程一、过程(子程序子程序)定义伪指令定义伪指令 过程名过程名 PROC NEAR ( FAR )PROC NEAR ( FAR ) 过程名过程名 ENDPENDP (1 1)NEARNEAR属性:调用程序和子程序在同一代码段中属性:调用程序和子程序在同一代码段中 (段内调用)(段内调用) (2 2)FARFAR属性:调用程序和子程序不在同一代码段中属性:调用程序和子程序不在同一代码段中 (段间调用)(段间

23、调用) . . 第29页/共56页 code segmentcode segment main proc farmain proc far call subr1call subr1 ret ret main endpmain endp subr1 proc nearsubr1 proc near ret ret subr1 endpsubr1 endp code endscode ends segx segmentsegx segment subt proc farsubt proc far ret ret subt endpsubt endp call subtcall subt segx

24、endssegx ends segy segmentsegy segment call far ptr subtcall far ptr subt segy endssegy ends 第30页/共56页 二、子程序的调用和返回二、子程序的调用和返回 子程序调用:子程序调用:隐含使用堆栈保存返回地址隐含使用堆栈保存返回地址 call near ptr subpcall near ptr subp (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 call far ptr subpcall far ptr subp (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 子程序返回

25、:子程序返回:ret ret (返回地址出栈)返回地址出栈) (SP) (IP) (IP) (CS) (SP) 第31页/共56页 三、子程序说明信息三、子程序说明信息 为了能正确使用子程序,在给出子程序代码的时候,为了能正确使用子程序,在给出子程序代码的时候, 最好是能给出说明信息,包括:最好是能给出说明信息,包括: 子程序名;子程序名; 功能描述;功能描述; 入口和出口参数;入口和出口参数; 第32页/共56页 四、寄存器的保存和恢复四、寄存器的保存和恢复(保护现场保护现场) 方法:方法:把需要保护的寄存器的内容,在程序中压入和弹把需要保护的寄存器的内容,在程序中压入和弹 出堆栈。出堆栈。

26、 subt proc farsubt proc far push ax push ax push bx push bx push cx push cx push dx push dx pop dx pop dx pop cx pop cx pop bx pop bx pop ax pop ax ret ret subt endpsubt endp 第33页/共56页 五、子程序的参数传送五、子程序的参数传送 参数类型:参数类型: 主程序在调用子程序时,经常需要向子程序传递一些参主程序在调用子程序时,经常需要向子程序传递一些参 数;子程序执行完后,也需要向主程序返回一些数据。数;子程序执行完后,

27、也需要向主程序返回一些数据。 入口参数:入口参数:相当于相当于C语言函数的实际参数语言函数的实际参数 出口参数:出口参数:相当于函数返回值相当于函数返回值 参数传递的方法:参数传递的方法: 通过寄存器传送参数;通过寄存器传送参数; 通过存储器传送参数;通过存储器传送参数; 通过地址表传送参数地址;通过地址表传送参数地址; 通过堆栈传送参数或参数地址;通过堆栈传送参数或参数地址; 第34页/共56页 (通过寄存器传送参数通过寄存器传送参数) hexidec segment ; 1610 assume cs: hexidec main proc far start: push ds sub ax,

28、 ax push ax repeat: call hexibin ; 162 call crlf call binidec ; 210 call crlf jmp repeat ret main endp hexidec ends end start 第35页/共56页 hexibin proc nearhexibin proc near mov bx, 0mov bx, 0 newchar: mov ah, 1 int 21h sub al, 30h jl exit cmp al, 10 jl add_to sub al, 27h cmp al, 0ah jl exit cmp al, 10

29、h jge exit add_to: mov cl, 4 shl bx, cl mov ah, 0 add bxbx, ax jmp newchar exit: ret hexibin endphexibin endp binidec proc nearbinidec proc near mov cx, 10000d call dec_divcall dec_div mov cx, 1000d call dec_divcall dec_div mov cx, 100d call dec_divcall dec_div mov cx, 10d call dec_divcall dec_div m

30、ov cx, 1d call dec_divcall dec_div ret binidec endpbinidec endp dec_div proc neardec_div proc near mov ax, mov ax, bxbx mov dx, 0 mov dx, 0 div cx div cx mov mov bxbx, dx, dx mov dl, al mov dl, al add dl, 30h add dl, 30h mov ah, 2 mov ah, 2 int 21h int 21h ret ret dec_div endpdec_div endp 第36页/共56页

31、(通过存储器传送参数通过存储器传送参数) data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code segment main proc far assume cs:code,ds:data mov ax, data mov ds, ax call proaddcall proadd mov ax,4c00h int 21h main endp code ends end main proadd proc nearproadd proc near push ax push cx push si lea

32、 si, aryary mov cx, countcount xor ax, ax next: add ax, si add si, 2 loop next mov sumsum,ax pop si pop cx pop ax ret proadd endpproadd endp 第37页/共56页 (通过地址表传送参数地址通过地址表传送参数地址) data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? table dw 3 dup (?) ; 地址表 data ends code segment main

33、 proc far assume cs:code, ds:data push ds sub ax, ax push ax mov ax, data mov ds, ax mov table, offset ary mov table+2, offset count mov table+4, offset sum mov bx, offset table call proadd ret main endp 第38页/共56页 proadd proc nearproadd proc near push ax push cx push si push di mov si, bx mov di, bx

34、+2 mov cx, di mov di, bx+4 xor ax, ax next: add ax, si add si, 2 loop next mov di,ax pop di pop si pop cx pop ax ret proadd endpproadd endp code ends end main 30d 40d 50d 60d 70d 80d 90d 100d 10d ary 20d 10d count sum table 00000000 00140014 00160016 00180018 00000000 00140014 00160016 (bx)(bx) (si)

35、(si) (di)(di) 550d550d 第39页/共56页 六、嵌套子程序六、嵌套子程序 子程序的嵌套:子程序的嵌套:在一个子程序中调用到另一个子程序的在一个子程序中调用到另一个子程序的 结构,称为嵌套。结构,称为嵌套。 注意:注意:此时要注意寄存器的保护和恢复。此时要注意寄存器的保护和恢复。 第40页/共56页 子程序的嵌套:子程序的嵌套: 主程序主程序 子程序子程序A A 子程序子程序B B call call proc_Aproc_A proc_Aproc_A call call proc_Bproc_B Call Call proc_Aproc_A retret proc_Bpr

36、oc_B retret 第41页/共56页 六、递归子程序六、递归子程序 子程序的递归:子程序的递归:在子程序中调用到自身,称为递归。在子程序中调用到自身,称为递归。 例如:阶乘!例如:阶乘! 第42页/共56页 n! n ( n - 1 ) ( n - 2 ) 1 fact proc nearfact proc near push ax push ax push bp push bp mov bp, sp mov bp, sp mov ax, bp+6mov ax, bp+6 cmp ax, 0 cmp ax, 0 jne fact1 jne fact1 inc ax inc ax jmp

37、exit jmp exit fact1: dec axfact1: dec ax push ax push ax call factcall fact pop axpop ax mul word ptrbp+6 mul word ptrbp+6 exit:exit: mov bp+6, ax mov bp+6, ax pop bp pop bp pop ax pop ax ret ret fact endpfact endp 第43页/共56页 5.3 DOS5.3 DOS功能调用功能调用 MS-DOS将许多涉及设备驱动和文件管理等操作编写成子程将许多涉及设备驱动和文件管理等操作编写成子程 序

38、存储起来,每个子程序对应一个编号,程序员通过调用这序存储起来,每个子程序对应一个编号,程序员通过调用这 些子程序来实现所需要的功能。些子程序来实现所需要的功能。 DOS功能调用分类:功能调用分类: 设备驱动设备驱动(基本基本I/O) 文件管理文件管理 其他其他(内存管理、终止程序等内存管理、终止程序等) 第44页/共56页 DOS功能调用的步骤:功能调用的步骤: 准备入口参数准备入口参数(有些功能调用无需入口参数有些功能调用无需入口参数); 子程序的编号送子程序的编号送AH寄存器;寄存器; 发软中断指令发软中断指令INT 21H; 2号子功能能实现在屏幕上输出字符,但当号子功能能实现在屏幕上输

39、出字符,但当DL=07H时,并不输出时,并不输出 字符,而是发出嘟的一声。字符,而是发出嘟的一声。 第45页/共56页 基本基本I/O功能调用功能调用 1、带回显键盘输入、带回显键盘输入(1号功能号功能) 功能:功能:从键盘上读一个字符,并将该字符回显在屏幕上。从键盘上读一个字符,并将该字符回显在屏幕上。 入口参数:入口参数:无无 出口参数:出口参数:AL=读到字符的读到字符的ASCII码码 说明:说明:若读到的字符是若读到的字符是Ctrl+C或或Ctrl+Break,则结束程序。,则结束程序。 2、不带回显键盘输入、不带回显键盘输入(8号功能号功能) 除读到的字符不在屏幕上显示外,同除读到的字符不在屏幕上显示外,同1号功能号功能 第46页/共56页 3、直接键盘输入、直接键盘输入(7号功能号功能) 功能:功能:从键盘上读一个字符从键盘上读一个字符 入口参数:入口参数:无无 出口参数:出口参数:AL=读到字符的读到字符的ASCII码码 说明:说明: u 不检查读到的字符是否是不检查读到的字符是否是Ctrl+C或或Ctrl+Break。 u 不回显读到的字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论