计算机编程输入3个数排序,汇编语言 输入10个数排序并输出的实现
一:题目描述
在键盘输入任意10个数
按从小到大排序后,在计算机屏幕上先输出来。要有结果提示(字符串显示)。
将10个数做累加,结果在计算机屏幕显示累加和。
二:伪指令的定义
1.数据段
ATAS SEGMENT
string_1 DB 'Please input a numbers(0-65536):','$'
string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
string_3 DB 'The array you have input is:',0ah,0dh,'$'
string_4 DB 'After Sort the num is:',0ah,0dh,'$'
string_5 DB ' ','$'
DATA DW 10 DUP(?)
massege DB 'The sum of the array is: ',0ah,0DH,'$'
DATAS ENDS
说明:
string_1
输入范围提示
string_2
输入错误提示
string_3
输出原数组提示
string_4
输出排序后数组提示
string_5
空格符
DATA
缓冲区数组
2.堆栈段
STACKS SEGMENT
DW 256 dup(?)
STACKS ENDS
3.代码段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
三:模块分解与实现
1. DOS输入10个数字
输入10个无符号数存入缓冲区,并且保证 num<65536num < 65536num<65536
为何输入范围是65536呢 一个字的最大表示范围是 FFFFFFFFFFFF 其在十进制的表示下为 65535
HEX
FFFF
DEC
65535
BIN
1111 1111 1111 1111
1.1 输入函数子程序
;---------输入函数(单数字输入)------------
Input PROC Near
push AX
push BX
push CX
push DX
;---------输入提示--------------
MOV BX, 0
CLC
MOV DX, 0
;----------输入数字--------------
Lp_0:
MOV AH, 1
INT 21H
CMP AL, 20H ;回车
JE L_CRLF
;----- x belong to [0,9] ----------
SUB AL, 30H ; ASCII -> int
JL L_ERROR
CMP AL, 9
JG L_ERROR
;------- string -> int -----------
MOV AH, 0 ;将 AL扩展成 AX
XCHG AX, BX ;保护 AX值
MOV CX, 10
MUL CX ; bx *= 10
ADD AX , BX
JC L_ERROR ; OVERFLOW处理
XCHG AX, BX
JMP Lp_0
L_ERROR:
MOV DX, 0
MOV BX, 0
CALL CRLF ; 换行
CALL ERROR ; 输出错误提示
JMP Lp_0
L_CRLF: ; 以换行作为一个数的结束标志
MOV DX, 0
MOV DATA[SI], BX ;
POP DX
POP CX
POP BX
POP AX
RET
Input ENDP
解析函数功能:
本质类似于高精度计算,将读入的一个串转成数字存储在DATA数组中
分成三大部分
一: 输入提示
二: 错误判断及提示
三: 转化为数字
L_ERROR 错误处理
L_CRLF 结束处理
我们来举一个123412341234 的例子
Register
1
2
3
4
AX
1
2
3
4
BX
0
1
12
123
CX
10
10
10
10
AX+(BX∗CX)AX + (BX * CX)AX+(BX∗CX)
最后将结果存储在DATA数组里
2.实现冒泡排序
冒泡排序作为一个简单的排序算法,时间复杂度 O(n2)O(n^2)O(n2) 需要两层循环,为了提高代码的可读性,我们将内层的循环写成一个子程序每次调用
内层循环很简单,每次从头比到尾,遇到比它小的交换就可以了。因为是字操作数,所以循环的下标到18为结束条件。
;---------Bubble_sort--------------------
Bubble_sort PROC NEAR
PUSH BX
PUSH DX
MOV SI,DI
LOOP1:
ADD SI,2
MOV BX,DATA[DI]
CMP BX,DATA[SI]
JA SWAP
JMP NEXT
SWAP:
MOV DX,DATA[SI]
MOV DATA[DI],DX
MOV DATA[SI],BX
NEXT:
CMP SI,18
JL LOOP1
POP DX
POP BX
RET
Bubble_sort ENDP
外层调用:每次DI+2DI + 2DI+2
;----------Sort-----------
MOV CX, 9
MOV DI, 0
FOR1:
CALL Bubble_sort
ADD DI, 2
LOOP FOR1
3.DOS输出到屏幕
CALL CRLF
MOV DX, OFFSET string_4 ;'After Sort the num is:'
MOV AH, 9
INT 21H
MOV CX, 10
MOV DI, 0
FOR2:
CALL Print
CALL Space
ADD DI , 2
LOOP FOR2
CALL CRLF
输出DATA内的数字,每次输出一个数字然后在输出一个空格
Print函数:
利用DIV函数的特点——每次除10的商放在AX, 余数放入DX
并利用栈的 FILO(First in Last Out)的特点
依旧以1234的例子来看一下是怎么处理的
DATA[Num]
1234
123
12
1
DX
4
3
2
1
Stack(PUSH DX)
4
4,3
4,3,2
4,3,2,1
Print(POP DX)
4
34
234
1234
DATA[Num]/10DATA[Num] / 10DATA[Num]/10 的余数存入DX
Print PROC Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 0
MOV BX, 10
MOV AX, DATA[DI]
LAST:
MOV DX, 0
DIV BX ; DIV商放AX,余数放入DX
PUSH DX
INC CX
CMP AX, 0
JNZ LAST
AGE:
POP DX
OR DX, 30H
MOV AH, 2
INT 21H
LOOP AGE
POP DX
POP CX
POP BX
POP AX
RET
Print ENDP
4.求累加和全部累加到DATA[0]DATA[0]DATA[0] 上直接调用 Print 函数,因为Print函数是针对DATA数组设计的,所以把最后的结果存入DATA数组中不需要额外的输出函数。
;-------SUM-------------
Get_sum PROC NEAR
PUSH BX
PUSH CX
MOV BX, 0
MOV CX , 9
MOV DI, 2
LOP1:
MOV BX, DATA[0]
ADD BX, DATA[DI]
MOV DATA[0], BX
ADD DI , 2
LOOP LOP1
POP CX
POP BX
RET
Get_sum ENDP
5.其他函数
;----换行子函数(一个数输入完毕)-------
CRLF PROC Near
push AX
push DX
MOV DL, 0ah
MOV AH, 2
INT 21H
pop DX
pop AX
RET
CRLF ENDP
;---------空格-----------
Space PROC Near
push AX
push DX
MOV DX, OFFSET string_5 ;' '
MOV AH, 9
INT 21H
pop DX
pop AX
RET
Space ENDP
;----------错误提示-------------
ERROR PROC Near
push BX
push DX
MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again:
MOV AH, 9
INT 21H
pop DX
pop BX
RET
ERROR ENDP
四:流程图
1. 总体流程图
2. 子程序流程图
2.1 Input
2.2 Print
2.3 Bubble_Sort
2.4 Get_Sum
五:代码与运行截图
1,完整版代码(在MASM运行通过)
;-----数据段------------
DATAS SEGMENT
string_1 DB 'Please input 10 numbers(0-65536):','$'
string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
string_3 DB 'The array you have input is:',0ah,0dh,'$'
string_4 DB 'After Sort the num is:',0ah,0dh,'$'
string_5 DB ' ','$'
DATA DW 10 DUP(?)
massege DB 'The sum of the array is: ',0ah,0DH,'$'
DATAS ENDS
;-----堆栈段------------
STACKS SEGMENT
DW 256 dup(?)
STACKS ENDS
;-----代码段------------
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;-----------程序开始------------
START:
MOV AX,DATAS
MOV DS,AX
MOV SI, 0 ;指针初始化
MOV CX, 10 ;循环次数
;---------Input----------
MOV DX, OFFSET string_1 ;Please input 10 numbers(0-65536)
MOV AH, 9
INT 21H
Lp:
CALL Input
ADD SI, 2
Loop Lp
;--------结束输入,换行---------------
CALL CRLF
MOV DX, OFFSET string_3 ;'The array you have input is:'
MOV AH, 9 ;首地址 DS:DX
INT 21H
;-------输出 ----------------
MOV CX, 10
MOV DI, 0
Again:
CALL Print
CALL Space
ADD DI , 2
Loop Again
;/******************************/
;----------Sort-----------
MOV CX, 9
MOV DI, 0
FOR1:
CALL Sort
ADD DI, 2
LOOP FOR1
CALL CRLF
MOV DX, OFFSET string_4 ;'After Sort the num is:'
MOV AH, 9
INT 21H
MOV CX, 10
MOV DI, 0
FOR2:
CALL Print
CALL Space
ADD DI , 2
LOOP FOR2
CALL CRLF
;-------求和输出---------------------
MOV DX, OFFSET massege;
MOV AH, 9
INT 21H
CALL Get_sum
MOV DI, 0
CALL Print
EXIT:
MOV AH, 4CH
INT 21H
;/************子程序调用****************/
;---------输入函数(单数字输入)------------
Input PROC Near
push AX
push BX
push CX
push DX
MOV BX, 0
CLC
MOV DX, 0
;----------输入数字--------------
Lp_0:
MOV AH, 1
INT 21H
CMP AL, 20H ;空格
JE L_CRLF
;----- x belong to [0,9] ----------
SUB AL, 30H ; ASCII -> int
JL L_ERROR
CMP AL, 9
JG L_ERROR
;------- string -> int -----------
MOV AH, 0 ;将 AL扩展成 AX
XCHG AX, BX ;保护 AX值
MOV CX, 10
MUL CX ; bx *= 10
ADD AX , BX
JC L_ERROR ; OVERFLOW处理
XCHG AX, BX
JMP Lp_0
L_ERROR:
MOV DX, 0
MOV BX, 0
CALL CRLF ; 换行
CALL ERROR ; 输出错误提示
JMP Lp_0
L_CRLF: ; 以换行作为一个数的结束标志
MOV DX, 0
MOV DATA[SI], BX ;
POP DX
POP CX
POP BX
POP AX
RET
Input ENDP
;----换行子函数(一个数输入完毕)-------
CRLF PROC Near
push AX
push DX
MOV DL, 0ah
MOV AH, 2
INT 21H
pop DX
pop AX
RET
CRLF ENDP
;---------空格-----------
Space PROC Near
push AX
push DX
MOV DX, OFFSET string_5 ;' '
MOV AH, 9
INT 21H
pop DX
pop AX
RET
Space ENDP
;----------错误提示-------------
ERROR PROC Near
push BX
push DX
MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again:
MOV AH, 9
INT 21H
pop DX
pop BX
RET
ERROR ENDP
;---------输出函数(单数字输出)-------------
Print PROC Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX, 0
MOV BX, 10
MOV AX, DATA[DI]
LAST:
MOV DX, 0
DIV BX ; DIV商放AX,余数放入DX
PUSH DX
INC CX
CMP AX, 0
JNZ LAST
AGE:
POP DX
OR DX, 30H
MOV AH, 2
INT 21H
LOOP AGE
POP DX
POP CX
POP BX
POP AX
RET
Print ENDP
;---------SORT---------------------
SORT PROC NEAR
PUSH BX
PUSH DX
MOV SI,DI
LOOP1:
ADD SI,2
MOV BX,DATA[DI]
CMP BX,DATA[SI]
JA CHANGE
JMP NEXT
CHANGE:
MOV DX,DATA[SI]
MOV DATA[DI],DX
MOV DATA[SI],BX
NEXT:
CMP SI,18
JL LOOP1
POP DX
POP BX
RET
SORT ENDP
;-------SUM-------------
Get_sum PROC NEAR
PUSH BX
PUSH CX
MOV BX, 0
MOV CX , 9
MOV DI, 2
LOP1:
MOV BX, DATA[0]
ADD BX, DATA[DI]
MOV DATA[0], BX
ADD DI , 2
LOOP LOP1
POP CX
POP BX
RET
Get_sum ENDP
CODES ENDS
END START
2. 正确运行时截图
3. 错误输入时截图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
计算机编程输入3个数排序,汇编语言 输入10个数排序并输出的实现相关推荐
- PHP 找出数值数组中不重复最大的10个数和最小的10个数
2019独角兽企业重金招聘Python工程师标准>>> //随机生成数值数组 for($i=0;$i<10000;$i++){$ary[]=rand(1,100000); } ...
- LeetCode 912. 排序数组(10种排序)
文章目录 1. 题目 2. 解题 2.1 插入排序 2.2 冒泡排序 2.3 选择排序 2.4 希尔排序 2.5 归并排序 2.6 快速排序 2.7 堆排序 2.8 计数排序 2.9 桶排序 2.10 ...
- c语言中3%3e2%3e1的值,计算机编程基础
1 . C语言源程序中主函数名是( ) A.masterB.leadingC.mainD.major2 . 下列程序的运行结果是()#include A.4,0,7B.5,-1,7C.4,0,5D.5 ...
- c语言文件归并问题_C语言 | 选择法对10个数排序
例60:C语言实现用选择法对10个整数排序. 解析:选择排序思路如下,设有10个元素a[1]~a[10],将a[1]与a[2]~a[10],若a[1]比a[2]~a[10]都小,则不进行交换,即无任何 ...
- java代码--------随机输出100个随机数,要求每行10个数
总结:不敢爱你么开口 package com.sads;///实现随机输出100个数字,数字是0到9之间,每行输出10个 public class Wss {public static void ma ...
- python输入一个英文句子、统计单词个数_C语言编程求一个英文句子中的单词数和最长单词的位置、长度及输出这个单词。c++编程 从键盘输入一个英文...
C语言编程求一个英文句子中的单词数和最长单词的位置.长度及输出这个单词. c++编程 从键盘输入一个英文 www.zhiqu.org 时间: 2020-11-23 我刚做了一关于英文句子里面每 ...
- c语言中输入大数,如何使用C语言实现输入10个数按从大到小的顺序排序输出
本文主要向大家介绍了如何使用C语言实现输入10个数按从大到小的顺序排序输出,通过具体的内容向大家展示,希望对大家学习C语言有所帮助. 用选择排序法编写c语言,实现从键盘上输入10个数,按从大到小的顺序 ...
- c语言找出最大值和最小值并按降序排输出,C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列...
问题标题 C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列 2019-6-4来自ip:14.161.145.86的网友咨询 浏览量:562 手机版 问题补充: C语言用排序法给十个 ...
- Java练习——输入n个数,存入数组,进行排序输出
题目:输入n个数,存入数组,进行排序输出 package paixu; import java.util.Scanner; public class paixu {public static void ...
最新文章
- windowsnbsp;下搭建apachenbsp;phpnbsp;mysqlnbsp;p…
- 以mips为单位衡量微型计算机的性能,2016计算机二级《MS Office》选择题专项训练...
- elasticsearch5安装和elasticsearch-analysis-ik中文分词插件安装
- 一个配置web.xml的编程方法
- 简易的文件上传 tp5
- mybatis报错:org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC
- linux2T硬盘分区命令,linux挂载大于2T硬盘的分区办法(同样适用于路由器系统)...
- C#开发自动照片(图片)裁剪(缩放)工具
- 《朗读者》读后感作文3100字
- PS关于打开图片或者直接拖入图片结果显示程序错误
- 三类6种地图可视化软件测评,最好用的工具居然是它
- Mac系统如何开启任何来源
- 艾默生质量流量计传感器安装
- 尚学堂JAVA第六章作业答案参考
- 计算机网络分层及其作用
- SRPG游戏开发(四)第三章 绘制地图 - 一 导入素材
- 对拷的硬盘无法修改计算机名,如何实现硬盘对拷?两台电脑硬盘对拷资料详细图解(非GHOST式)(2)...
- 网优谷带你盘一盘重构IT基础架构的“七种武器”!
- Java - 读取Excel并转CSV格式
- springboot整合canal,监听MySQL binlog日志,实现增量同步
热门文章
- 启动Spark出现Operation category READ is not supported in state standby
- Mac : PS1变量不生效了
- 使用eclipse遇到的unable to install breakpoint的问题
- android flutter mac,android flutter mac 开发环境变量配置
- g30u盘启动 中科曙光1620_I840-G30
- DOCKER-COMPOSE搭建MONGODB分片集群(单机版)
- 程序设计与算法----分治之归并排序
- 贪婪模式与非贪婪模式
- POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)
- Linux 文件与目录管理 | 菜鸟笔记收录