文档库 最新最全的文档下载
当前位置:文档库 › 史上最牛最完整的汇编语言冒泡排序程序

史上最牛最完整的汇编语言冒泡排序程序

史上最牛最完整的汇编语言冒泡排序程序
史上最牛最完整的汇编语言冒泡排序程序

;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。

;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。

;程序代码M_DIRECT MACRO STRING ;定义一个宏,调用09 号

DoS功能在屏幕上显示一个字符串

MoV DX,oFFSET

AH,O9

21H STRING

MoV

INT

ENDM

DATA SEGMENT

DIR1 DB 'count of numbers to

sort:$ ' ;提示输入要排序的数据的个数

DIR2 DB 'please input sorting numbers:$ '; 提示输入要排序的数据

DIR3 DB 'sorting result:$ ' ;在屏幕上提示排好续的数据

DIR4 DB '*************************$ '

DIR5 DB 'please choose u(up)ord(down):$ '

DIR6 DB 'input error$ '

CoUNT

=

1OO

WTEMP DW ?

ARRAY DW CoUNT DUP(?) ;用来保存输入的数据

CRLF DB 13,1O, '$ ' ;实现回车换行的功能,13→ODH,回车;10→OAH,换行

LEN

DW

;保存实际输入的数据的个数

DATA ENDS

CoDE SEGMENT

MAIN PRoC FAR

ASSUME CS:CoDE,DS:DATA

START:

PUSH DS

SUB

AX,AX

PUSH ;置AX 为O

AX

MOV

AX,DATA ;将数据段的地址送到DX 中

MOV DS,AX

READ: M_DIRECT DIR1 ; 宏调用,在屏幕上提示输入要输入的数据的个数

CALL

P_GETNEW ;调用子程序P-GETNEW输入要输入的数据的个

MOV CX,AX

MOV LEN,AX

LEA BX,ARRAY

MOV

AH,09

; 调用09 号功能,实现回车换行

LEA DX,CRLF

INT

21H ;屏幕提示输入要排序的数据

M_DIRECT DIR2

GETNUMBER: CALL P_GETNEW ; 输入数据并保存到ARRA 丫中

MOV [BX],AX

ADD BX ,2

LOOP GETNUMBER

CX,LEN

SORT:

; 排序程序部分

MOV DEC CX

MOV AH,09H

LEA DX,CRLF

INT

21H

M_DIRECT DIR5

COMPARE:MOV AH,01H

INT

21H

CMP AL,

'U' ;判断是升序排序还是降序排序

JZ

JMP

;排序完后跳转到输出程序部分

UP

;输入的字符是U 或U 跳转到升序排序程序

CMP AL, 'u'

JZ

UP

CMP

'D'

;输入的字符是D 或d 跳转到降叙排序程序

JZ DOWN

CMP

AL, 'd'

JZ

DOWN

UP:

DI,CX

; 升序排序程序

MOV

BX,0 LOOP1:

MOV

AX,ARRAY[BX]

CMP

AX,ARRAY[BX+2]

JNGE

CONTINUE1

XCHG AX,ARRAY[BX+2]

MOV

ARRAY[BX],AX

CONTINUE1: ADD

BX,2

LOOP LOOP1

MOV

CX,DI

LOOP

UP

JMP

OUTPUT

; 排序完后跳转到输出程序部分

DOWN:

DI,CX

;降序排序程序

MOV

BX,0 LOOP2:

MOV

AX,ARRAY[BX]

CMP

AX,ARRAY[BX+2]

JGE

CONTINUE2

XCHG AX,ARRAY[BX+2]

MOV

ARRAY[BX],AX

AL,

MOV

MOV

CONTINUE2:

ADD

BX,2

LOOP LOOP2 MOV CX,DI

LOOP DOWN

OUTPUT

OUTPUT: MOV AH,09 ;回车换行

LEA DX,CRLF

INT 21H

M_DIRECT DIR3

CX,LEN

MOV

;为输出程序设置好入口参数

MOV BX,OFFSET ARRAY

WRITE: MOV AX,[BX] 输出排好

序的数据

WTEMP,AX

MOV

;将入口参数存放到共享变量中

CALL P_OUTPUT

ADD MOV DL,20H 开

MOV

INT

LOOP

BX,2

; 显示空格,将两个输出的数据分

AH,02H

21H

WRITE

AH,09 AH,09

MOV

LEA DX,CRLF

INT 21H

M_DIRECT

MOV

LEA DX,CRLF

INT 21H

LOOP READ

RET

;隔离两次输入排序输出的作用

DIR4

;实现循环输入数据并排序输出MAIN ENDP

;从键盘上输入一个数据的子程序

P_GETNEW PROC

PUSH BX ; 出口参数:AX=

补码表示的二进制数

PUSH DX

XOR

BX,BX ;BX 保存结果

XOR

CX,CX

;CX 为正负标志, 0

为正, -1 为负

MOV

AH,1

;输入一个字符

INT

21H

CMP

AL, '+'

; 是“ +”,继续输入字

JZ

READ1

CMP

AL, '-'

; 是“—,设置 -1 标志

JNZ

READ2

MOV

CX,-1

READ1:

MOV AH,1

; 继续输入字符

INT

21H

READ2:

CMP

AL, '0'

;不是 0~9 之间的字符,则

输入数据结束

JB

READ3

CMP

AL, '9'

JA

READ3

SUB

AL,30H

;是 0~9之间的字符,

则转换为二进制数

;利用移位指令,实现数值乘

10: BX^BX*10

SHL

BX,1

MOV

DX,BX

SHL

BX,1

SHL

BX,1

ADD

BX,DX

MOV

AH,0

ADD

BX,AX

; 已输入数值乘 10 后,与新输入的数值相加

JMP

READ1

; 继续输入字符

READ3:

CMP CX,0 ; 是负数,进行求补

JZ READ4

NEG

BX

READ4:

MOV

AX,BX ; 设置出口参数

POP DX

;说明:负数用“-”

引导,数据范围是 +32767~-32768

PUSH CX

冒泡排序的算法及其程序实现

冒泡排序的算法及其程序实现 浙江省慈溪中学施迪央 教学分析: 本节课是浙江教育出版社出版的普通高中课程标准实验教科书《算法与程序设计》第二第3节以及第五章第3节的部分教学内容。 一组不长的数据(如5个),从小到大排序,对学生来说是一件容易的事情,但他们并不知道计算机是怎么实现排序的,同时他们也没见识过计算机对大量数据(如1000个)的排序。学习排序有助于学生对计算机工作原理的认识。冒泡排序对学生来说初次接触,但前面的枚举算法和解析算法的部分内容对学习排序有一定的帮助,如数组变量的定义及使用方法、双重循环的使用方法及特点以及如何通过键盘输入一批数据(即text1_keypress()事件)在前面都已涉及,冒泡排序的学习又可以巩固前面的知识。 关于冒泡排序的算法及程序实现我安排了3个课时,本案例是在教室内完成的2节随堂课,第3课时安排学生上机实践:对键盘输入的一批数据进行冒泡排序。 教学目标: 1、知识与技能: 了解排序及冒泡排序的概念及特点 掌握冒泡排序算法的原理 初步掌握冒泡排序的程序实现 2、过程与方法: 理解冒泡排序的分析过程,并初步掌握用冒泡排序算法来设计解决简单的排序问题 3、情感态度与价值观: 通过冒泡排序算法的分析过程,培养学生思维的严谨性以及用科学方法解决问题的能力使学生深入理解计算机的工作原理,激发了学生学习程序兴趣。 教学重点: 冒泡排序算法的原理 教学难点: 分析冒泡排序的实现过程 教学策略: 讲授法与探究法。教师讲授、学生听讲,教师提问、学生动脑,层层深入,步步为营,一切水到渠成。 教学准备: 编写好手动输入一批的数据的冒泡排序的程序 编写好计算机自动生成数据的冒泡排序的程序 课堂中使用的教学课件 教学过程: 一、问题引入 问题一:什么是排序? 所谓排序,把杂乱无章的一列数据变为有序的数据,比如7,3,4,8,1这五个数据从小到大排序,结果是1,3,4,7,8,我们很容易排出来。那么电脑是怎么进行排序的呢?问题二:一批数据在VB中如何存储的?比如如何存储六位裁判为一位运动员评出的分数? 用数组变量来存储一批类型、作用相同的数据,如分别用d(1),d(2),d(3),d(4),d(5),d(6)来存储六位裁判给出的分数。 问题三:如果运动员的最后得分是从这6个分数中去掉最高分与最低分后的平均分,你认为

C语言程序设计冒泡排序教学案例

C语言程序设计冒泡排序教学案例 永川职业教育中心杨进【案例背景】 排序是计算机学科中一项复杂而重要的技术,在各种软件中使用频率都很高,因此专家们研究了各种排序算法。在中职类设计课程教学中,常以冒泡排序来讲解排序的原理,它简单,但过程繁琐,传统教学很难激发学生兴趣,学生不易理解,也很难编写掌握冒泡排序。因此,如何合理设计教学过程,让学生掌握冒泡排序的思想和编程方法,又能发散思维,扩充知识,进而激发学生对编程课程的兴趣,是一个关键问题。 1、学情分析 学生已学习了程序设计的三种结构,学习使用了数组。但在学习排序算法的过程中学生可能会对数组变量的变化在理解上存在一定困难,在排序算法中,对双重循环内外层的作用及有关循环参数的设置可能会产生一些不合理或是错误,需要通过实践的体验进行强化使用规范。 2、教学目标 知识目标:掌握冒泡排序的原理;能结合冒泡排序的原理看懂冒泡排序的主要代码;理解冒泡排序的流程图; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,进一步体会算法与程序实现的关系; 情感目标:培养学生分析问题、发现规律的能力,激发学生学习热情;培养良好的读程习惯; 3、教学重点、难点 重点:冒泡排序算法的基本思想,双重循环应用 难点:双重循环程序的解读,冒泡排序算法实现后对程序的理解 4、教学策略与手段 以循序渐进、层层深入为教学的指导方针,采用讲解法、演示法、讨论合作、分析归纳法引导学生参与思考,由特殊到一般,有效地突出重点突破难点,逐步深化对冒泡算法、循环思想和执行过程的理解。

5、课前准备 PPT课件、冒泡排序的视频文件。 【案例描述】 师:在前面的学习中,我们学过了用EXCEL进行一些简单的数据处理方法,请同学们说说看你是怎么对同学的成绩排次序的? 生:先选好数后,点排序就行了。 师:是的。只要用EXCEL的排序功能就可以了,点点鼠标就能完成。在前面的学习中,我们已经解开了很多单击鼠标就可以完成某一个任务的秘密,今天我们就来探访一下排序的秘密。 师:先让我们来做个舞蹈视频,同时要求同学们谈谈看后的自己的想法。并要请几位同学模拟示范。 这段真人编排的排序算法的舞蹈视频,非常生动有趣,能充分吸引学生的眼球,极大激发了学生的兴趣。 播放完毕,老师提问:请同学们说说你们看到了什么? 生:议论并说自己的想法。(冒泡排序的过程) 由于视频播放相对较快,为了让学生更好理解与参与,老师还根据具体情况请了四位涌跃分子来作下一个游戏。 请四位同学从前到后坐好并拿好老师给你们的数字,然后从后面开始两个两个比较你们手中的数,如果后面的同学数小的话就和前面的同学换一下座位,直到拿到最小数的同学坐在第一个位子为止。 现在开始,请其他同学注意观察。 请同学们说说你们看到了什么? 生:议论并说自己的想法 师:我听到了同学们的发言了,你们都看到了最小数已经在最前面了,并且是经过了3次的比较。想一想,如果要让拿第二小的数的同学坐上第二个座位,还要进行几次的比较呢?(注意只能从后开始两两比较)请拿数的同学演示一下。几次? 生:两次 师:对了,是两次,比第一次少了一次。请四位同学回到座位。刚才我们通过四位

汇编语言程序设计综合设计实验项目

汇编语言程序设计创新实验项目 1. 编写一个完整的程序:根据零件的数量和总价格,计算出零件的单价。 主程序MAINPRO允许用户在键盘上输入零件数量和总价格; 子程序SUBCONV 把从键盘输入的ASCII 码转化为二进制; 子程序SUBCALC 计算出零件的单价; 子程序SUBDISP 把二进制表示的单价转化为十进制数并显示出结果。 要求:在程序设计时要求使用顺序、分支、循环、子程序和宏汇编等多种方法解决程序设计问题,对于较大的子程序最好使用子程序嵌套,程序中如有多次重复的代码最好使用重复汇编。 2.编写一个完整的程序,分别输入有一个班学生的百分制成绩,根据学生百分制成绩转换出五级分数制。如低于60分为E,60-69为D、70-79为C、80-89为B、90-99为A。并统计该班学生人数。 要求:1、学生成绩从键盘接收; 2、本程序可以重复运行,自行设计退出程序的方法; 3、程序具有可操作性,如,应该有提示语句和判断非法操作的方法和处理方式。 3. 编写一个完整的程序,在屏幕上显示如图所示数字拼成的形状。 0123456789 1234567890 2345678901 3456789012 4567890123 5678901234 6789012345 7890123456 8901234567 9012345678 4、按要求编写一个完整的程序。 要求:1、自BUFFER开始的内存单元中,存有一个ASCII码字符串。查找已知字符串中含有多少个子字符串‘AB’的个数,将统计结果以十进制形式显示输出。 2、在查找到子字符串‘AB’后添加空格字符。 5、按要求编写一个完整的程序。 要求:1、编写子程序SORT,将内存中10个无符号字数据由小到大排序。 2、编写子程序FIND,在上述已排好的数据区里查找某一个数,若找到,显示 其在数据区的位置,否则显示‘N’字符。 3、编写调用程序,完成排序及检索任务。 6、试编写一程序,要求根据用户键入的月份在终端上显示该月的英文缩写名。 7、试编写一程序,要求接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,其中grade+1保存学号为了i+1的学生的成绩。然后根据grade中的学生成绩,把学生

冒泡排序教学设计

冒泡排序教学设计 -CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

3.2.2冒泡排序教学设计 一、教材分析 本节内容选自浙江教育出版社《算法与程序设计》第二章第三节和第五章第三节。以第二章内容为主,下节课让学生进行第五章编写程序及上机实践。 《课程标准》指出《算法与程序设计》模块教学主要目的是“使学生进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题出发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题。”冒泡排序的算法及程序实现就很好地较全面地体现了这点。 排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法。它的学习同时为后面的选择排序做了铺垫。通过冒泡实例的学习,可以提高学生的程序设计能力,为今后在算法与程序设计方面的进一步研究和学习打下基础。 二、学情分析 通过前面的学习,同学们已经初步了解了算法设计的基本知识,学会了利用自然语言和流程图描述解决问题的算法,对排序中碰到的循环结构的流程图和循环语句以及数组变量的使用方法都已有基础。但由于实践比较少,对以前知识的遗忘率比较高,画流程图还不太熟练,程序设计思想比较弱。因此由浅入深,逐步引导比较适合学生的口味。 三、教学目标 知识目标:掌握冒泡排序的原理;理解冒泡排序的流程图;编写冒泡排序的主要代码; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,体会程序设计在现实中的作用; 情感目标:培养学生分析问题、发现规律的能力,激发学生学习热情;培养良好的程序书写习惯; 四、重点难点 重点:理解冒泡排序原理及它的流程图 难点:理解冒泡排序中的遍、次等概念(即对变量使用的理解) 五、课前准备 教师的教学准备:冒泡排序的课件 2

高中信息技术_冒泡排序算法教学设计学情分析教材分析课后反思

高一冒泡排序教学设计 基本路线:数组-排序-冒泡排序【冒泡排序原理--流程图-算法优化】-小结 一、教材分析:本节内容选自浙江教育出版社《算法与程序设计》第五章第三节。本节课主要讲解冒泡排序思想。排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法。它的学习同时为后面的选择排序做了铺垫。 教学目标 知识目标:掌握冒泡排序的原理;掌握冒泡排序的流程图; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,体会程序设计在现实中的作用; 进一步学习流程框图的使用。 情感目标:增强分析问题、发现规律的能力,激发学习热情; 学情分析 通过前面的学习,学生已经了解vb算法设计的基本知识,学会 利用自然语言和流程图描述解决问题的算法,对排序中循环语句以有了一定的基础。但数组变量的使用方法尚未接触,程序设计思想比较弱,在实际生活中往往忽视运用排序算法来处理实际问题,这就要求学生通过本节课的学习,学会运用冒泡排序算法来处理实际问题,并为以后学习其它排序算法打下基础。 二、重点难点 重点:理解冒泡排序原理及它的流程图

难点:理解冒泡排序中的遍、次等概念(即对变量使用的理解)以及用流程图描述冒泡排序的过程 三、教学策略与手段 采用讲解法、演示法、分析归纳法引导学生参与思考,用逐步求精的方式降低学生的理解难度,化抽象为具体,由特殊到一般,有效地突出重点、突破难点。 四、课前准备 1.教师的教学准备:冒泡排序的课件、学案、素材 2.教学环境的设计与布置:多媒体网络教室、电子白板、多媒体教学平台等 五、教学过程 课前学习【设计意图】学生能自己学会的不讲。排序数组知识点相对简单,由学生自学完成,之前的知识点学生可能会有所遗忘,通过这个方式让学生回顾。冒泡排序算法原理比较容易也由学生自学完成。 已给出的素材,完成学案关于数组、冒泡排序和循环结构的基本模式的相关部分的内容,。 请同学们学习学习网站上的课前学习,并完成学案的相关部分的内容。 上课! 对答案。

C语言冒泡排序法的简单程序

求一个C语言冒泡排序法的简单程序 悬赏分:50 - 解决时间:2007-9-4 11:16 我不明白怎么写 随便给我个就行 谢谢了 提问者:redangel0002 - 助理二级最佳答案 main() { int i,j,temp; int a[10]; for(i=0;i<10;i++) scanf ("%d,",&a[i]); for(j=0;j<=9;j++) { for (i=0;i<10-j;i++) if (a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;} } for(i=1;i<11;i++) printf("%5d,",a[i] ); printf("\n"); } -------------- 冒泡算法 冒泡排序的算法分析与改进 交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。 冒泡排序 1、排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 (1)初始 R[1..n]为无序区。 (2)第一趟扫描 从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key

C语言冒泡排序及流程图(思路解析)

1、功能:冒泡排序 输入:数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* ==================================================== 算法思想简单描述: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较 小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要 求相反时,就将它们互换。 下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的 位置k,这样可以减少外层循环扫描的次数。 冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方] ===================================================== */ void bubble_sort(int *x, int n) { int j, k, h, t; for (h=n-1; h>0; h=k) /*循环到没有比较范围*/ { for (j=0, k=0; j *(x+j+1)) /*大的放在后面,小的放到前面*/ { t = *(x+j); *(x+j) = *(x+j+1); *(x+j+1) = t; /*完成交换*/ k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/ } } } } 2 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较

微机原理实验报告冒泡排序

一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。 (2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查瞧排序前后内存数据的变化; ③去掉最大值与最小值,求出其余值的平均值,输出最大值、最小值与平均值; ④用压栈PUSH与出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图Array (1)主程序:MAIN

(2)

就是 NAME BUBBLE_SORT DATA SEGMENT ARRAY DW 5 DUP(?) ;输入数据的存储单元 COUNT DW 5 TWO DW 2 FLAG1 DW 0 ;判断符号标志 FLAG2 DB 0 ;判断首位就是否为零的标志FAULT DW -1 ;判断出错标志 CR DB 0DH,0AH,'$' STR1 DB 'Please input five numbers seperated with space and finished with Enter:','$' STR2 DB 'The original numbers:','$' STR3 DB 'The sorted numbers:','$' STR4 DB 'The Min:','$' STR5 DB 'The Max:','$' STR6 DB 'The Average:','$' STR7 DB 'The binary system of the average :','$' STR8 DB 'Input error!Please input again!''$' DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DS AND AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;9号DOS功能调用,提示输入数据 INT 21H CALL CRLF ;回车换行 REIN: CALL INPUT ;调用INPUT子程序,输入原始数据CMP AX,FAULT ;判断就是否出错, JE REIN ;出错则重新输入

汇编语言习题与答案

汇编语言习题与答案 一、填空题:把答案填在题中横线上。 1.8位无符号整数的表示范围为0~255,写成16进制形式为00H~__________;8位有符号整数的表示范围为-128~+127,写成16进制形式为__________~__________。 2.8086/8088分段管理存储空间,但每段容量最大不超过__________。 3.逻辑地址为F000:100的存储单元,其物理地址是__________。 4.用来指示堆栈栈顶的偏移地址的是__________寄存器。 5.若要测试AL寄存器D4、D2、D0位是否都为0,则可使用__________指令语句(含操作数),以产生转移条件。这条指令执行后将利用标志位__________实现转移。 6.若定义:bdata db2dup(1,2,2dup(3),4),则dbata变量前5个单元从低地址到高地址的数据依次是__________。 7.假设varw是一个16位变量,则指令“mov varw,ax”的目的操作数的寻址方式是__________。 二、选择题:在每小题给出的四个选项中,只有一项是符合题目要求的,请把所选项前的字母填在题后的括号 内。 1.对汇编语言源程序进行翻译,形成OBJ文件的是 A.汇编程序 B.连接程序 C.编辑程序 D.调试程序[] 2.下列各个8位二进制数的补码中,真值最大的是 A.10001000 B.11111111 C.00000000 D.00000001[] 3.MASM语句中,表达常数不正确的形式是 A.01101001B B.A346H C.’A’ D.5600[] 4.如果SS=600H,则说明堆栈段物理地址起始于 A.60H B.600H C.6000H D.60000H[] 5.dw50dup(?)预留了存储空间的字节数是 A.25 B.50 C.100 D.200[] 6.下列指令中有操作数在代码段中的是 A.mov ax,34h B.add ax,bx C.inc word ptr[34h] D.cmp ax,[34h][] 7.假设AL=5,要使得AL=0FAH,应执行的指令是 A.not al B.and al,0fh C.xor al,0f0h D.or al,0fh[] 8.设置逻辑段应该采用的一对伪指令是 A.segment/ends B.start/end start C.proc/endp D.macro/endm[] 9.条件转移指令JNE条件是 A.CF=0 B.CF=1

冒泡排序的三种实现

冒泡排序是非常容易理解和实现,以从小到大排序举例: 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。 3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码: //冒泡排序1 void BubbleSort1(int a[], int n) { int i, j; for (i = 0; i < n; i++) for (j = 1; j < n - i; j++) if (a[j - 1] > a[j]) Swap(a[j - 1], a[j]); } 下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。 //冒泡排序2 void BubbleSort2(int a[], int n) { int j, k; bool flag; k = n; flag = true; while (flag) { flag = false; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = true; } k--; } } 再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必

定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。 //冒泡排序3 void BubbleSort3(int a[], int n) { int j, k; int flag; flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = j; } } } 冒泡排序毕竟是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,最好用其它排序方法。 我的java代码实现 package com.bjsxt.sort; import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] a = { 2, 4, 5, 6, 7, 8, 23, 9, 76, 45, 34 }; int len = a.length; BubbleSort sort = new BubbleSort(); // 冒泡排序升序 //System.out.println(Arrays.toString(sort.bubbleSort1(a, len)));//原始冒泡排序 //System.out.println(Arrays.toString(sort.bubbleSort2(a, len)));//第一步优化 System.out.println(Arrays.toString(sort.bubbleSort3(a, len)));//第二部优化 //System.out.println(Arrays.toString(sort.bubbleSort4(a,

单片机汇编语言程序编程规范

引言 软件设计更多地是一种工程,而不是一种个人艺术。如果不统一编程规范,最终写出的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。 分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。 可见,提高软件质量必须降低编码阶段的错误率。如何有效降低编码阶段的错误呢?这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。 本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。 1.排版 规则1 程序块使用缩进方式,函数和标号使用空格缩进,程序段混合使用TAB和空格缩进。缩进的目的是使程序结构清晰,便于阅读和理解。 默认宽度应为8个空格,由于Word中为4个空格,为示范清晰,此处用2个代替(下同)。例如: MOV R1, #00H MOV R2, #00H MOV PMR, #PMRNORMAL MOV DPS, #FLAGDPTR MOV DPTR, #ADDREEPROM read1kloop: read1kpage: INC R1 MOVX A, @DPTR MOV SBUF, A JNB TI, $ CLR TI INC DPTR CJNE R1, #20H, read1kpage INC R2 MOV R1, #00H CPL WDI CJNE R2, #20H, read1kloop ;END OF EEPROM 规则2

汇编语言完整题库

一.名词解释(本大题共5小题,每小题3分,共15分)试解释下列名词的含义。 1.逻辑地址 2.物理地址 3.标志寄存器 4.存储器寻址方式 5.补码 二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。 1.将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少? 2.假设(DS)=0B00H,(BX)=0210H,对于指令MOV DS:120H[BX],AL,其目的操作数的物理地址为多少? 3.假设(BX)=0210H,(DI)=0060H,对于指令ADD DL,[BX][DI],其源操作数的偏移量为多少? 4.假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=? 5.对于一个十进制数– 65,其二进制补码表示形式为多少? 三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。 1.PUSH 5588H 2.MOV DS,1720H 3.ADD AX,CL 4.AND AX,[DX] 四.程序分析题(本大题共6小题,每小题5分,共30分)每小题列出了一段小的程序片段和相关存储单元的初始值,请按题目的要求分析各程序片段的运行结果。(寄存器中的内容请使用十六进制形式给出) 1.阅读如下程序片段 MOV AL,4CH MOV BL,0B5H ADD AL,BL 执行上述程序片段后,(AL)= ,(BL)= , CF= ,OF= ,PF= . 2.阅读如下程序片段 MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH 执行上述程序片段后,(AL)= ,(AF)= ,CF= ,OF= ,PF= . 3.阅读如下程序片段 MOV AL,7EH MOV CL,04H ROL AL,CL 执行上述程序片段后,(AL)= ,(CL)= , CF= ,OF= . 4.阅读如下程序片段 MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX 执行上述程序片段后,(AX)= ,(CF)= , OF= . 5.阅读如下程序片段,假设(DS)=0100H,字节单元(01024H)=56H,字节单元(01025H)=28H MOV BX,0024H LEA BX,[BX] OR BX,0 ADC BX,[BX] 执行上述程序片段后,(BX)= ,(CF)= , OF= . 6.阅读如下程序片段,假设(SP)=0064H MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POP CX POP BX 执行上述程序片段后,(AX)= ,(BX)= , (SP)= , 五.程序设计题(本大题共2小题,第一小题7分,第二小题8分,共15分) 1.试编写一程序片段,实现BL高4位与低4位相互交换(7分) 2.试编写一程序片段,不使用乘除法指令,实现((AX)*5+14)/ 2的功能(AX中的数据理解为补码)(8分)

JAVA冒泡排序从小到大和从大到小详细过程

JA V A冒泡排序从小到大和从大到小详细过程 1.从小到大的冒泡排序 for(int i=0;ia[j+1])//如果前一位大于后一位,则交换,大的数排在后面 { int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } int a[]={6,4,5,7,3} 6 4 5 7 3 (1)i<4,j<4 i=0 (第一趟,5个数两两比较4次,可确定一个最大数,剩4个数) j=0 则排序后为:4 6 5 7 3 j=1 则排序后为:4 5 6 7 3 j=2 则排序后为:4 5 6 7 3 j=3 则排序后为:4 5 6 37 (2)i<4,j<3 i=1 (第二趟,4个数两两比较3次,可确定一个最大数,剩3个数) j=0 则排序后为:4 5 6 3 7 j=1 则排序后为:4 5 6 3 7 j=2 则排序后为:4 5 3 6 7 (3)i<4,j<2 i=2 (第三趟,3个数两两比较2次,可确定一个最大数,剩2个数) j=0 则排序后为:4 5 3 6 7 j=1 则排序后为:4 3 5 6 7 (4)i<4,j<1 i=3 (第四趟,2个数两两比较1次,可确定一个最大数,剩1个数,为最小数) j=0 则排序后为:3 4 5 6 7

2.从大到小的冒泡排序 for(int i=0;i

史上最牛最完整的汇编语言冒泡排序程序

;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。 ;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。 ;程序代码M_DIRECT MACRO STRING ;定义一个宏,调用09 号 DoS功能在屏幕上显示一个字符串 MoV DX,oFFSET AH,O9 21H STRING MoV INT ENDM DATA SEGMENT DIR1 DB 'count of numbers to sort:$ ' ;提示输入要排序的数据的个数 DIR2 DB 'please input sorting numbers:$ '; 提示输入要排序的数据 DIR3 DB 'sorting result:$ ' ;在屏幕上提示排好续的数据 DIR4 DB '*************************$ ' DIR5 DB 'please choose u(up)ord(down):$ ' DIR6 DB 'input error$ ' CoUNT = 1OO WTEMP DW ? ARRAY DW CoUNT DUP(?) ;用来保存输入的数据 CRLF DB 13,1O, '$ ' ;实现回车换行的功能,13→ODH,回车;10→OAH,换行 LEN DW ;保存实际输入的数据的个数 DATA ENDS CoDE SEGMENT MAIN PRoC FAR ASSUME CS:CoDE,DS:DATA START: PUSH DS SUB AX,AX PUSH ;置AX 为O AX

MOV AX,DATA ;将数据段的地址送到DX 中 MOV DS,AX READ: M_DIRECT DIR1 ; 宏调用,在屏幕上提示输入要输入的数据的个数 CALL P_GETNEW ;调用子程序P-GETNEW输入要输入的数据的个 数 MOV CX,AX MOV LEN,AX LEA BX,ARRAY MOV AH,09 ; 调用09 号功能,实现回车换行 LEA DX,CRLF INT 21H ;屏幕提示输入要排序的数据 M_DIRECT DIR2 GETNUMBER: CALL P_GETNEW ; 输入数据并保存到ARRA 丫中 MOV [BX],AX ADD BX ,2 LOOP GETNUMBER CX,LEN SORT: ; 排序程序部分 MOV DEC CX MOV AH,09H LEA DX,CRLF INT 21H M_DIRECT DIR5 COMPARE:MOV AH,01H INT 21H CMP AL, 'U' ;判断是升序排序还是降序排序 JZ

用汇编语言冒泡排序经典程序

data segment A dw 03h, 0dh, 08h, 1dh, 20h, 0fdh ;两个字节保存一个值,对应十进制的3,13,8,29,32,253 data ends code segment main proc far assume cs:code, ds:data start: push ds sub ax, ax ;ax寄存器清零 push ax mov ax, data mov ds, ax mov cx, 7 dec cx ;减1指令 loop1: ;cx=cx-1若cx!=0则继续循环 mov di, cx ;把CX寄存器的值传送到以DS寄存器(默认是DS寄存器)的内容为段值有效地址为DI 的存储单元中 mov bx, 0 loop2: mov ax, a[bx] ;把第bx个数传给ax寄存器 cmp ax, a[bx+2] ;比较第bx个数和第bx+2个数????? jle continue ;jle:小于等于则跳转,否则执行下句 xchg ax, a[bx+2] ;否则两比较数交换位置 mov a[bx], ax continue: add bx, 2 loop loop2 mov cx, di loop loop1 mov cx, 7 mov bx, 0 next: mov ax, [bx] push cx call show pop cx mov ah, 2

mov dl, ' ' int 21h add bx, 2 loop next ret main endp show: ; 显示ax里的值 mov cx, 10 cmp ax, 0 jle done div cl ;除法:被除数在DX,AX中,除数在cl中 push ax xor ah, ah ;xor实现两个操作数按位‘异或’运算,结果送至目的操作数中 call show pop dx mov dl, dh or dl, 30h ;或运算 mov ah, 2 int 21h done: ret code ends end start

冒泡排序教学设计

3.2.2冒泡排序教学设计 一、教材分析 本节内容选自浙江教育出版社《算法与程序设计》第二章第三节和第五章第三节。以第二章内容为主,下节课让学生进行第五章编写程序及上机实践。 《课程标准》指出《算法与程序设计》模块教学主要目的是“使学生进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;能从简单问题出发,设计解决问题的算法,并能初步使用一种程序设计语言编制程序实现算法解决问题。”冒泡排序的算法及程序实现就很好地较全面地体现了这点。 排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法。它的学习同时为后面的选择排序做了铺垫。通过冒泡实例的学习,可以提高学生的程序设计能力,为今后在算法与程序设计方面的进一步研究和学习打下基础。 二、学情分析 通过前面的学习,同学们已经初步了解了算法设计的基本知识,学会了利用自然语言和流程图描述解决问题的算法,对排序中碰到的循环结构的流程图和循环语句以及数组变量的使用方法都已有基础。但由于实践比较少,对以前知识的遗忘率比较高,画流程图还不太熟练,程序设计思想比较弱。因此由浅入深,逐步引导比较适合学生的口味。 三、教学目标 知识目标:掌握冒泡排序的原理;理解冒泡排序的流程图;编写冒泡排序的主要代码; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,体会程序设计在现实中的作用; 情感目标:培养学生分析问题、发现规律的能力,激发学生学习热情;培养良好的程序书写习惯; 四、重点难点 重点:理解冒泡排序原理及它的流程图 难点:理解冒泡排序中的遍、次等概念(即对变量使用的理解) 五、课前准备 教师的教学准备:冒泡排序的课件

汇编语言实现冒泡排序(一)

;用汇编语言实现实现冒泡排序,并将排序后的数输出 DATAS SEGMENT A dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N=$-A ;计算数字所占的字节数 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS MOV DS,AX MOV SI,0 ;SI遍历数字;前一个数的地址 MOV CX,N/2-1 ;设置循环次数,M(M=N/2)个数需要,循环M-1次 CALL BUBBLE ;调用BUBBLE将原来的数排序 ;输出排序后的数 MOV CX,N/2 ;循环M次输出排序后的M个数 MOV SI,0 ;SI遍历排序后的数 MOV DI,0 ;用DI记录数字的位数 MOV BP,N+5 ;BP用于遍历存储的转化后的字符的位置 SHOW: PUSH CX ;循环次数入栈 MOV DX,0 ;由于将要进行16位除需要置高16位为0 MOV AX,[SI] ;低16位为排序后的数 CALL DTOC ;调用DTOC将十进制数转换为字符串 CALL SHOW_STR ;调用SHOW_STR将一个数转化得到的字符串输出ADD SI,2 ;下一个数 POP CX ;循环次数出栈栈 LOOP SHOW MOV AH,4CH INT 21H ;冒泡排序 BUBBLE PROC L1: PUSH CX ;将循环次数入栈 LEA SI,A ;SI遍历DATAS数据段的数字 L2: MOV AX,A[SI] ;将前一个数存于AX CMP AX,A[SI+2] ;比较前后两个数 JBE NEXT ;如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,A[SI+2] ;否则,交换前后两个数的位置 MOV A[SI],AX NEXT:ADD SI,2 ;下一个数 LOOP L2 ;注意内层循环的次数已经确定了 POP CX ;将循环次数出栈 LOOP L1 ;下一轮比较 RET BUBBLE ENDP

冒泡排序算法详解

冒泡排序算法详解 单向冒泡排序算法 1、从上向下冒泡的冒泡排序的基本思想是: (1)首先将第一个记录的关键字和第二个记录的关键字进行比较,若为“逆序”(即L.r[1].key>L.r[2].key),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录的关键字和第n个记录的关键字比较过为止。这是第一趟冒泡排序,其结果是使得关键字最大的记录被安置到最后一个记录的位置上; (2)然后进行第二趟冒泡排序,对前面的n-1个记录进行同样的操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置; 一般地,第i趟冒泡排序是从L.r[1]到L.r[n-i+1]依次比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。整个排序过程需要进行K(1≤kr[j+1]) { flag=1; temp=r[j];r[j]=r[j+1];r[j+1]=temp; } i++; } } 2、从下向上冒泡的冒泡排序的基本思想是: (1)首先将第n-1个记录的关键字和第n个记录的关键字进行比较,若为“逆序”(即L.r[n].key=i+1;j--)

相关文档
相关文档 最新文档