新一代汇编语言程序设计5【业界荟萃】_第1页
新一代汇编语言程序设计5【业界荟萃】_第2页
新一代汇编语言程序设计5【业界荟萃】_第3页
新一代汇编语言程序设计5【业界荟萃】_第4页
新一代汇编语言程序设计5【业界荟萃】_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

1、新一代汇编语言程序设计,1,行业知识,第五章 程序设计的基本方法,5.1 程序设计的基本步骤 5.2 顺序程序设计 5.3 分支程序设计 5.4 循环程序设计 5.5 算数运算与代码转换程序设计,2,行业知识,程序设计的解题基本步骤如下:,分析问题,寻找解决问题的思路、方法、算法,编写程序实现算法,上机调试程序,5.1 程序设计的基本步骤,3,行业知识,程序的基本结构有三种:顺序结构、分支结构、循环结构,4,行业知识,5.3 分支程序设计,程序的分支通过转移指令来实现,因此转移指令的操作应该是能够改变程序执行顺序 。, 方法:,修改CS:IP,4.3.1 转移指令,(不影响任何标志位 ),无条

2、件转移指令,条件转移指令,转移指令分为两类,5,行业知识,1)无条件转移指令,指令格式:JMP 标号,无条件转移到标号指向的指令继续执行,(1) 段内转移(段内直接寻址),即: (IP)=标号所在行指令的偏移地址,段内转移分为三种形式:, 段内直接短转移,格式:JMP SHORT 标号,操作:(IP)(IP)+D(8位偏移量),6,行业知识,2)条件转移指令 (18条),基本格式为: J 标号,(代表一种转移条件 ),条件转移指令根据检测标志位的状态来判断条件,若条件为真,则转至标号处执行程序,否则顺序往下执行程序 。,操作:(IP)(IP)+D (8位偏移量), 条件转移指令转移范围与段内短

3、转移相同,7,行业知识,例 :利用条件转移指令构成循环, MOV CX,100 (循环计数) AGAIN: ADD AX,BX DEC CX JNZ AGAIN ,执行影响标志位的指令(如算术运算、比较及位测试等指令),执行适当的条件转移指令检测相应的标志位,根据条件实现转移,8,行业知识,条件转移指令,9,行业知识,1. 判断单个标志位状态,这组指令单独判断5个状态标志之一 JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等) JS和JNS:利用符号标志SF,判断结果是正是负 JO和JNO:利用溢出标志OF,判断结果是否产生溢出 JP/JPE和JNP/JPO:利用奇偶标志P

4、F,判断结果中“1”的个数是偶是奇 JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位,Jcc,10,行业知识,例:JZ/JNZ指令,test al,80h;测试最高位 jz next0 ;D70(ZF1),转移 mov ah,0ffh;D71,顺序执行 jmp done ;无条件转向 next0:mov ah,0 done:. test al,80h;测试最高位 jnz next1;D71(ZF0),转移 mov ah,0 ;D70,顺序执行 jmp done ;无条件转向 next1:mov ah,0ffh done:.,11,行业知识,例:JS/JNS

5、指令,;计算|XY|(绝对值) ;X和Y为存放于X单元和Y单元的16位操作数 ;结果存入result,mov ax,X sub ax,Y jns nonneg neg ax ;neg是求补指令 nonneg:mov result,ax,12,行业知识,例:JO/JNO指令,;计算XY; ;X和Y为存放于X单元和Y单元的16位操作数 ;若溢出,则转移到overflow处理,mov ax,X sub ax,Y jo overflow .;无溢出,结果正确 overflow:.;有溢出处理,13,行业知识,例:JP/JNP指令,and al,7fh ;最高位置“0”,同时判断“1”的个数 jnp n

6、ext ;个数已为奇数,则转向next or al,80h;否则,最高位置“1” next:.,;设字符的ASCII码在AL寄存器中 ;将字符加上奇校验位 ;在字符ASCII码中为“1”的个数已为奇数时 ;则令其最高位为“0”;否则令最高位为“1”,14,行业知识,例:JC/JNC指令,xor al,al;AL0 again:test bx,0ffffh ;等价于 cmp bx,0 je next ;相等则转移 shl bx,1 jnc again inc al jmp again next:.;AL保存1的个数,;记录BX中1的个数,15,行业知识,记录BX中“1”的个数,xor al,al

7、;AL0 again:cmp bx,0 jz next shl bx,1;也可使用 shr bx,1 adc al,0 jmp again next:.;AL保存1的个数,另一种做法,16,行业知识,2. 比较无符号数高低,无符号数的大小用高(Above)低(Below)表示 利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系: 低于(不高于等于):JB(JNAE) CF= ,ZF 不低于(高于等于):JNB(JAE) CF= ,ZF 低于等于(不高于):JBE(JNA) CF= ,ZF 不低于等于(高于):JNBE(JA )CF= ,ZF,17,行业知识,例:比较无

8、符号数,cmp ax,bx;比较ax和bx jnb next;若axbx,转移 xchg ax,bx;若axbx,交换 next:.,18,行业知识,3. 比较有符号数大小,有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系: 小于(不大于等于):JL(JNGE) SF OF,ZF= 不小于(大于等于):JNL(JGE) SF OF,ZF= 小于等于(不大于):JLE(JNG) SF OF,ZF= 不小于等于(大于):JNLE(JG )SF OF,ZF=,Jcc,19,行业知识,例:比较有符号数,cmp ax,bx;

9、比较ax和bx jnl next;若axbx,转移 xchg ax,bx;若axbx,交换 next:.,20,行业知识,1. 分支程序设计 一、用转移指令实现 假如要把连续存放在内存变量名DAT中的三个数按递减次序排列。,21,行业知识,汇编语言,【例4.17】设变量X为带符号整数,试编写一个程序,完成下面的分段函数计算: 题目分析:为了实现上述分段函数的计算,首先要利用上一个例题求出X的绝对值,然后根据X的绝对值判断Y的取值。程序段如下:,22,行业知识,DATASEGMENT X DB -36 Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE;DS

10、:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JGE NEXT ;为正,转NEXT NEG AL ;AL中的内容求补 NEXT:CMP AL,5 ;|X|和5比较 JGE P1 ;5,转P1 MOV AL,1 ;否则1送AL MOV BL,X ;X送BL中 SUB AL,BL ;结果送AL中 JMP EXIT ;转EXIT P1:MOV AL,0 ;0送AL中 EXIT:MOV Y,AL ;结果送Y单元 MOV AH,4CH INT 21H ;返回DOS CODE ENDS END START ;汇编结束,23,行业知识,【例4.19】

11、设计一个程序,统计在内存W单元保存的无符号字变量中有多少个二进制“1”,统计结果送内存N单元保存。 分析:要统计内存W单元保存的无符号字变量中有多少个二进制“1”,可以将该数据送寄存器AX中,通过移位指令将AX中的每一位依次移入进位标志CF中,若CF=1则计数器CL的值加1,这样就可以统计出AX中1的个数。 设计源程序如下:。,24,行业知识,DATA SEGMENT W DW 00FFH;定义字数据 N DB ?;定义结果保存单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA;初始化DS MOV DS,AX

12、 MOV CL,0;计数器清零 MOV AX,W ;取数到AX AA:AND AX,AX ;逻辑与,判AX=0? JZ CC ;结果为0转移到CC SHL AX,1;逻辑左移1位 JNC BB;无进位转BB INC CL;有“1”则计数 BB:JMP AA;无条件转AA CC:MOV N,CL;结果送N单元 MOV AH,4CH;返回DOS INT 21H CODE ENDS END START;汇编结束,25,行业知识,实验内容,1、设X,Y为存放在X,Y单元中的16位操作数,判断XY,若成立执行X-Y, 否则计算|X-Y|,并把结果存入RESULT中 2、假设有100个16位无符号数存放在

13、数据段,把它们的和求出来,作为32位数存在DX和AX中 3、数据段有一个首地址为ARRAY的N字数组,要求测试其中正数、0、负数的个数,正数个数放在DI中,0的个数放在SI中,并根据N-(DI)-(SI)求得负数的个数放在AX中。,26,行业知识,用无条件转移指令+跳转表实现程序分支,跳转表便于实现多路分支。,设有若干段分支程序,将每段分支程序的入口地址(也称跳转地址)组成一个连续存放在内存中的表,称为跳转表。,若有n个产品,将这n个产品的加工处理程序(分支程序)入口地址(分别为BR0,BR1,BRn-1)组成跳转表,可就利用跳转表取得BR0,BR1,BRn-1,转移到相应的分支程序去处理产品

14、。,27,行业知识,由表地址就可取得分支程序地址BRn,再将BRn送IP,实现转移。,例: 根据学生成绩评定等级:90100分的等级为“A”;8089分的等级为“B”;7079分的等级为“C”,6069分的等级为“D”,60分的等级为“E” 。,分析: 059 6069 7079 8089 90 100 0 1 2 3 4 tab dw br0 , br1 , br2 , br3 , br4 (跳转表) E D C B A,(程序见P84 例4-10),28,行业知识,5.4 循环程序设计,根据条件重复执行一段指令就构成了循环程序结构 。,例:,MOV AX,0 ;累加求和寄存器清0 MOV

15、BX,OFFSET ARRAY ;数组始址送BX中 MOV CX,50 ;循环控制计数初始化 AGAIN : ADD AX,BX ADD BX,2 ;数组地址增2,BX指向下一个元素 DEC CX ;循环控制计数减1 JNZ AGAIN ;计数不为0时继续循环 MOV S,AX ;计数为0时循环结束,和存于S中,将ARRAY数组中的50个数求和,并将和存入字变量S中 。,29,行业知识,保证循环正常执行和结束的条件:,指令系统提供了专门用于循环结构的循环控制指令,更加简便的地实现循环结构。,30,行业知识,5.4.1 循环控制指令,循环控制指令的转移范围为:-128+127字节,格式:LOOP

16、 标号,操作: 如右图所示,(段内短转移),(1)LOOP指令,(2)等于继续循环指令,格式:LOOPZ/LOOPE 标号,(3)不等于继续循环指令,格式:LOOPNZ/LOOPNE 标号,操作: 如右图所示,操作: 如右图所示,31,行业知识,LOOP AGAIN,在前面的求和例子中,可用一条循环指令代替两条指令:,例:,MOV CX,80 MOV SI,-1 MOV AL,$ AGAIN: INC SI CMP AL,STRSSI LOOPNE AGAIN MOV LEN,SI,设: STRS DB string$ ,求存放在STRS存储区中的字符串长度。,32,行业知识,要求将 4230

17、H= 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 B,30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 30,再讨论如何分离开各二进制位并转换为ASCII码,分析如下:,33,行业知识,(DX)= 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0,1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 (ROL DX,1 ), 0 0 0 0 0 0 0 1 (AND AL,1),0 0 0 0 0 0 0 0,+ 0 0 1 1 0 0 0 0 (ADD AL,30H),0 0 1 1 0 0 0 0,30,0

18、 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 (ROL DX,1), 0 0 0 0 0 0 0 1 (AND AL,1),0 0 0 0 0 0 0 1,+ 0 0 1 1 0 0 0 0 (ADD AL,30H ),0 0 1 1 0 0 0 1,31,0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 (ROL DX,1), 0 0 0 0 0 0 0 1 (AND AL,1),0 0 0 0 0 0 0 0,0 0 1 1 0 0 0 0, ,30 31 30 30 30 30 31 30 30 30 31 31 30 30 30,1.,2.,16.,bin

19、buf,30,+ 0 0 1 1 0 0 0 0 (ADD AL,30H),mov al,dl,34,行业知识,根据上述分析,将(DX)中的二进制数依次循环左移1位,可以使得各个数位的分离(AND)和ASCII码转换(ADD)操作完全相同,便于组织循环,并且循环次数已知(16次)。,例4-17(P91): 将十进制数(number)转换为八进制数。,方法:(number)/8 保留余数,除法操作循环次数事先未知,仅当商为0时,循环结束。, 此例为计数循环, 此例为条件循环,35,行业知识,第四章 汇编语言程序设计的基本方法,例4-18 统计AX中的二进制数含“1”的总个数,程序段如下:,当型循

20、环与直到型循环:,MOVCX,0 AGAIN: ANDAX,AX;(AX)=0? JZQUIT;是,退出循环 SALAX,1 ;否,(AX)的最高位移入CF位 JNCNEXT;CF=0时,转向NEXT再次循环 INCCX ;CF=1,计数器(CX)(CX) +1 NEXT: JMPAGAIN;再次循环 QUIT :, 上述程序为当型循环程序结构:先判断条件,后执行循环。,36,行业知识,第四章 汇编语言程序设计的基本方法,4.4.3 多重循环程序设计,例: 分析下述程序的功能:,多重循环程序能够解决更复杂的实际问题。,消耗时间,延时功能,mov bl,20 delay: mov cx,9801

21、h;外循环开始 idle: loop idle;内循环体 dec bl jnz delay;外循环结束,37,行业知识,第四章 汇编语言程序设计的基本方法,设计多重循环程序时注意下面两点:,(1) 内层循环必须完全包含在外层循环内,(2) 转移指令只能从循环结构内转到循环结构外,38,行业知识,4.5 子程序设计,子程序结构是模块化程序设计的重要基础,其调用和返回分别由CALL和RET指令完成,子程序设计方法包括:,39,行业知识,第四章 汇编语言程序设计的基本方法,(1)段内直接调用,格式:CALL dst,操作:(SP)(SP)-2 ((SP)+1,(SP))(IP)(返回地址) (IP)

22、(IP)+D (子程序入口地址),保护断点地址,实现转移,类似段内直接近转移操作,1) 调用指令,CALL指令的寻址方式类似JMP指令,也分为四种调用方式。,4.5.1 调用与返回指令 (不影响标志位),40,行业知识,第四章 汇编语言程序设计的基本方法,(2)段内间接调用,格式:CALL dst,操作:(SP)(SP)-2, ((SP)+1,(SP))(IP) (IP)(OA) (OA是存储器单元地址或寄存器, (OA)=子程序入口的偏移地址),例4-24 段内间接调用子程序max,CALL BX ;保护断点,IP(BX)= max入口的偏移地址,41,行业知识,第四章 汇编语言程序设计的基

23、本方法,(3)段间直接调用,格式:CALL dst,操作:(CS)入栈 (IP)入栈 (IP) 子程序入口的偏移地址 (CS) 子程序入口的段地址,保护断点,例4-25 段间直接调用子程序max,保护断点: CS、IP当前值(断点地址)入栈 实现转移: max入口的段地址和偏移地址送CS、IP,CALL FAR PTR max,操作:,42,行业知识,操作:,第四章 汇编语言程序设计的基本方法,(4)段间间接调用,格式:CALL dst,操作: (CS)、(IP) 入栈, 保护断点 (IP)(OA),(CS)(OA+2),OA是双字单元地址,存放子程序入口地址。,例4-26 段间间接调用子程序

24、max,CALL DWORD PTR BX,保护断点:CS、IP当前值(断点地址)入栈 实现转移: ((IP)((BX)),(CS)((BX)+2) BX所指双字单元(OA)=max入口的段地址和偏移地址,43,行业知识,第四章 汇编语言程序设计的基本方法,2)返回指令 (不影响标志位),子程序执行的最后一条指令必须是RET指令 ,返回到CALL指令后的断点处继续执行。,(1)段内返回,格式: RET,操作:(IP)(SP)+1,(SP) (SP)(SP)+2,(2)段内带立即数返回,格式:RET 表达式 (D ),操作:(IP)(SP)+1,(SP) (SP)(SP)+2 (SP)(SP)+

25、D (16位的偏移量),44,行业知识,第四章 汇编语言程序设计的基本方法,例:带立即数返回举例,4,(参数个数2),push ax ;参数1入栈 push bx ;参数2入栈 CALL max;调用子程序max mov ax,bx;断点指令 max proc near ;子程序入口 ret max endp,参数1,参数2,IP,45,行业知识,第四章 汇编语言程序设计的基本方法,(3)段间返回,格式:RET,(4)段间带立即数返回,格式:RET 表达式,段间返回指令操作与段内返回指令的差别只是:, 段间返回指令从堆栈中连续弹出两个字 第一个字(断点的偏移地址)出栈送IP 第二个字(断点的段

26、地址)出栈送CS,46,行业知识,第四章 汇编语言程序设计的基本方法,4.5.2 子程序的编写方法,1)子程序的优点:,47,行业知识,第四章 汇编语言程序设计的基本方法,调用程序和子程序在同一代码段中,调用程序和 子程序不在同一代码段中,P99-P100,子程序的类型属性,NEAR型,FAR型,2)编写子程序的一般要求,(1)保护寄存器,48,行业知识,第四章 汇编语言程序设计的基本方法,(2)正确使用堆栈,sub1 proc near ;子程序入口 PUSH AX PUSH BX PUSH CX POP CX POP BX POP AX ret sub1 endp,出栈与入栈顺序应当相反,

27、必须成对地执行PUSH和POP指令 ,使RET指令能正确地弹出断点返回地址。,49,行业知识,第四章 汇编语言程序设计的基本方法, CALL sub1;调用子程序sub1 mov ax,bx;断点指令 sub1 proc near ;子程序入口 push ax ;数据1入栈 push bx ;数据2入栈 pop bx ;数据1出栈 pop ax ;数据2出栈 ret sub1 endp,例:子程序内必须成对地执行PUSH和POP指令 ,才能正常返回。,IP,ax,bx,50,行业知识,第四章 汇编语言程序设计的基本方法,(3)编写适当的子程序内部文档,使子程序可读性好、易理解和便于使用,(4)

28、参数传递,参数可以增加子程序的灵活性和通用性。调用程序传送给子程序的参数称为入口参数,子程序返回给调用程序的结果称为出口参数。,51,行业知识,第四章 汇编语言程序设计的基本方法,参数传递一般有如下三种方法:, 本节分别讨论用寄存器传递参数和用堆栈传递参数的方法例子。,52,行业知识,学习要点:,第四章 汇编语言程序设计的基本方法,例4-29 ( P104)在一个带符号数的数组中,选出绝对值最大的值并确定该值存放单元的位置序号。,选最大值方法的分析:,AX,120,DL,0,BX,430,DH,1,430,1,2,-44, 用寄存器传递参数的方法 选最大值的方法,array, 主程序提供参数:

29、 数组地址、数组长度 子程序选最大值,53,行业知识,第四章 汇编语言程序设计的基本方法,例4-31 程序功能与例4-29相同,不同的只是本例利用堆栈传递入口参数、和出口参数。,学习要点: 用堆栈传递参数的方法 bp寄存器的使用 带立即数返回指令的使用,程序分析如下:,程序执行过程中堆栈的变化情况如图所示。,( ret n),元素个数,数组首址,IP,bp,ax,bx,cx,dx,si,di,最大值,位置序号,(si),(cx),(ax),(dx),54,行业知识,简洁、易读,空间开销大,优点:,缺点:,第四章 汇编语言程序设计的基本方法,4.5.3 子程序的嵌套调用与递归调用,(1)子程序的

30、嵌套调用,(2)子程序的递归调用,A A,间接递归调用,直接递归调用,子程序的递归调用需要由堆栈传递参数 ,每次递归调用时将入口/出口参数、寄存器内容以及所有的中间结果保存在堆栈中。,A B A,AB C,55,行业知识,第四章 汇编语言程序设计的基本方法,例4-32 用递归的方法将一个字符数组中的字符串反序输出,字符串以$为结束符。,设 strs db ab$ ,程序执行过程中堆栈的变化如下:,(1)每次递归调用时,正向依次压入各字符的单元地址。,ax,bx,IP0,dx,strs,bp0,bp1+0 +2 +4 +6 +8 +10,( a ),( b ),ax,bx,IP1,dx,strs

31、+1,bp1,bp2+0 +2 +4 +6 +8 +10,( $ ),ax,bx,IP2,dx,strs+2,bp2,bp3+0 +2 +4 +6 +8 +10,56,行业知识,第四章 汇编语言程序设计的基本方法,ax,bx,IP0,dx,strs,bp0,bp1+0 +2 +4 +6 +8 +10,( a ),( b ),ax,bx,IP1,dx,strs+1,bp1,bp2+0 +2 +4 +6 +8 +10,( $ ),ax,bx,IP2,dx,strs+2,bp2,bp3+0 +2 +4 +6 +8 +10,$,反向输出:,b,a,(2)逐层返回时,反向逐次弹出各字符的单元地址并输出其中的字符。,57,行业知识,第四章 汇编语言程序设计的基本方法,4.6 DOS系

温馨提示

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

评论

0/150

提交评论