8085二进制搜索程序
这里我们将了解如何在8085中执行二进制搜索。
问题陈述:
编写8085汇编语言程序,对存储在F110到F119位置的一组数据执行二进制搜索。密钥位于F100。
讨论
要执行二进制搜索,数组必须已排序。我们将下限放入L,上限放入H。数组位置存储在DE寄存器对中。中间值使用(H + L)/2计算。要执行此除法,我们只需将其右移一次。然后将中间值放入D并检查使用DE定位的项。如果数字相同,则跳转到结束并将1存储在F101。这表示找到该项,并将中间值存储为索引。如果中间值不匹配,则有两种情况,如果数字小于中间元素,则它位于下半部分,因此上限将为中间值-1,在另一种情况下,它将位于另一侧,因此下限将为中间值+1。如果未找到该项,它将在F101位置存储02。
输入
| 地址 | 数据 |
|---|---|
| F100 | 48 |
| … | … |
| F110 | 04 |
| F111 | 08 |
| F112 | 22 |
| F113 | 2B |
| F114 | 31 |
| F115 | 38 |
| F116 | 48 |
| F117 | 51 |
| F118 | 54 |
| F119 | 62 |
| … | … |
| 地址 | 数据 |
|---|---|
| F100 | 9D |
| … | … |
| F110 | 04 |
| F111 | 08 |
| F112 | 22 |
| F113 | 2B |
| F114 | 31 |
| F115 | 38 |
| F116 | 48 |
| F117 | 51 |
| F118 | 54 |
| F119 | 62 |
| … | … |
流程图

程序
| 地址 | 十六进制代码 | 标签 | 助记符 | 注释 |
|---|---|---|---|---|
| F000 | 3A, 00, F1 | | LDA F100 | 将密钥加载到A中 |
| F003 | 47 | | MOV B,A | 将密钥存储到B中 |
| F004 | AF | | XRA A | 清除累加器 |
| F005 | 32, 03, F1 | | STA F103 | 将迭代次数存储到F103H中 |
| F008 | 6F | | MOV L,A | 也将A存储到L中 |
| F009 | 26, 09 | | MVI H,09 | 将9加载到H中 |
| F00B | 3A, 03, F1 | START | LDA F103 | 将迭代次数加载到A中 |
| F00E | 3C | | INR A | 增加A |
| F00F | 32, 03, F1 | | STA F103 | 恢复迭代次数 |
| F012 | 7C | | MOV A,H | 将上限从H取到A |
| F013 | BD | | CMP L | 比较A和L |
| F014 | DA, 46, F0 | | JC L2 | 如果CY = 1,则跳转到L2 |
| F017 | 85 | | ADD L | 否则将L与A相加 |
| F018 | 1F | | RAR | 右移以获取其一半 |
| F019 | 4F | | MOV C,A | 将中间值存储到C中 |
| F01A | D2, 1E, F0 | | JNC RESET | 如果CY = 0,则跳转到Reset |
| F01D | 3F | | CMC | 对进位取反 |
| F01E | 11, 10, F1 | RESET | LXI D,F110 | 将数组的初始地址加载到DE中 |
| F021 | 83 | | ADD E | 将E和Mid相加 |
| F022 | 5F | | MOV E,A | 将索引存储到E中 |
| F023 | AF | | XRA A | 清除A |
| F024 | 8A | | ADC D | 将D与A和进位相加 |
| F025 | 57 | | MOV D,A | 将A恢复到D |
| F026 | 1A | | LDAX D | 将A加载中间位置的值 |
| F027 | B8 | | CMP B | 与密钥比较 |
| F028 | DA, 34, F0 | | JC ELSE | 如果CY = 1,则跳转到ELSE |
| F02B | CA, 3A, F0 | | JZ PRINT | 如果它们相同,则跳转到PRINT |
| F02E | 79 | | MOV A,C | 将中间值从C取到A |
| F02F | 3D | | DCR A | 减少A以获取中间值-1 |
| F030 | 67 | | MOV H,A | 使用中间值-1更新上限 |
| F031 | C3, 0B, F0 | | JMP START | 再次跳转到START |
| F034 | 79 | ELSE | MOV A,C | 将中间值从C加载到A |
| F035 | 3C | | INR A | 增加A以获取中间值+1 |
| F036 | 7D | | MOV A,L | 使用中间值+1更新下限 |
| F037 | C3, 0B, F0 | | JMP START | 再次跳转到START |
| F03A | 3E, 01 | PRINT | MVI A,01 | 加载1,因为找到该项 |
| F03C | 32, 01, F1 | | STA F101 | 将结果存储在F101中 |
| F03F | 79 | | MOV A,C | 将中间值从C取到A |
| F040 | 32, 02, F1 | | STA F102 | 将密钥的索引存储到F102中 |
| F043 | C3, 4B, F0 | | JMP END | 结束任务 |
| F046 | 3E, 02 | L2 | MVI A,02 | 将2加载到A中,表示密钥不存在 |
| F048 | 32, 01, F1 | | STA F101 | 将结果存储在F102中 |
| F04B | 76 | END | HLT | 终止程序 |
输出
| 地址 | 数据 |
|---|---|
| F101 | 01 |
| F102 | 06 |
| 地址 | 数据 |
|---|---|
| F101 | 02 |
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP