160 likes | 277 Views
第十课. 复习. 4.3 汇编语言实用程序设计. 4.3.4 关键字查找程序设计. 4.3.5 数据极值查找程序设计. 4.3.6 数据排序程序设计. 4.3.4 关键字查找程序设计. 一、顺序检索 前提 :检索的数据表无序 从第 1 项开始逐项顺序查找,判断所取数据是否与关键字相等。 二、对分检索 前提 :检索的数据表已经排好序,采用更优化的查找策略。. 例 4-8 从 50 个字节的无序表中查找一个关键字 ××H 。. 例 4-9 片内 RAM 中存放一批数据,查找出最大值并存放于首地址中。. 例 4-10 排序.
E N D
第十课 复习 4.3 汇编语言实用程序设计 4.3.4 关键字查找程序设计 4.3.5 数据极值查找程序设计 4.3.6 数据排序程序设计
4.3.4 关键字查找程序设计 一、顺序检索 前提:检索的数据表无序 从第1项开始逐项顺序查找,判断所取数据是否与关键字相等。 二、对分检索 前提:检索的数据表已经排好序,采用更优化的查找策略。
例4-8 从50个字节的无序表中查找一个关键字××H。 例4-9 片内RAM中存放一批数据,查找出最大值并存放于首地址中。 例4-10 排序
4.3 汇编语言实用程序设计-关键字查找程序设计 例4-8 从50个字节的无序表(ROM中的常数表)中查找一个关键字××H。 注意:程序中的几处错误 用Keil 仿真 要求:读懂程序,画出流程图 注意CJNE的使用 注意子程序中堆栈指令的成对使用 将MOVC A, @A+PC换成MOVC A, @A+DPTR 问题:50B常数中查到了几个关键字? 子程序的入口参数、出口参数? 考虑参数传递,使子程序ABC能查找不同的数?
4.3 汇编语言实用程序设计-关键字查找程序设计 ORG 1000H ABC: MOV 30H,#××H ;关键字××H送30H单元 MOV R1,#50 ;查找次数送R1 MOV A,#14H;程序修改后应为16H修正值送A MOV DPTR,#TAB4 ;表首地址送DPTR LOOP:PUSH ACC MOVC A,@ A+PC ;查表结果送A CJNE A,30H,LOOP1;(30H)不等于关键字则转LOOP1 MOV R2,DPH ;已查到关键字,把该字的地址送R2,R3 MOV R3,DPL POP ACC ;与压栈指令配对 DONE: RET LOOP1:POP ACC ;修正值弹出 INC A ;A+1→A INC DPTR ;修改数据指针DPTR DJNZ R1,LOOP ;R1≠0,未查完,继续查找 MOV R2,#00H ;R1=0,清“0” R2 和`R3 MOV R3,#00H ;表中50个数已查完 AJMP DONE ;从子程序返回 TAB4:DB …,…,… ;50个无序数据表
4.3 汇编语言实用程序设计-关键字查找程序设计 ORG 1000H ABC: MOV 30H,#××H ;关键字××H送30H单元 MOV R1,#50 ;查找次数送R1 CLR A MOV DPTR,#TAB4 ;表首地址送DPTR LOOP:PUSH ACC MOVC A,@ A+DPTR;查表结果送A CJNE A,30H,LOOP1;(30H)不等于关键字则转LOOP1 MOV R2,DPH ;已查到关键字,把该字的地址送R2,R3 MOV R3,DPL POP ACC ;与压栈指令配对 DONE: RET LOOP1:POP ACC ;修正值弹出 ;INC A ;A+1→A INC DPTR ;修改数据指针DPTR DJNZ R1,LOOP ;R1≠0,未查完,继续查找 MOV R2,#00H ;R1=0,清“0” R2 和`R3 MOV R3,#00H ;表中50个数已查完 AJMP DONE ;从子程序返回 TAB4:DB …,…,… ;50个无序数据表
ORG 0000H LJMP START ORG 0030H START: MOV 30H,#**H ACALL ABC MOV 40H, R2 MOV 41H, R3 MOV 30H,#^^H ACALL ABC MOV 42H, R2 MOV 43H, R3 SJMP $ ORG 1000H ABC: ;MOV 30H,#××H ;关键字××H送30H单元 MOV R1,#50;查找次数送R1 TAB4: DB …,…,… ;50个无序数据表 END 包装成源程序 ORG 0000H LJMP START ORG 0030H START: ACALL ABC SJMP $ ORG 1000H ABC: MOV 30H,#××H ;关键字××H送30H单元 MOV R1,#50 ;查找次数送R1 TAB4: DB …,…,…;50个无序数据表 END
4.3.5 数据极值查找程序设计 任务: 在指定的数据区中进行数值大小的比较,从这批数据中找出最大值(或最小值)并存于某一单元中。 例4-9片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存首地址,R2中存放字节数,程序框图如图4-1所示。
4.3 汇编语言实用程序设计-数据极值查找程序设计
4.3 汇编语言实用程序设计-数据极值查找程序设计 MOV R2,n ;??n为要比较的数据字节数 MOV A,R0 ;存首地址指针 MOV R1,A DEC R2 ; MOV A,@R1 LOOP: MOV R3, A DEC R1 CLR C SUBB A,@R1;两个数比较 JNC LOOP1;C=0,A中的数大,跳LOOP1 MOV A,@R1 ;C=1,则大数送A SJMP LOOP2 LOOP1: MOV A,R3 LOOP2: DJNZ R2, LOOP;是否比较结束? MOV @R0, A ;存最大数 RET
练习 ABC: MOV R2,#20 ;要比较的数据字节数 MOV R1,#30H MOV A,@R1;取第一个数 LOOP: MOV R3, A ;将当前最小数存R3 INC R1 CLR C SUBB A,@R1;两个数比较 JC LOOP1 ;C=1,A中的数小,跳LOOP1 MOV A,@R1 ;C=0,则小数送A SJMP LOOP2 LOOP1: MOV A,R3 ;恢复A中的小数 LOOP2: DJNZ R2, LOOP;是否比较结束? MOV A,R3 ;存最大数 RET • 写一个子程序,将30H单元后20个字节中的最小值存于A中。
4.3 汇编语言实用程序设计-数据排序程序设计 4.3.6 数据排序程序设计 升序排,降序排。仅介绍无符号数据升序排。 冒泡法:相邻数互换的排序方法,类似水中气泡上浮 。排序时从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。 假设有7个原始数据的排列顺序为:6、4、1、2、5、7、3。第一次冒泡的过程是: 6、4、1、2、5、7、3 ;原始数据的排列 4、6、1、2、5、7、3 ;逆序,互换 4、1、6、2、5、7、3 ;逆序,互换 4、1、2、6、5、7、3 ;逆序,互换 4、1、2、5、6、7、3 ;逆序,互换 4、1、2、5、6、7、3 ;正序,不互换 4、1、2、5、6、3、7 ;逆序,互换,第一次冒泡结束
4.3 汇编语言实用程序设计-数据排序程序设计 如此进行,各次冒泡的结果如下: 第1次冒泡结果:4、1、2、5、6、3、7 第2次冒泡结果:1、2、4、5、3、6、7 第3次冒泡结果:1、2、4、3、5、6、7 第4次冒泡结果:1、2、3、4、5、6、7 ;已完成排序 第5次冒泡结果:1、2、3、4、5、6、7 第6次冒泡结果:1、2、3、4、5、6、7 对于n个数,理论上应进行(n-1)次冒泡,有时不到(n-1)次就已完成排序 。如何判定排序是否已完成,看各次冒泡中是否有互换发生,如果有数据互换,则排序还没完成。 在程序设计中,常使用设置互换标志的方法,该标志的状态表示在一次冒泡中是否有互换进行。
例4-10一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如图4-2所示。例4-10一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如图4-2所示。
SORT: MOV A,R0 ; MOV R1, A MOV A,R2 ;字节数送入R5 MOV R5, A CLR F0 ;互换标志位F0清零 DEC R5 ; MOV A,@R1 ; LOOP: MOV R3, A ; INC R1 ; CLR C ; MOV A,@R1 ;比较大小 SUBB A,R3 ; JNC LOOP1 ; SETB F0 ;互换标志位F0置1 MOV A,R3; ; XCH A,@R1 ;两个数互换 DEC R1 ; XCH A,@R1 ; INC R1 LOOP1: MOV A,@R1 DJNZ R5,LOOP JB F0,SORT RET 十结束
2010-04-15 作业 • P99 7、8、10