8086汇编写冒泡排序并基于子程序设计输出结果

写在前面:也是万年没更新博客了……大二一年快过去了回首一下发现大二完全就不更新博客……原因很多吧,其一是感觉整理博客虽然能够加深理解对学习帮助很大但是还是很花时间的,效益比较低,也是不如多看看书多刷刷题;其二也可以说是最主要的原因,大二一年比较功利,做事学习也是很侧重性价比,想绩点各方面刷好然后杠一个国家奖学金,因此很少更新博客。这次更新记录我们最后一次汇编实验,很基础但是完全自学然后强行撸掉之后,内心感觉还是很快乐的。就感觉这是我在大一的状态,全身心的攻克一个比较困难的题,怼上一整天的时间,最终收获的快乐是刷绩点哪都瞎几把水水无法比拟的。好了就感慨到这,下面上正文。

1.1实验内容:

设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。然后在显示 器输出排好序的数据,中间用’,’隔开。

排序采用循环程序。

输出数据使用子程序方式。

PS:这里输出之所以需要做子程序,是因为只要和显示器输出有关都是和ASCII有关,需要做一步二进制到10进制以及数字到ASCII的转化。

PPS:流程图没有传上来,因为比较大传上来应该不好看,参考文章后面的源代码不难画出流程图。

1.2算法分析:

这次实验内容相对于前几次,较为综合,因此我们在算法分析的时候需要进行模块化的分析,对各个模块进行逐一击破。

  1.2.1冒泡排序

有过高级语言的学习基础对这个内容不会陌生,我们下面完成两个步骤,第一个再简单的用语言描述一下冒泡排序的思想和算法步骤,为下面的汇编程序设计打基础,第二我们就给出冒泡排序的汇编程序流程图。

1.2.1.1冒泡排序算法思想:

整体上分两层循环,假设第一层的指示变量是i,第二层指示变量为j,那么按照冒泡排序的思想,我们第一层循环一趟的目的,就是将这个数组倒数第i个位置的正确数值确定,为了完成外层循环的目的,内层循环就需要扫描数组第0~n-i个位置,比较相邻的两个位置,如果前面较大,则进行一次交换。

1.2.1.2伪代码描述如下:

  Bubble_sort(A)

   1. For i = 0 to n - 1
   2.   For j = 1 to n - i
   3.      If(A[j] > A[j-1])
   4.         Exchange A[j] with A[j-1]

 1.2.2输出部分:

  按照题目要求,这里要利用子程序设计的方式进行输出。也就是我们在输出的时候,在外层设置一个循环控制,循环中对每个内存单元以10进制数形式进行输出即可。

1.2.2.1算法整体思想:

首先来整体的考虑下这个算法设计需要注意什么问题,题目要求中明确给出了是有符号数,因此这里面在输出的时候为了直观,我们需要将符号‘-’给体现出来,这就要求算法设计的时候需要考虑数字的正负。其次我们还需要考虑如何根据机器数转化成对应的10进制数,与高级语言类似,我们设置迭代过程,利用DIV指令,对原始数据多次除10,并将余数取出压栈,然后加上对应的数值(30H)得到对应数字的ASCII码,然后输出即可。

 1.3 代码

  1 DATAS SEGMENT
  2     DATA DB  2 , 1 , 0 , -1  ,-2
  3     COUNT DB  5
  4 DATAS ENDS
  5
  6 STACKS SEGMENT
  7     ;此处输入堆栈段代码
  8 STACKS ENDS
  9
 10 CODES SEGMENT
 11     ASSUME CS:CODES,DS:DATAS,SS:STACKS
 12 START:
 13     MOV AX,DATAS
 14     MOV DS,AX
 15     MOV CL , 0H
 16
 17
 18      ;冒泡排序开始
 19       MOV CL , COUNT;外层循环指示变量
 20 OUTLOOP:
 21      MOV AL , CL;内部循环指示变量初始化
 22       DEC AL
 23       MOV CH , AL
 24       MOV BX , OFFSET DATA + 1;数据指针
 25 INLOOP:
 26       MOV AH , [BX-1]
 27       MOV AL , [BX]
 28       CMP AH , AL
 29       JS NOT_CHANGE
 30       MOV [BX] , AH
 31       MOV [BX - 1] , AL
 32       NOT_CHANGE :
 33       INC BX
 34       DEC CH
 35       JNZ INLOOP
 36       DEC CL
 37       CMP CL  , 1
 38       JNZ OUTLOOP  ;冒泡排序结束
 39
 40      ;开始进行输出
 41
 42      MOV BX , OFFSET DATA
 43     MOV CL , COUNT
 44 PRINT_LOOP:
 45      MOV AL , [BX]
 46      MOV AH , 00H
 47      INC BX
 48      CALL FUN
 49      DEC CL
 50      JZ ENDD
 51      MOV AH , 02H
 52      MOV DX , ‘,‘
 53      INT 21H
 54      AND CL , CL
 55      JNZ PRINT_LOOP
 56
 57 ENDD:
 58      MOV AH,4CH
 59      INT 21H
 60
 61
 62
 63 FUN PROC NEAR
 64     ;MOV DL , 10
 65 SHABI:
 66     PUSH CX
 67     MOV CL , 00H
 68     AND AL , AL
 69     JNS POS
 70     PUSH AX
 71     MOV AH , 02H
 72     MOV DX , ‘-‘
 73     INT 21H
 74     POP AX
 75     NEG AL
 76 POS:
 77     MOV DL , 10
 78     DIV DL      ;[AX]/10  AL是商 , AH是余数
 79     MOV DL , AH
 80     AND AH , 0H ;清空余数
 81     ADD DL , 48
 82     MOV DH , 00H
 83     PUSH DX
 84     INC CL
 85     AND AL , AL
 86     JNZ SHABI
 87
 88 PRINT:
 89     POP DX
 90     MOV AH , 02H
 91     INT 21H
 92     DEC CL
 93     JNZ PRINT
 94
 95     POP CX
 96     RET
 97 FUN ENDP
 98
 99 CODES ENDS
100     END START
时间: 2024-11-06 16:54:57

8086汇编写冒泡排序并基于子程序设计输出结果的相关文章

8086汇编语言学习(二) 8086汇编开发环境搭建和Debug模式介绍

1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语言.工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境. 汇编语言设计之初是用于在没有操作系统的裸机上直接操作硬件的,但对于大部分人来说,在8086裸机上直接进行编程将会面临各种困难.好在我们可以使用软件模拟器来模拟硬件进行8086的学习实践.在<汇编语言>中作者推荐通过windows环境下的masm和debug进行学习. masm介绍: masm是一款DOS下的汇编工具包,

8086汇编学习小结———实时更新

初学IBM-PC 8086,对INT指令不是很理解.现从网上总计如下: 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘

基于Spring设计并实现RESTful Web Services(转)

基于Spring设计并实现RESTful Web Services 在本教程中,你将会使用Spring来创建一个具有生产力的RESTful网络服务. 为什么用RESTful网络服务? 从和Amazon Web Services的整合,到聚合多个数据源,RESTful网络服务遵从了Roy Fielding的架构风格的指导方针,提供了简单.高效的web APIs,支持的API用户数量从少量到百万级别. 你要实现一个RESTful风格的网络服务,可能会是因为: 你正在创建一个API,而客户端需要通过网

8086汇编双人贪食蛇游戏

突然找到4年前自己写的纯8086汇编语言双人贪食蛇游戏,绝对原创代码纯手打.分享给有需要参考的童鞋! Download : http://download.csdn.net/detail/yarkey09/7415405 源码:game1205.asm 可运行文件:GAME1205.EXE ( Windows XP 32bit 环境下测试成功 ) 字库文件:HZK24 位图图片:256.bmp 主要涉及以下几大难点: 1,8086汇编语言语法 2,BIOS/DOS系统中断功能调用 3,中断向量表

8086汇编指令速查手册

一.常用指令 二.算术运算指令 三.逻辑运算指令四.串指令 五.程序跳转指令------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1.数据寄存器数据寄存器主要用来保存操作数和运算结

哪里可以找到基于JAVA设计帮做的超市管理系统

一,关于我们我们是专业从事于定做计算机相关毕业设计,拥有专业的写手团队和严格的保密制度.我们的工程师们在软件工程开发与设计的各个领域积累了丰富的经验,保证服务水平.我们致力于为客户提供各专业高质量的毕业设计定做服务,为即将毕业的同学提供毕业设计指导.毕设代做.毕设定制等一站式服务.强大的专业能力,高效的服务水平,多年以来一直深得客户好评,毕业只有一次,我们将尽心尽力为你完成毕设. 联系我们:.扣.扣.号(幺零三贰三七幺贰幺) 与我们取得联系,向我们提出您的写作要求:我们咨询师会根据您的服务需求和

《C++ Primer》 对象、数组、基于对象设计、泛型设计

数组 C++ 不支持数组的抽象 abstraction 也不支持对整个数组的操作我们有时会希望对整个数组进行操作例如把一个数组赋值给另外一个数组对两个数组进行相等比较或者想知道数组的大小 size 例如给出两个数组我们不能用赋值操作符把一个数组拷贝到另一个中去. int array0[ 10 ], array1[ 10 ]; array0 = array1;  // error 数组类型本身没有自我意识它不知道自己的长度我们必须另外记录数组本身的这些信息. 数组和指针的关系: int ia[]

【JavaScript基础】在写冒泡排序时遇到的JavaScript基础问题:JavaScript的数据类型和变量赋值时的原理

写冒泡排序时,遇到一个问题: function bubbleSort(arr){ var temp = 0; console.log("传入的数组:"); console.log(arr); for(var i = 0;i<arr.length;i++){ //循环arr.length-1次 console.log("外层第"+i+"次循环===============start"); for(var j = 0;j<arr.leng

读书笔记:《写给大家看的设计书》

读书笔记:<写给大家看的设计书> <写给大家看的设计书>这本书本来是买给孩子看的,孩子对板报.杂志.名片等设计很感 兴趣,想看点基础的设计类的书籍,就给她找了一本.书到手后,我随手翻了翻发现对于我制作PPT还是很有帮助的,对于非专业设计人员来说,掌握4条设计原 则确实可以让设计感觉到非常专业,这几条原则应用于网站的设计也是同样有效. 全书三大部分,共14章,第一部分(第1-8章)最有用,讲述四大设计原则,第二部分(第9-11章)讲字体设计,第三部分有点像附录. 第一章 约书亚树 有