《讲第4章汇编语言程序设计》由会员分享,可在线阅读,更多相关《讲第4章汇编语言程序设计(48页珍藏版)》请在金锄头文库上搜索。
1、第 4 章,通过本章的学习,应当掌握以下内容: 了解汇编语言的基本知识和特点。 熟悉汇编语言的程序结构、段定义以及语句的格式。 掌握汇编语言常用伪指令的使用方法。 熟练掌握汇编语言程序设计的基本方法:顺序结构、 分支结构、循环结构和子程序结构。 *掌握程序设计中的宏指令和常用的系统功能的调用方法。,是否掌握?,教学目的,综合硬指令和伪指令,从程序结构角度展开程序设计,: 分支结构程序设计 循环结构程序设计 子程序结构程序设计,教学重点,1. 掌握基本程序结构顺序结构、循环结构、分支结构及其汇编语言程序设计 2. 熟悉常见程序设计问题: 数据范围判断(09、AZ、az) 字母大小写转换; 字符串
2、传送、比较等操作 求最大最小值、数据求和、统计字符个数 数组排序,查找,插入,删除,(3)分支结构 (4) 子程序结构, 程序结构,(5)复合结构:多种程序结构的组合,(1) 顺序结构 (2) 循环结构, 编制汇编语言程序的步骤,(1) 分析题意,确定算法 根据算法画出程序框图 (3)分配存储空间及工作单元 根据框图编写程序 (5)上机调试程序,4.3 顺序程序设计,顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构 一般纯粹的顺序结构的程序设计较少,例4.1 计算,例4.2 移位,例题 代码转换,例4.1,.model small .stack .data X dw
3、5 Y dw 6 Z dw 7 W dw ?,.code .startup mov ax,X add ax,Y add ax,Z mov W,ax .exit 0 end,64位数据左移8位 例4.21/2,.data qvar dq 1234567887654321h .code mov al,byte ptr qvar6 mov byte ptr qvar7,al mov al,byte ptr qvar5 mov byte ptr qvar6,al mov al,byte ptr qvar4 mov byte ptr qvar5,al mov al,byte ptr qvar3 mov
4、byte ptr qvar4,al,图示,3456788765432100,例4.22/2,mov al,byte ptr qvar2 mov byte ptr qvar3,al mov al,byte ptr qvar1 mov byte ptr qvar2,al mov al,byte ptr qvar0 mov byte ptr qvar1,al mov byte ptr qvar0,0,12 34 56 78 87 65 43 21h,34 56 78 87 65 43 21 00h,移位后,图示,64位数据左移8位,12,34,56,78,87,65,43,21,00,qvar0,q
5、var1,qvar2,qvar3,qvar4,qvar5,qvar6,qvar7,例题 代码转换1/2,;查表法,实现一位16进制数转换为ASCII码显示 .model small .stack .data ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h ;09的ASCII码 db 41h,42h,43h,44h,45h,46h ;AF的ASCII码 hex db 0bh ;任意设定了一个待转换的一位16进制数,例题 代码转换2/2,.code .startup mov bx,offset ASCII ;BX指向ASCII码表 mov a
6、l,hex ;AL取得一位16进制数,正是ASCII码表中位移 and al,0fh ;只有低4位是有效的,高4位清0 xlat ;换码:ALDS:BXAL mov dl,al ;入口参数:DLAL mov ah,2 ;02号DOS功能调用 int 21h ;显示一个ASCII码字符 .exit 0 end,4.4 分支程序设计,分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志 转移指令Jcc和JMP可以实现分支控制,单分支:求绝对值等,双分支:显示BX最高位等,多分支:例4.4等,15/18,汇编语言程序的基本结构,分支结构: 利用条件转移
7、指令,使程序执行到某一指令后,根据条件是否满足,来改变程序执行的顺序。 一般先用比较指令或数据操作及位检测指令来改变标志寄存器各个标志位,然后用条件转移指令进行分支。 绘制程序流程图步骤必不可少! 绘制程序流程图,一般先按上下流程线写,再完成分支部分。 绘制程序流程图的判断环节时,要特别注意把握逻辑关系和标志位的意义。,单分支程序设计,条件成立跳转,否则顺序执行分支语句体;注意选择正确的条件转移指令和转移目标地址,例题 求绝对值,;计算AX的绝对值 cmp ax,0 jns nonneg ;分支条件:AX0 neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满
8、足 ;计算AX的绝对值 cmp ax,0 js yesneg ;分支条件:AX0 jmp nonneg ;分支条件:AX=0 yesneg: neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足,Good,Bad,例题 无符号数除以2,;AX中存放的无符号数;如果是偶数除以2,如果是奇数,则加1后除以2 test ax,01h ;测试AX最低位 jz even ;最低位为0:AX为偶数 add ax,1 ;最低位为1:AX为奇数,需要加1 even: rcr ax,1 ;AXAX2 ;如果采用SHR/SAR指令,则不能处理AXFFFFH的特殊情况,条件成立跳
9、转执行第2个分支语句体,否则顺序执行第1个分支语句体。注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后,例题 显示BX最高位-1,shl bx,1 ;BX最高位移入CF jc one ;CF1,即最高位为1,转移 mov dl,0 ;CF0,即最高位为0,DL0 jmp two ;一定要跳过另一个分支体 one: mov dl,1 ;DL1 two: mov ah,2 int 21h ;显示,另一种解法,例题 显示BX最高位-2,shl bx,1 ;BX最高位移入CF jnc one ;CF0,即最高位为0,转移 mov dl,1 ;CF1,即最高位为1,DL1 jmp two ;一
10、定要跳过另一个分支体 one: mov dl,0 ;DL0 two: mov ah,2 int 21h ;显示,另一种解法,例题 显示BX最高位-3,mov dl,0 ;DL0 shl bx,1 ;BX最高位移入CF jnc two ;CF0,最高位为0,转移 mov dl,1 ;CF1,最高位为1,DL1 two: mov ah,2 int 21h ;显示,双分支程序可以改为单分支程序,多分支程序设计,多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合,例如: or ah,ah ;等效于cmp ah,0 jz function0 ;ah0
11、,转向function0 dec ah ;等效于cmp ah,1 jz function1 ;ah1,转向function1 dec ah ;等效于cmp ah,2 jz function2 ;ah2,转向function2,图示,多分支结构,地址表形成多分支,需要在数据段事先安排一个按顺序排列的转移地址表 输入的数字作为偏移量。因为有2个字节16位偏移地址,所以偏移量需要乘2 关键是要理解间接寻址方式JMP指令,.data msg db Input number(18):,0dh,0ah,$ msg1 db Chapter 1 : .,0dh,0ah,$ msg2 db Chapter 2
12、: .,0dh,0ah,$ . msg8 db Chapter 8 : . ,0dh,0ah,$ table dw disp1,disp2,disp3,disp4 dw disp5,disp6,disp7,disp8 ;取得各个标号的偏移地址,例4.4 数据段1/3,start1: mov dx,offset msg ;提示输入数字 mov ah,9 int 21h mov ah,1 ;等待按键,ASCII CODE int 21h cmp al,1 ;数字 8? ja start1 and ax,000fh ;将ASCII码转换成数字,例4.4 代码段2/3,dec ax shl ax,1
13、;等效于add ax,ax mov bx,ax jmp tablebx ;(段内)间接转移:IPtable+bx start2: mov ah,9 int 21h .exit 0 disp1: mov dx,offset msg1 ;处理程序1 jmp start2 disp2: mov dx,offset msg2 ;处理程序2 jmp start2 ,例4.4 代码段3/3,4.5 循环程序设计,循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体 循环指令和转移指令可以实现循环控制,循环指令LOOPE:例4.6,转移指令:例4.7,多重循环:例4.8等,循环指令LOOP:例4.
14、5,循环结构, 循环程序结构形式,DO-WHILE 结构 DO-UNTIL 结构,初始化: 设置循环的初始状态 循环体: 循环的工作部分及修改部分 控制条件:计数控制(LOOP) 特征值控制(LOOPZ/LOOPNZ/ 条件跳转指令), 循环程序结构说明,例4.5:把 BX 中的二进制数以十六进制的形式显示在屏幕上,如:1011 0010 1111 1010 B B2FAH,BX,1 2 3 4,分析:(1)程序结构的确定 由题意应该把BX的内容从左到右每4位为一组在屏幕上显示出来,显然这可以用循环结构来完成,每次显示一个十六进制数位,因而循环次数是已知的,计数值为4。,(2)循环体的构成(算
15、法确定) 循环体应该包括:二进制到所显示字符的ASCII之间的转换,以及每个字符的显示。 需要了解相关知识: 字符和其ASCII码之间的关系? “0”“9” 30H39H, “A”Z” 41H5AH 如何显示一个字符? (a)将显示字符的ASCII码放入DL寄存器;(b)将AH的内容置为2(功能号);(c)执行INT 21H(DOS 功能调用)。,(3)循环控制条件分析 因为循环次数已知,可以使用LOOP指令实现,但是必须注意:由于循环移位指令中使用CL寄存器作为移位次数寄存器,而LOOP 指令的循环次数隐含在CX寄存器中,因此,必须注意这两者之间的冲突。 除了可以使用LOOP指令之外,还可以使用条件跳转指令来实现。, mov cx, 4 ;初始化 rotate: push cx mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ; 09 ASCII 30H39H cmp al, 3ah jl printit ;al3ah add al, 7h ; AF ASCII 41H46H printit: mov dl, al mov ah, 2 int 21h pop cx loop rotate ,方法1 (LOOP), mo