jzxx1044编程输入10个正整数,然后自动按从大到小的顺序输出

本文详细介绍了使用C++实现从大到小排序10个正整数的方法,通过具体示例代码展示了如何利用标准库中的sort函数配合自定义比较函数进行降序排列,适合初学者实践和理解排序算法。

题目描述
编程输入10个正整数,然后自动按从大到小的顺序输出。

输入
输入只有一行,包括10整数.

输出
输出只有一行,包括10个整数。

样例输入
1 2 3 4 5 7 6 8 9 10
样例输出
10 9 8 7 6 5 4 3 2 1

满分代码:
#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int a,int b) {
	return a>b;
}
int main() {
	int i,a[20],n=10;
	for(i=0; i<n; i++)scanf("%d",&a[i]);
	sort(a,a+n,cmp);
	for(i=0; i<n-1; i++)printf("%d ",a[i]);
	printf("%d\n",a[n-1]);
	return 0;
}
经典的C资源,很全面详细 对于初学者来说,太重要了! 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数小 005 字符的输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字游戏 011 模拟ATM(自动柜员机)界面 012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较整数小 023 指向数组的指针 024 寻找指定元素的指针 025 寻找相同元素的指针 026 阿拉伯数字转换为罗马数字 027 字符替换 028 从键盘读入实数 029 字符行排版 030 字符排列 031 判断字符串是否回文 032 通讯录的输入输出 033 扑克牌的结构表示 034 用“结构”统计学生成绩 035 报数游戏 036 模拟社会关系 037 统计文件的字符数 038 同时显示两个文件的内容 039 简单的文本编辑器 040 文件的字数统计程序 041 学生成绩管理程序 第二部分 数据结构篇 042 插入排序 043 希尔排序 044 冒泡排序 045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置 057 运动会分数统计 058 双链表 059 约瑟夫环 060 记录个人资料 061 二叉树遍利 062 浮点数转换为字符串 063 汉诺塔问题 064 哈夫曼编码 065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译 072 火车车厢重排 073 队列实例 074 K阶斐波那契序列 第三部分 数值计算与趣味数学篇 075 绘制余弦曲线和直线的迭加 076 计算高次方数的尾数 077 打鱼还是晒网 078 怎样存钱以获取最利息 079 阿姆斯特朗数 080 亲密数 081 自守数 082 具有abcd=(ab+cd)2性质的数 083 验证歌德巴赫猜想 084 素数幻方 085 百钱百鸡问题 086 爱因斯坦的数学题 087 三色球问题 088 马克思手稿中的数学题 089 配对新郎和新娘 090 约瑟夫问题 091 邮票组合 092 分糖果 093 波瓦松的分酒趣题 094 求π的近似值 095 奇数平方的有趣性质 096 角谷猜想 097 四方定理 098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 109 复平面作图 110 绘制彩色抛物线 111 绘制正态分布曲线 112 求解非线性方程 113 实矩阵乘法运算 114 求解线性方程 115 n阶方阵求逆 116 复矩阵乘法 117 求定积分 118 求满足特异条件的数列 119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 129 飘带图案 130 圆环图案 131 肾形图案 132 心脏形图案 133 渔网图案 134 沙丘图案 135 设置图形方式下的文本类型 136 绘制正多边形 137 正六边形螺旋图案 138 正方形螺旋拼块图案 139 图形法绘制圆 140 递归法绘制三角形图案 141 图形法绘制椭圆 142 抛物样条曲线 143 Mandelbrot分形图案 144 绘制布朗运动曲线 145 艺术清屏 146 矩形区域的颜色填充 147 VGA256色模式编程 148 绘制蓝天图案 149 屏幕检测程序 150 运动的小车动画 151 动态显示位图 152 利用图形页实现动画 153 图形时钟 154 音乐动画 第五部分 系统篇 155 读取DOS系统中的国家信息 156 修改环境变量 157 显示系统文件表 158 显示目录内容 159 读取磁盘文件 160 删除目录树 161 定义文本模式 162 设计立体窗口 163 彩色弹出菜单 164 读取CMOS信息 165 获取BIOS设备列表 166 锁住硬盘 167 备份/恢复硬盘分区表 168 设计口令程序 169 程序自我保护 第六部分 常见试题解答篇 170 水果拼盘 171 小孩吃梨 172 删除字符串中的特定字符 173 求解符号方程 174 计算标准差 175 求取符合特定要求的素数 176 统计符合特定条件的数 177 字符串倒置 178 部分排序 179 产品销售记录处理 180 特定要求的字符编码 181 求解三角方程 182 新完全平方数 183 三重回文数 184 奇数方差 185 统计选票 186 同时整除 187 字符左右排序 188 符号算式求解 189 数字移位 190 统计最高成绩 191 比较字符串长度 192 合并整数 193 矩阵逆置 194 删除指定的字符 195 括号匹配 196 字符串逆置 197 SIX/NINE问题 198 单词个数统计 199 方差运算 200 级数运算 201 输出素数 202 素数题 203 序列排序 204 整数各位数字排序 205 字符串字母移位 206 Fibonacc数列 第七部分 游戏篇 207 商人过河游戏 208 吃数游戏 209 解救人质游戏 210 打字训练游戏 211 双人竞走游戏 212 迷宫探险游戏 213 迷你撞球游戏 214 模拟扫雷游戏 215 推箱子游戏 216 五子棋游戏 第八部分 综合实例篇 217 综合CAD系统 218 功能强的文本编辑器 219 图书管理系统 220 进销存管理系统
<think>好的,我现在需要帮用户写一个8086汇编程序,实现输入10个带符号的十进制数,然后按从到小排序并输出。首先,我得理清楚整个程序的流程和各个步骤需要解决的问题。 首先,输入部分。用户要输入带符号的数,所以需要考虑正负号的处理。每个数可能以'+'或'-'开头,或者没有符号(默认为正)。8086汇编中,输入通常使用DOS中断21h的功能0Ah,这个功能可以读取字符串到缓冲区。然后需要将字符串转换为二进制补码形式存储。这里要注意的是,输入的每个数字可能有不同的位数,需要逐个字符处理,转换时要处理符号位,然后转换每一位数字,直到遇到回车结束。 接下来是转换过程。字符串转二进制需要考虑符号,如果是负数,转换完成后要取补码。例如,输入“-123”,先转换123为二进制,然后取反加一。转换过程中,每一位数字要乘以相应的权值(比如十位、百位等),可能需要循环处理每个字符。 然后排序部分。用户要求从到小排序,所以需要实现一个排序算法。考虑到汇编中的效率,可能使用冒泡排序或者选择排序。冒泡排序虽然效率不高,但实现起来相对简单,适合小数据量。这里10个数,用冒泡排序应该没问题。排序时需要比较两个数的小,可能需要交换位置,这里需要注意带符号数的比较,应该使用带符号的跳转指令,比如jg(jump if greater)而不是ja(jump if above)。 然后是转换回十进制字符串并输出。排序后的二进制数需要转换回带符号的十进制字符串,以便输出。这里同样需要处理负数的情况,如果是负数,先转换绝对值为字符串,然后在前面加上'-'号。转换过程中,需要将二进制数分解为各位数字,比如通过除以10取余数的方法,逆序得到各位数字,然后存储到输出缓冲区中。 接下来需要考虑数据存储的问题。输入10个数需要存储在内存中,可能使用一个字(16位)来存储每个数的二进制补码形式。因此,需要定义一个数组,比如num_array dw 10 dup(?)。输入缓冲区需要足够,每个数可能的最位数,比如5位(包括符号),所以每个输入缓冲区可能需要6字节(5位+回车)。或者,可能每个数的输入单独处理,每次输入一个数,转换后存储到数组中。 另外,输入时可能需要逐个输入每个数,提示用户输入,比如显示“请输入第1个数:”之类的提示信息,但用户的需求中没有提到需要提示,可能只需要直接输入10个数,每个数以回车结束。或者,可能用户希望一次输入全部10个数,用空格或逗号分隔?但通常来说,DOS功能0Ah读取的是以回车结束的一行输入,所以可能需要用户逐个输入每个数,每次输入一个数后按回车。 因此,程序的致流程可能是: 1. 循环10次,每次读取一个数的字符串,转换为二进制补码,存储到数组中。 2. 对数组进行排序(降序)。 3. 循环将数组中的每个数转换为十进制字符串,并输出到屏幕。 现在需要解决各个步骤的具体实现问题。 首先,输入和转换部分。如何将字符串转换为二进制数?例如,输入字符串可能是“+123”、“-45”、“678”等。处理步骤: - 读取字符串,检查第一个字符是否是符号(+或-),如果是,记录符号,然后处理后面的数字字符。 - 如果没有符号,默认是正号,处理所有数字字符。 - 将数字字符转换为数值,比如字符'0'到'9'对应的数值是0到9。 - 累加这些数值,每次乘以10,再加上当前位的值。 - 最后根据符号位,如果是负数,取补码。 例如,字符串“-123”的处理: 1. 符号位是'-',符号标志设为-1。 2. 数字部分是1,2,3,转换为数值123。 3. 乘以符号标志,得到-123,然后转换为二进制补码形式(16位的话,即0xFF85)。 需要注意的是,转换过程中可能会溢出,比如输入的数超过16位有符号数的范围(-32768到32767)。因此,在转换时需要检查是否超出范围,但用户可能假设输入的数都是有效的,所以可能不需要处理溢出,或者可以添加错误处理。 接下来,编写转换子程序。子程序需要接收字符串的地址,返回一个16位的二进制数。例如,字符串缓冲区结构:第一个字节是最长度,第二个字节是实际输入的字符数,后面是字符内容,以回车(0Dh)结束。 例如,使用DOS功能0Ah,缓冲区结构: buffer db 6 ; 最多5个字符+回车 db 0 ; 实际输入的字符数 db 6 dup(0) 当用户输入“-123”加回车,buffer的内容会是05, 04, '-','1','2','3',0Dh。 转换子程序需要处理这些字符,从buffer+2开始,到buffer+2+实际长度-1的位置(因为最后一个字符是0Dh?或者实际输入的长度是否包括回车?需要确认。DOS的0Ah功能读取的字符串以回车结束,回车符会被包含在输入缓冲区中,所以实际输入的字符数是用户输入的字符数(不包括回车),例如,用户输入“123”后按回车,实际输入字符数是3,回车符是第四个字符,存在缓冲区中。因此,转换子程序需要从buffer+2开始,到buffer+2 + 实际长度(buffer+1的值)的位置,但不包括回车符。例如,实际长度是n,则有效字符是buffer+2到buffer+2 + n -1,最后一个字符是回车,需要忽略。 因此,转换子程序的处理步骤: 1. 初始化符号为+1,结果寄存器为0。 2. 检查第一个字符是否是符号,如果是'+'或'-',则处理符号,并移动指针到下一个字符。 3. 对于每个后续字符,直到回车,转换为数值,并累加:result = result * 10 + (current_char - '0')。 4. 检查是否超出16位有符号数的范围。比如,如果累积的数值超过32767,并且在符号为正的情况下,或者超过32768在符号为负的情况下(因为-32768是允许的)。 5. 最后,根据符号调整结果,如果是负数,取补码(neg指令)。 例如,处理“-123”: 符号是-1,数字部分是123,结果是123 * (-1) = -123,转换为补码即0xFF85。 现在,在汇编中实现这个转换可能需要循环处理每个字符,使用寄存器来保存中间结果,比如用AX来保存当前值,CX作为循环计数器,SI指向当前字符。 然后是排序部分。冒泡排序的实现: 外层循环控制遍历次数,内层循环比较相邻元素,如果顺序不对则交换。因为要降序排序,所以如果当前元素小于下一个元素,则交换。 比较两个带符号数,使用cmp指令,然后使用jg(jump if greater)来判断是否需要交换。例如: mov ax, [di] cmp ax, [di+2] jl swap_them ; 如果当前元素小于下一个元素(带符号比较),则交换 交换两个元素可以通过使用临时变量或者寄存器来实现。 例如: swap_them: mov ax, [di] xchg ax, [di+2] mov [di], ax 或者使用三个mov指令: mov ax, [di] mov bx, [di+2] cmp ax, bx jge no_swap mov [di], bx mov [di+2], ax no_swap: 然后是输出部分。将二进制补码转换为十进制字符串,需要考虑符号。如果是负数,先取绝对值,转换数字部分,然后添加负号。例如,对于-123,转换为字符串“-123”。 转换方法是通过不断除以10,得到各个余数,然后将余数转换为字符,逆序存储。例如: 123 / 10 = 12 余 3 12 /10 =1 余 2 1 /10=0 余 1 所以余数依次是3,2,1,逆序得到1,2,3,即“123”。 在汇编中,可以使用循环除以10,将余数压入栈中,然后弹出生成字符。例如: 假设AX中是正数,要转换为字符串: mov cx,0 ; 计数器 convert_loop: mov dx,0 mov bx,10 div bx ; dx=余数,ax=商 add dl, '0' push dx inc cx test ax, ax jnz convert_loop 然后弹出cx次,得到字符顺序。 如果原数是负数,先neg ax得到绝对值,然后转换,并在字符串前面加'-'。 最后,将转换后的字符串通过DOS功能09h或逐个字符输出。 现在,将这些步骤整合到汇编程序中。需要考虑段设置、数据段中的缓冲区定义、代码流程等。 可能的程序结构: data segment prompt db 'Enter 10 signed numbers:', '$' num_array dw 10 dup(?) ; 存储10个数 input_buffer db 6, ?, 6 dup(?) ; 每个数的输入缓冲区 output_buffer db 6 dup(' '), '$' ; 用于转换输出的缓冲区 data ends code segment assume cs:code, ds:data start: mov ax, data mov ds, ax ; 输入10个数 mov cx, 10 mov si, offset num_array input_loop: ; 读取输入 mov dx, offset input_buffer mov ah, 0Ah int 21h ; 转换输入字符串为二进制数 call convert_str_to_num mov [si], ax ; 存储到数组 add si, 2 ; 下一个元素 loop input_loop ; 排序数组(降序) call bubble_sort ; 输出排序后的数组 mov cx, 10 mov si, offset num_array output_loop: mov ax, [si] call convert_num_to_str ; 输出字符串 mov dx, offset output_buffer mov ah, 09h int 21h add si, 2 loop output_loop ; 退出程序 mov ah, 4Ch int 21h ; 子程序:转换字符串到二进制数(AX) convert_str_to_num proc ; 实现略 convert_str_to_num endp ; 子程序:冒泡排序 bubble_sort proc ; 实现略 bubble_sort endp ; 子程序:转换二进制数到字符串(output_buffer) convert_num_to_str proc ; 实现略 convert_num_to_str endp code ends end start 现在需要具体实现各个子程序。例如,convert_str_to_num: 输入缓冲区是input_buffer,格式如前所述。处理步骤: 1. 初始化符号为1,结果寄存器为0。 2. SI指向input_buffer + 2(第一个字符)。 3. 检查第一个字符是否是符号: - 如果是'-',符号设为-1,SI递增。 - 如果是'+',SI递增。 4. 循环处理每个字符直到回车: - 字符转换为数字(减'0') - 结果 = 结果 * 10 + 数字 - 检查是否溢出(结果是否超过32767或-32768) 5. 乘以符号,转换为补码。 例如,代码可能如下: convert_str_to_num proc push bx push cx push dx push si mov si, offset input_buffer + 2 ; 指向输入字符 xor ax, ax ; 结果初始化为0 xor bx, bx ; 临时寄存器 mov bl, [si] ; 第一个字符 mov dx, 1 ; 符号,默认为正 cmp bl, '-' jne check_plus mov dx, -1 inc si jmp next_char check_plus: cmp bl, '+' jne convert_loop inc si next_char: ; 开始处理数字字符 convert_loop: mov bl, [si] cmp bl, 0Dh ; 回车符结束 je end_convert ; 检查是否是数字 cmp bl, '0' jb invalid_char cmp bl, '9' ja invalid_char ; 转换为数字 sub bl, '0' ; ax = ax * 10 + bl mov cx, ax shl ax, 1 ; ax*2 shl cx, 3 ; cx*8 add ax, cx ; ax*10 add ax, bx ; 检查溢出 cmp dx, 1 jge check_positive ; 负数允许到-32768,即AX的值在正数中可能到32768,但带符号的话,当符号为负时,AX的值不能超过32768 cmp ax, 32768 ja overflow jmp continue check_positive: cmp ax, 32767 ja overflow continue: inc si jmp convert_loop end_convert: ; 应用符号 cmp dx, -1 jne positive neg ax ; 转换为补码 positive: jmp done overflow: ; 处理溢出,这里可能简单退出或报错 invalid_char: ; 处理无效字符,可能报错 done: pop si pop dx pop cx pop bx ret convert_str_to_num endp 不过,这里可能需要更详细的错误处理,但用户可能希望程序能处理正确的输入,假设输入合法。 然后是冒泡排序的实现。例如: bubble_sort proc push ax push bx push cx push dx push si push di mov cx, 10 dec cx ; 外层循环次数为n-1 outer_loop: mov di, offset num_array mov dx, 0 ; 交换标志 mov bx, cx inner_loop: mov ax, [di] cmp ax, [di+2] jge no_swap ; 如果当前元素 >= 下一个元素,不交换 ; 交换 mov si, [di+2] mov [di+2], ax mov [di], si mov dx, 1 ; 设置交换标志 no_swap: add di, 2 dec bx jnz inner_loop test dx, dx jz sorted ; 如果本轮没有交换,提前结束 loop outer_loop sorted: pop di pop si pop dx pop cx pop bx pop ax ret bubble_sort endp 这里的外层循环次数可能不正确,应该使用固定次数,比如9次循环,或者使用一个标志优化。但为了简单,可能直接使用两层循环。 最后是转换二进制数为字符串的子程序convert_num_to_str: 例如: convert_num_to_str proc push ax push bx push cx push dx push si mov si, offset output_buffer + 5 ; 从后往前填充 mov byte ptr [si], '$' ; 结束符 dec si mov ax, [num] ; 假设num在ax中 test ax, ax jns positive_num ; 负数,转换为正数处理,并添加负号 neg ax mov bl, '-' jmp convert_digits positive_num: mov bl, '+' ; 可以不加正号 ; 不添加符号,直接处理数字 convert_digits: ; 转换ax为十进制字符串 mov cx, 10 xor dx, dx divide_loop: div cx ; ax = ax / 10, dx =余数 add dl, '0' mov [si], dl dec si xor dx, dx cmp ax, 0 jne divide_loop ; 检查是否需要添加符号 cmp bl, '-' jne done_convert mov [si], bl dec si done_convert: ; 移动字符串到输出缓冲区的起始位置 inc si ; 此时si指向字符串的开始,复制到output_buffer ; 或者调整output_buffer的构造,确保正确 ; 可能需要填充空格或其他处理 pop si pop dx pop cx pop bx pop ax ret convert_num_to_str endp 当然,这里可能需要更详细的处理,比如处理数字位数不足时填充空格,或者调整输出格式,确保正确显示。 整个程序需要处理很多细节,比如输入时的提示信息、换行处理(输出每个数后换行),但用户可能只需要简单的输入输出,不需要提示。此外,DOS中断的使用需要注意寄存器的设置,比如功能号是否正确,缓冲区地址是否正确。 在测试时,可能需要注意输入的数是否带符号,转换是否正确,排序是否正确,输出是否按降序排列。 可能遇到的问题: 1. 输入缓冲区没有正确设置,导致读取错误。 2. 转换字符串到二进制时,处理符号或溢出错误。 3. 排序算法中比较时使用了无符号跳转指令,导致排序错误。 4. 输出时没有正确处理负数,或者在转换时没有正确逆序数字字符。 5. 程序没有正确处理回车符或换行,导致输出混乱。 需要仔细调试每个部分,确保逻辑正确。 总结来说,整个程序的步骤是:输入处理、转换、排序、转换输出。每个步骤都需要相应的子程序支持,注意带符号数的处理和汇编语法的正确性。</think>以下是8086汇编程序实现输入10个带符号十进制数并按降序排序的完整代码及说明: ```asm ; 输入10个带符号十进制数,降序排列后输出 ; 使用DOSBOX环境调试 DATA SEGMENT NUMS DW 10 DUP(?) ; 存储转换后的二进制数 INPUT_BUFFER DB 7 ; 最输入长度(6位数字+符号) DB ? ; 实际输入长度 DB 7 DUP('$') ; 输入内容存储区 OUTPUT_BUFFER DB 8 DUP('$') PROMPT DB 'Input 10 numbers:',0DH,0AH,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX ; 显示输入提示 MOV AH,09H LEA DX,PROMPT INT 21H ; 输入10个数字 MOV CX,10 LEA DI,NUMS INPUT_LOOP: CALL INPUT_NUMBER ; 输入并转换数字 MOV [DI],AX ; 存储到数组 ADD DI,2 LOOP INPUT_LOOP ; 使用冒泡排序降序排列 CALL BUBBLE_SORT ; 输出排序结果 MOV CX,10 LEA SI,NUMS OUTPUT_LOOP: MOV AX,[SI] CALL PRINT_NUMBER ; 转换并输出数字 ADD SI,2 LOOP OUTPUT_LOOP ; 退出程序 MOV AH,4CH INT 21H ; 子程序:输入并转换带符号十进制数为二进制 INPUT_NUMBER PROC PUSH BX PUSH CX PUSH DX ; 读取输入字符串 MOV AH,0AH LEA DX,INPUT_BUFFER INT 21H ; 显示回车换行 MOV AH,02H MOV DL,0DH INT 21H MOV DL,0AH INT 21H ; 转换处理 LEA SI,INPUT_BUFFER+2 ; 输入内容起始地址 XOR AX,AX ; 清零AX XOR BX,BX ; 符号标志 MOV CX,10 ; 十进制基数 ; 检查符号位 CMP BYTE PTR [SI],'-' JE NEGATIVE CMP BYTE PTR [SI],'+' JE POSITIVE JMP CONVERT_LOOP NEGATIVE: MOV BX,1 ; 设置负数标志 POSITIVE: INC SI ; 跳过符号位 CONVERT_LOOP: MOV DL,[SI] CMP DL,0DH ; 检测回车结束 JE END_CONVERT IMUL AX,CX ; AX = AX*10 SUB DL,30H ; ASCII转数字 ADD AL,DL ; 累加当前位 ADC AH,0 ; 处理进位 INC SI JMP CONVERT_LOOP END_CONVERT: TEST BX,BX ; 检查符号 JZ EXIT_INPUT NEG AX ; 负数取补码 EXIT_INPUT: POP DX POP CX POP BX RET INPUT_NUMBER ENDP ; 子程序:带符号数降序冒泡排序 BUBBLE_SORT PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,9 ; 外层循环次数 OUTER_LOOP: LEA SI,NUMS MOV DX,CX ; 内层循环计数器 INNER_LOOP: MOV AX,[SI] MOV BX,[SI+2] CMP AX,BX ; 带符号比较 JGE NO_SWAP MOV [SI],BX ; 交换元素 MOV [SI+2],AX NO_SWAP: ADD SI,2 DEC DX JNZ INNER_LOOP LOOP OUTER_LOOP POP DX POP CX POP BX POP AX RET BUBBLE_SORT ENDP ; 子程序:输出带符号十进制数 PRINT_NUMBER PROC PUSH AX PUSH BX PUSH CX PUSH DX LEA DI,OUTPUT_BUFFER+6 ; 缓冲区末尾 MOV BYTE PTR [DI],'$' ; 结束符 MOV BX,10 ; 十进制基数 TEST AX,AX ; 检查符号 JNS POSITIVE_NUM NEG AX ; 转为正数处理 MOV [DI-1],'-' ; 存储负号 DEC DI POSITIVE_NUM: XOR DX,DX ; 清零DX CONVERT_LOOP2: DIV BX ; AX/10,余数在DX ADD DL,30H ; 转为ASCII DEC DI MOV [DI],DL XOR DX,DX ; 清空余数 TEST AX,AX ; 商是否为0 JNZ CONVERT_LOOP2 ; 显示结果 MOV AH,09H MOV DX,DI INT 21H ; 显示空格分隔 MOV AH,02H MOV DL,' ' INT 21H POP DX POP CX POP BX POP AX RET PRINT_NUMBER ENDP CODE ENDS END START ``` ### 程序说明 1. **输入处理**:使用DOS中断21h功能0Ah读取输入字符串,支持正负号检测和数值转换[^1] 2. **数值转换**:采用逐位转换算法,处理范围-32768到32767的带符号数 3. **排序算法**:冒泡排序实现,使用带符号数比较指令JG/JL 4. **输出处理**:逆向生成ASCII字符,支持负数显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值