汇编--BinarySearch(二分查找)
计算机二分法查找

计算机二分法查找
二分法(又称折半查找)是一种在有序数组中查找某一特定元素的搜索算法。
具体实现过程如下:
1. 定义变量low、high分别表示有序数组的起始下标和结束下标;
2. 定义变量mid表示数组中间元素的下标(mid=(low+high)/2),并取得该元素的值;
3. 如果该元素等于查找值,直接返回该元素的下标;
4. 如果该元素大于查找值,则说明查找值在当前元素的左侧,将high设为mid-1,并重新计算mid的值;
5. 如果该元素小于查找值,则说明查找值在当前元素的右侧,将low设为mid+1,并重新计算mid的值;
6. 重复以上过程,直到找到查找值或者low>high。
下面是一个示例代码:
```
int binary_search(int arr[], int n, int target) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1; // 查找失败
}
```
其中,arr是有序数组,n是数组大小,target是要查找的值。
如果查找成功,返回该值在数组中的下标;否则返回-1。
c语言 binsearch函数

c语言 binsearch函数下面是一个示例的二分查找函数binsearch,可以在一个已经排序的数组中查找给定的目标值:```c#include <stdio.h>int binsearch(int arr[], int target, int len) {int left = 0;int right = len - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1; // 目标值不在数组中}int main() {int arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};int target = 16;int len = sizeof(arr) / sizeof(arr[0]);int result = binsearch(arr, target, len);if (result == -1) {printf("目标值不在数组中\n");} else {printf("目标值在数组的下标为%d\n", result);}return 0;}```此函数中的参数arr是一个已经排序好的数组,target是我们要查找的目标值,len是数组的长度。
返回值是目标值在数组中的下标,如果目标值不存在,则返回-1。
常用编程术语词典

常用编程术语词典abstract 抽象的抽象的abstraction 抽象体、抽象物、抽象性抽象体、抽象物、抽象性access 存取、取用存取、访问access level 存取级别访问级别access function 存取函式访问函数activate 活化激活active 作用中的adapter 配接器适配器address 位址地址address space 位址空间,定址空间address-of operator 取址运算子取地址操作符aggregation 聚合algorithm 演算法算法allocate 配置分配algorithm 演算法算法allocate 配置分配allocator (空间)配置器分配器application 应用程式应用、应用程序application framework 应用程式框架、应用框架应用程序框架architecture 架构、系统架构体系结构argument 引数(传给函式的值)。
叁见parameter 叁数、实质叁数、实叁、自变量array 阵列数组arrow operator arrow(箭头)运算子箭头操作符assembly 装配件assembly language 组合语言汇编语言assert(ion) 断言assign 指派、指定、设值、赋值赋值assignment 指派、指定赋值、分配assignment operator 指派(赋值)运算子= 赋值操作符associated 相应的、相关的相关的、关联、相应的associative container 关联式容器(对应sequential container)关联式容器atomic 不可分割的原子的attribute 属性属性、特性audio 音讯音频A.I. 人工智慧人工智能background 背景背景(用於图形着色)後台(用於行程)backward compatible 回溯相容向下兼容bandwidth 频宽带宽base class 基础类别基类base type 基础型别(等同於base class)batch 批次(意思是整批作业)批处理benefit 利益收益best viable function 最佳可行函式最佳可行函式(从viable functions 中挑出的最佳吻合者)binary search 二分搜寻法二分查找binary tree 二元树二叉树binary function 二元函式双叁函数binary operator 二元运算子二元操作符binding 系结绑定bit 位元位bit field 位元栏位域bitmap 位元图位图bitwise 以bit 为单元逐一┅bitwise copy 以bit 为单元进行复制;位元逐一复制位拷贝block 区块,区段块、区块、语句块boolean 布林值(真假值,true 或false)布尔值border 边框、框线边框brace(curly brace) 大括弧、大括号花括弧、花括号bracket(square brakcet) 中括弧、中括号方括弧、方括号breakpoint 中断点断点build 建造、构筑、建置(MS 用语)build-in 内建内置bus 汇流排总线business 商务,业务业务buttons 按钮按钮byte 位元组(由8 bits 组成)字节cache 快取高速缓存call 呼叫、叫用调用callback 回呼回调call operator call(函式呼叫)运算子调用操作符(同function call operator)candidate function 候选函式候选函数(在函式多载决议程序中出现的候选函式)chain 串链(例chain of function calls)链character 字元字符check box 核取方块(i.e. check button) 复选框checked exception 可控式异常(Java)check button 方钮(i.e. check box) 复选按钮child class 子类别(或称为derived class, subtype)子类class 类别类class body 类别本体类体class declaration 类别宣告、类别宣告式类声明class definition 类别定义、类别定义式类定义class derivation list 类别衍化列类继承列表class head 类别表头类头class hierarchy 类别继承体系, 类别阶层类层次体系class library 类别程式库、类别库类库class template 类别模板、类别范本类模板class template partial specializations类别模板偏特化类模板部分特化class template specializations类别模板特化类模板特化cleanup 清理、善後清理、清除client 客端、客户端、客户客户client-server 主从架构客户/服务器clipboard 剪贴簿剪贴板clone 复制克隆collection 群集集合combo box 复合方块、复合框组合框command line 命令列命令行(系统文字模式下的整行执行命令) communication 通讯通讯compatible 相容兼容compile time 编译期编译期、编译时compiler 编译器编译器component 组件组件composition 复合、合成、组合组合computer 电脑、计算机计算机、电脑concept 概念概念concrete 具象的实在的concurrent 并行并发configuration 组态配置connection 连接,连线(网络,资料库)连接constraint 约束(条件)construct 构件构件container 容器容器(存放资料的某种结构如list, vector...)containment 内含包容context 背景关系、周遭环境、上下脉络环境、上下文control 控制元件、控件控件console 主控台控制台const 常数(constant 的缩写,C++ 关键字)constant 常数(相对於variable)常量constructor(ctor)建构式构造函数(与class 同名的一种member functions)copy (v) 复制、拷贝拷贝copy (n) 复件, 副本cover 涵盖覆盖create 创建、建立、产生、生成创建creation 产生、生成创建cursor 游标光标custom 订制、自定定制data 资料数据database 资料库数据库database schema 数据库结构纲目data member 资料成员、成员变数数据成员、成员变量data structure 资料结构数据结构datagram 资料元数据报文dead lock 死结死锁debug 除错调试debugger 除错器调试器declaration 宣告、宣告式声明deduction 推导(例:template argument deduction)推导、推断default 预设缺省、默认defer 延缓推迟define 定义预定义definition 定义、定义区、定义式定义delegate 委派、委托、委任委托delegation (同上)demarshal 反编列散集dereference 提领(取出指标所指物体的内容)解叁考dereference operator dereference(提领)运算子* 解叁考操作符derived class 衍生类别派生类design by contract 契约式设计design pattern 设计范式、设计样式设计模式※最近我比较喜欢「设计范式」一词destroy 摧毁、销毁destructor 解构式析构函数device 装置、设备设备dialog 对话窗、对话盒对话框directive 指令(例:using directive)(编译)指示符directory 目录目录disk 碟盘dispatch 分派分派distributed computing 分布式计算(分布式电算) 分布式计算分散式计算(分散式电算)document 文件文档dot operator dot(句点)运算子. (圆)点操作符driver 驱动程式驱动(程序)dynamic binding 动态系结动态绑定efficiency 效率效率efficient 高效高效end user 终端用户entity 物体实体、物体encapsulation 封装封装enclosing class 外围类别(与巢状类别nested class 有关)外围类enum (enumeration) 列举(一种C++ 资料型别)枚举enumerators 列举元(enum 型别中的成员)枚举成员、枚举器equal 相等相等equality 相等性相等性equality operator equality(等号)运算子== 等号操作符equivalence 等价性、等同性、对等性等价性equivalent 等价、等同、对等等价escape code 转义码转义码evaluate 评估、求值、核定评估event 事件事件event driven 事件驱动的事件驱动的exception 异常情况异常exception declaration 异常宣告(ref. C++ Primer 3/e, 11.3)异常声明exception handling 异常处理、异常处理机制异常处理、异常处理机制exception specification 异常规格(ref. C++ Primer 3/e, 11.4)异常规范exit 退离(指离开函式时的那一个执行点)退出explicit 明白的、明显的、显式显式export 汇出引出、导出expression 运算式、算式表达式facility 设施、设备设施、设备feature 特性field 栏位,资料栏(Java)字段, 值域(Java)file 档案文件firmware 韧体固件flag 旗标标记flash memory 快闪记忆体闪存flexibility 弹性灵活性flush 清理、扫清刷新font 字型字体form 表单(programming 用语)窗体formal parameter 形式叁数形式叁数forward declaration 前置宣告前置声明forwarding 转呼叫,转发转发forwarding function 转呼叫函式,转发函式转发函数fractal 碎形分形framework 框架框架full specialization 全特化(ref. partial specialization)function 函式、函数函数function call operator 同call operatorfunction object 函式物件(ref. C++ Primer 3/e, 12.3)函数对象function overloaded resolution函式多载决议程序函数重载解决(方案)functionality 功能、机能功能function template 函式模板、函式范本函数模板functor 仿函式仿函式、函子game 游戏游戏generate 生成generic 泛型、一般化的一般化的、通用的、泛化generic algorithm 泛型演算法通用算法getter (相对於setter) 取值函式global 全域的(对应於local)全局的global object 全域物件全局对象global scope resolution operator全域生存空间(范围决议)运算子:: 全局范围解析操作符group 群组group box 群组方块分组框guard clause 卫述句(Refactoring, p250) 卫语句GUI 图形介面图形界面hand shaking 握手协商handle 识别码、识别号、号码牌、权柄句柄handler 处理常式处理函数hard-coded 编死的硬编码的hard-copy 硬拷图屏幕截图hard disk 硬碟硬盘hardware 硬体硬件hash table 杂凑表哈希表、散列表header file 表头档、标头档头文件heap 堆积堆hierarchy 阶层体系层次结构(体系)hook 挂钩钩子hyperlink 超链结超链接icon 图示、图标图标IDE 整合开发环境集成开发环境identifier 识别字、识别符号标识符if and only if 若且唯若当且仅当Illinois 伊利诺伊利诺斯image 影像图象immediate base 直接的(紧临的)上层base class。
array数组binarysearch方法

array数组binarysearch方法在Java 中,数组类(`Arrays` 类)提供了一个`binarySearch` 方法,用于对排序后的数组进行二分查找。
这个方法有多个重载形式,其中包括对整型数组、对象数组和某个范围内的数组进行二分查找。
以下是一些常见用法:1. 对整型数组进行二分查找:```javaimport java.util.Arrays;public class BinarySearchExample {public static void main(String[] args) {int[] array = {1, 2, 4, 7, 10, 15};int key = 7;// 对排序后的数组进行二分查找int index = Arrays.binarySearch(array, key);if (index >= 0) {System.out.println("Element " + key + " found at index " + index);} else {System.out.println("Element " + key + " not found in the array");}}}```2. 对对象数组进行二分查找:如果数组是对象数组,确保对象实现了`Comparable` 接口或提供了自定义的比较器。
```javaimport java.util.Arrays;public class BinarySearchObjectArrayExample {public static void main(String[] args) {String[] array = {"apple", "banana", "orange", "pear"};String key = "orange";// 对排序后的对象数组进行二分查找int index = Arrays.binarySearch(array, key);if (index >= 0) {System.out.println("Element " + key + " found at index " + index);} else {System.out.println("Element " + key + " not found in the array");}}}```3. 对数组的指定范围进行二分查找:```javaimport java.util.Arrays;public class BinarySearchRangeExample {public static void main(String[] args) {int[] array = {1, 2, 4, 7, 10, 15};int key = 7;// 对指定范围的数组进行二分查找int index = Arrays.binarySearch(array, 0, 4, key);if (index >= 0) {System.out.println("Element " + key + " found at index " + index);} else {System.out.println("Element " + key + " not found in the specified range");}}}```在使用`binarySearch` 方法之前,确保数组已经按升序排序。
C语言基本算法

C语言基本算法C语言是一种广泛使用的编程语言,用于开发各种应用程序和系统。
算法是编程的核心部分,是解决问题的方法和步骤的描述。
在C语言中,有许多基本算法可以用来解决简单级别的问题。
下面我将介绍几种常见的C语言基本算法。
1.线性查找算法线性查找算法是一种简单的查找算法,它从数组的第一个元素开始顺序地比较,直到找到目标元素或遍历完整个数组。
这个算法的时间复杂度是O(n)。
```cint linearSearch(int arr[], int n, int target)for (int i = 0; i < n; i++)if (arr[i] == target)return i;}}return -1;```这个算法接受一个整数数组arr、数组的大小n和目标元素target 作为输入,并返回目标元素在数组中的索引,如果未找到则返回-12.冒泡排序算法冒泡排序是一种简单的排序算法,它通过多次循环比较和交换相邻元素来排序。
每次循环都将最大的元素冒泡到数组的末尾。
这个算法的时间复杂度是O(n^2)。
```cvoid bubbleSort(int arr[], int n)for (int i = 0; i < n-1; i++)for (int j = 0; j < n-i-1; j++)if (arr[j] > arr[j+1])int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}```这个算法接受一个整数数组arr和数组的大小n作为输入,并将数组按升序排序。
3.二分查找算法二分查找算法是一种高效的查找算法,它使用分治策略将有序数组分为两部分,并选择中间元素进行比较。
如果中间元素等于目标元素,则返回中间元素的索引;否则,如果中间元素大于目标元素,则在左侧部分继续查找;如果中间元素小于目标元素,则在右侧部分继续查找。
这个算法的时间复杂度是O(logn)。
如何在1000万个整数中快速查找某个整数?——二分查找

如何在1000万个整数中快速查找某个整数?——⼆分查找时间复杂度O(logn),很强适⽤于数组的数据结构,但不适⽤于链表,因为链表不⽀持随机访问只能查找有序数组,如果是⽆序的,需要进⾏⼀次排序(最低时间复杂度O(nlogn))数据量⼩不适⽤,直接⽤遍历查找即可数据量太⼤也不适⽤,因为数据结构是数组,需要的是连续的内存空间#include <iostream>#include <vector>#include <stack>#include <cstring>#include <string>#include <queue>#include <algorithm>#include "TreeNode.h"#include "ListNode.h"using namespace std;// ⼆分查找具有O(logn)的时间复杂度,很强,但是只能⽤于数组的数据结构,像链表就不适合// ⼆分查找⾮递归法int binarySearch(int num[], int length, int key){if(length < 1)return -1;int low = 0;int high = length - 1;int middle = 0;while(low <= high){// 以后尽量使⽤位运算,不直接⽤(low + high) / 2是为了防⽌加法溢出middle = low + ((high - low) >> 1);if(num[middle] == key)return middle;if(num[middle] > key)high = middle - 1;else if(num[middle] < key)low = middle + 1;}// 没找到则返回-1return -1;}// ⼆分查找递归⽅法int binarySearchPlus(int num[], int low, int high, int key){if(low > high)return -1;int middle = low + ((high - low) >> 1);if(num[middle] == key)return middle;if(num[middle] > key)return binarySearchPlus(num, low, middle - 1, key);elsereturn binarySearchPlus(num, middle + 1, high, key);}int main(int argc, char* argv[]){int arr[8] = {8,7,6,5,4,3,2,1};cout<<binarySearch(arr, 8, 5)<<endl;cout<<binarySearchPlus(arr, 0, 7, 5)<<endl;return 0;}。
查找数字的函数
查找数字的函数查找数字的函数在编程中,我们经常需要查找一个数组中的数字,或者在一段文本中查找数字。
这时就需要使用查找数字的函数。
查找数字的函数通常有两种:一种是针对数字数组的查找函数,另一种是针对文本的查找函数。
本文将分别介绍这两种查找数字的函数。
一、针对数字数组的查找函数针对数字数组的查找函数主要包括以下几种:1. 线性查找线性查找是最简单的查找方法,通过一个一个地比较数字来定位目标数字。
这种方法的优点是代码简单易懂,缺点是效率低下。
当数字数组比较大时,线性查找的时间复杂度为O(n)。
下面是一个线性查找函数的示例代码:```c int LinearSearch(int arr[], int n, int k) { for (int i = 0; i < n; i++) { if (arr[i] == k) { returni; } } return -1; } ```此函数接受三个参数:一个整数数组arr、数组中元素的数量n,以及要查找的数字k。
它返回k在数组中的下标,如果不存在则返回-1。
2. 二分查找二分查找是一种更高效的查找方法,它利用数字数组已经排好序这一条件,通过不断缩小查找范围来定位目标数字。
这种方法的时间复杂度为O(log n)。
下面是一个二分查找函数的示例代码:```c int BinarySearch(int arr[], int n, int k){ int left = 0; int right = n - 1; while (left <= right) // 注意这里是小于等于号{ int mid = (left + right) / 2; if (arr[mid] == k) { returnmid; } else if (arr[mid] < k) { left = mid + 1; }else { right = mid -1; } } return -1; } ```此函数接受三个参数:一个整数数组arr、数组中元素的数量n,以及要查找的数字k。
二分法c语言程序代码
二分法c语言程序代码二分法是一种常用的算法,它通过将问题不断二分,以快速找到解决方案。
在计算机科学中,二分法常被用于查找有序数组中的特定元素。
它通过将数组不断分成两半,然后判断要查找的元素在哪一半中,从而缩小搜索范围,最终找到所需元素的位置。
二分法的核心思想是将问题不断地分解为更小的子问题,并通过比较中间元素与目标元素的大小关系,来决定下一步搜索的方向。
具体的实现方式是,首先确定数组的中间元素,然后将中间元素与目标元素进行比较。
如果中间元素等于目标元素,则找到了所需元素;如果中间元素大于目标元素,则在左半部分继续查找;如果中间元素小于目标元素,则在右半部分继续查找。
通过不断地二分,直到找到目标元素或者确定目标元素不存在为止。
下面是一个使用二分法查找有序数组的示例代码:```c#include <stdio.h>int binarySearch(int arr[], int target, int left, int right) {while (left <= right) {int mid = left + (right - left) / 2; // 计算中间元素的索引if (arr[mid] == target) {return mid; // 找到目标元素} else if (arr[mid] < target) {left = mid + 1; // 在右半部分继续查找 } else {right = mid - 1; // 在左半部分继续查找 }}return -1; // 目标元素不存在}int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15};int n = sizeof(arr) / sizeof(arr[0]);int target = 7;int result = binarySearch(arr, target, 0, n - 1);if (result == -1) {printf("目标元素不存在\n");} else {printf("目标元素的索引为:%d\n", result); }return 0;}```在上面的示例代码中,我们首先定义了一个有序数组arr,然后确定了要查找的目标元素target。
c++ 对数组元素查找的方法
c++ 对数组元素查找的方法在 C++ 中,查找数组元素的方法有很多种。
以下是一些常见的方法:1.线性查找:这是一种简单的方法,它逐个检查数组中的每个元素,直到找到所需的元素或遍历完整个数组。
int linearSearch(int arr[], int n, int x) {for (int i = 0; i < n; i++) {if (arr[i] == x) {return i; // 返回找到元素的索引}}return -1; // 如果没有找到元素,返回 -1}2.二分查找:如果数组是排序的,那么可以使用二分查找法,这种方法每次比较都会排除一半的元素。
int binarySearch(int arr[], int l, int r, int x) {while (l <= r) {int mid = l + (r - l) / 2;if (arr[mid] == x) {return mid; // 返回找到元素的索引} else if (arr[mid] < x) {l = mid + 1;} else {r = mid - 1;}}return -1; // 如果没有找到元素,返回 -1}3.哈希表查找:使用哈希表可以快速查找元素。
在 C++ 中,可以使用标准库中的unordered_map或unordered_set。
#include <unordered_map>#include <iostream>int main() {std::unordered_map<int, int> m;m[1] = 2;m[2] = 3;m[3] = 4;m[4] = 5;m[5] = 6;int key = 3; // 要查找的键值if (m.find(key) != m.end()) { // 如果找到键值,返回对应的值std::cout << "Value: " << m[key] << std::endl;} else { // 如果没有找到键值,输出提示信息std::cout << "Key not found" << std::endl;}return 0;}。
sort
排序 排序算法,是计算机编程中的一个常见问题。在日常的数据处理中,面对纷繁的数据,我们也许有成百上千种要求,因此只有当数据经过恰当的排序后,才能更符合用户的要求。因此,在过去的数十载里,程序员们为我们留下了几种经典的排序算法,他们都是智慧的结晶。本章将带领大家探索这些有趣的排序算法,其中包括介绍排序算法的某些基本概念以及几种常见算法。
一 冒泡排序(Bubble Sort)
冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面时,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序了。
二 选择排序(Selection Sort) 第1遍比较L0与L1,如果L0>L1,交换它们的值。然后比较L1与L2的值。最后比较L8与L9。这个循环遍例9次。这时,最大值93的位置为L9。
第2遍比较L0与L1,如果L0>L1,交换它们的值。然后比较L1与L2的值。最后比较L7与L8。这个循环遍例8次。这时,第2大的值68的位置为L8。
以此类推,最后一遍只比较L0与L1。这时整个数组已经排好序了。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 public static void bubbleSort(int[] a) { int n = a.length; for(int i = 1; i < n; i++) { for(int j = 0; j < n - i; j++) { if(a[j] > a[j + 1]) { swap(a, j, j + 1); } } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-1-
一、实验目的
1. 熟悉汇编语言程序设计的开发环境、格式以及汇编过程;
2. 熟练掌握Debug命令的U命令、D命令、R命令、G命令、T命令、Q命令等;
3. 掌握分支程序的设计方法。
二、实验原理及基本技术路线图(方框原理图)
1. Debug常用命令简介:
D命令:格式:D [range]或 D [address],显示部分存储区的内容;
U命令:格式:U [address],将内存某一区的机器码,用此命令反汇编为源程序;
R命令:格式:R[Register name],显示和修改各寄存器的内容;
G命令:格式:G[=address][address[address..],执行需运行的程序,并对调试的程序
进行断点测试跟踪;
T命令:格式:T[=address][Value],执行以 CS:IP 中指定开始的一个或几个指令,并
显示出执行每条指令后所有寄存器的内容;
Q命令:格式:Q,退出 DEBUG状态,说明:Q命令不保留正在内存中运行的文件,
若保留需用 "W" 命令, DEBUG返回到命令处理程序,然后显示出正常的命令提示。
2. 折半查找流程图
具有分支结构的程序叫做分支程序。设计分支程序时最好先用流程图画出程序流
向,这样思路清晰,也利于编码实现,实现分支时要用到转移指令。以下为折半查找的
流程图:
-2-
三、所用仪器、材料(设备名称、型号、规格等)
1. 操作系统平台:Windows Server 2003
2. 汇编环境:Microsoft MASM 5.0
3. 文本编辑器:记事本
四、实验方法、步骤
1. 将MASM5.0的文件置于C:\assembly\目录下;
2. 将masm.exe和link.exe所在目录(C:\assembly\MASM5)添加到Path环境变量中;
3. 用记事本在C:\assembly\下新建一个BS.asm文件,打开BS.asm,输入汇编程序代码;
4. 运行一个命令行窗口,将当前目录切换到C:\assembly\,然后输入命令:masm BS.asm
[Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存
开始
输入要查找
的数CHAR
CHAR=BUF[MID]
MIN≤MAX
结束
MID=(MAX+MIN)/2
初始化MAX、MIN
CHAR<BUF[MID]
MAX=MID-1 查找次数加1 MIN=MID+1
查找次数加1
输出未找到
输出BUF[MID],
并输出查找次数
-3-
后重新汇编,直至没有错误为止,此时会生成BS.obj文件;
5. 输入命令:link BS.obj [Enter],观察输出结果,如果没有错误,则生成BS.exe文件;
6. 输入命令:debug BS.exe [Enter],调试程序,并记录运行过程;
7. 完成实验报告。
五、实验过程原始记录(数据、图表、计算等)
1. 将C:\assembly\MASM5目录添加到Path环境变量中:
2. 新建BS.asm文件,输入汇编程序代码:
程序源码:
STACKSG SEGMENT STACK 'S'
DW 64 DUP('ST')
STACKSG ENDS
DATA SEGMENT
BUF DB 30H,31H,32H,33H,34H,35H,36H
DB 37H,38H,39H,41H,42H,43H,44H,45H ;有序表
COUNT EQU $-BUF ;表项数
-4-
CHAR DB ? ;要查找的数
MARK DW 0 ;查找次数
PROMPT DB 'NO FOUND$' ;没找到提示信息
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACKSG
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV AH,1 ;输入要查找数的字符
INT 21H
MOV CHAR,AL ;保存要找的数
LEA SI,BUF ;表起始地址,初始化区间下限(左)
MOV CX,COUNT
MOV DX,SI
ADD DX,CX ;最后数的地址加1
MOV DI,DX ;初始化区间上限(右)
MOV DX,0
CMP AL,[SI] ;判边界元素
MOV BX,SI
JB NOFID ;小于表中最小数转未找到
JE FOUND ;是表中最小数转找到
CMP AL,[DI-1] ;判边界元素
MOV BX, DI
JA NOFID ;大于表中最大数转未找到
JE FOUND ;是表中最大数转找到
MOV DX,1 ;初始化查找次数
MOV AL,CHAR ;要查找的数
-5-
C1: MOV BX,SI ;循环入口
ADD BX,DI
SHR BX,1 ;折半
CMP AL,[BX] ;比较
JZ FOUND ;找到转
PUSHF
CMP BX,SI ;指针=下限吗?
JZ NOFID ;若等于表示未找到,转
POPF
JL LESS ;可能在左半区转
MOV SI,BX ;可能在右半区,调整下限
JMP SHORT NEXT
LESS: MOV DI,BX ;调整上限
NEXT: INC DX ;查找次数加1
JMP C1
NOFID: LEA DX,PROMPT ;显示未找到提示信息
MOV AH,9
INT 21H
JMP SHORT EXIT
FOUND: MOV MARK,DX ;保存查找次数
PUSH DX
MOV AH,2 ;显示找到的数
MOV DL,[BX]
INT 21H
MOV CL,10
POP AX
DIV CL ;把查找次数转换成十进制数
OR AX,3030H ;转换成ASCII码
-6-
MOV DL,AL
PUSH AX
MOV AH,2 ;显示查找次数的高位
INT 21H
POP AX
MOV DL,AH
MOV AH,2 ;显示查找次数的低位
INT 21H
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
3. 汇编源程序:
4. 连接生成可执行文件:
-7-
5.调试程序:
(1)程序前奏部分(执行了第一句MOV AX, 0BCB,当前(AX)=0BCB)
(2)输入要查找的数3,当前AL的值为33H(3的ASCII码)
(3)判断3是否小于或等于最小值,显然不成立,继续判断3是否大于或等于最大值
-8-
(4)以上判断均不成立,则置查找次数为1,进入二分查找程序段
(5)第一次比较判断可能在左半区,调整上限,查找次数加1
-9-
(6)转入第二次比较
(7)第二次比较后找到了
(8)进入FOUND程序段
(9)找到之后,显示找到的数3
-10-
(10)分别显示查找次数的高位0和低位2
(11)程序退出
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲
线图时必须用计算纸)
1. 从本次实验我体会到:分支程序在设计之前流程图可以明确我们的编程思路,代码
书写会比较流畅。另外代码书写时要严格注意格式,否则代码较长时,会造成思路混乱,
好好代码书写习惯是写好程序的前提。
-11-
2. DEBUG命令在汇编程序之后对程序的调试中非常有用,适当使用不同的命令,可以
加快我们的调试速度,提高编程效率。最常用的U命令、G命令、T命令和Q命令必
须熟练掌握。在调试中,适时的使U命令反汇编程序,可以查看当执行到哪一段代码
了;G命令可以让我们执行自定义的代码段;G命令和T命令结合使用可以查看当寄
存器值的变化和程序逻辑的正确性;当发现程序有逻辑错误时,可以使用Q命令退出
程序修改代码,再进行调试。其他的命令如:R命令、D命令等也可以使我们的调试更
加高效快速。
3. 编写程序时,要密切关注寄存器的状态以及各条语句对标志位的影响(如果程序中
用到的话)。另外在编写指令时要尽量选择最优的,刚开始可能写的不是很好,但经常
练习就会体会到同种功能的不同语句的区别。