1 / 16

第十课

第十课. 复习. 4.3 汇编语言实用程序设计. 4.3.4 关键字查找程序设计. 4.3.5 数据极值查找程序设计. 4.3.6 数据排序程序设计. 4.3.4 关键字查找程序设计. 一、顺序检索 前提 :检索的数据表无序 从第 1 项开始逐项顺序查找,判断所取数据是否与关键字相等。 二、对分检索 前提 :检索的数据表已经排好序,采用更优化的查找策略。. 例 4-8 从 50 个字节的无序表中查找一个关键字 ××H 。. 例 4-9 片内 RAM 中存放一批数据,查找出最大值并存放于首地址中。. 例 4-10 排序.

pippa
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. 第十课 复习 4.3 汇编语言实用程序设计 4.3.4 关键字查找程序设计 4.3.5 数据极值查找程序设计 4.3.6 数据排序程序设计

  2. 4.3.4 关键字查找程序设计 一、顺序检索 前提:检索的数据表无序 从第1项开始逐项顺序查找,判断所取数据是否与关键字相等。 二、对分检索 前提:检索的数据表已经排好序,采用更优化的查找策略。

  3. 例4-8 从50个字节的无序表中查找一个关键字××H。 例4-9 片内RAM中存放一批数据,查找出最大值并存放于首地址中。 例4-10 排序

  4. 4.3 汇编语言实用程序设计-关键字查找程序设计 例4-8 从50个字节的无序表(ROM中的常数表)中查找一个关键字××H。 注意:程序中的几处错误 用Keil 仿真 要求:读懂程序,画出流程图 注意CJNE的使用 注意子程序中堆栈指令的成对使用 将MOVC A, @A+PC换成MOVC A, @A+DPTR 问题:50B常数中查到了几个关键字? 子程序的入口参数、出口参数? 考虑参数传递,使子程序ABC能查找不同的数?

  5. 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个无序数据表

  6. 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个无序数据表

  7. 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

  8. 4.3.5 数据极值查找程序设计 任务: 在指定的数据区中进行数值大小的比较,从这批数据中找出最大值(或最小值)并存于某一单元中。 例4-9片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存首地址,R2中存放字节数,程序框图如图4-1所示。

  9. 4.3 汇编语言实用程序设计-数据极值查找程序设计

  10. 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

  11. 练习 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中。

  12. 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 ;逆序,互换,第一次冒泡结束

  13. 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)次就已完成排序 。如何判定排序是否已完成,看各次冒泡中是否有互换发生,如果有数据互换,则排序还没完成。 在程序设计中,常使用设置互换标志的方法,该标志的状态表示在一次冒泡中是否有互换进行。

  14. 例4-10一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如图4-2所示。例4-10一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如图4-2所示。

  15. 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 十结束

  16. 2010-04-15 作业 • P99 7、8、10

More Related