汇编语言实现将数据从大到小排序
要求:文本读入数据1000个整数
1条回答 默认 最新
- a81836620 2019-03-26 12:58关注
将读取的txt文件放在目录下
data segment file db 'test.txt' num dw 1024 dup (0) buffer db 2000 dup (0) data ends code segment assume ds:data, cs:code start: mov ax, data mov ds, ax mov es, ax ;打开文件test.txt mov ah,3dh lea dx,file mov al,0 int 21h ;读取文件内容,存入buffer lea dx,buffer mov bx,ax ;文件代号 mov cx,100 ;读取的字节数 mov ah,3fh int 21h ;显示buffer中的内容 push ax mov cx,ax lea si,buffer next: mov dl,[si] mov ah,2 int 21h inc si loop next mov dl, 0dh ;回车 mov ah, 2 int 21h mov dl, 0ah ;换行 int 21h ;关闭被读取的文件 mov ah,3eh int 21h ;提取buffer中数字到num中 pop ax mov cx,ax ;实际读到的字节数目 lea si,buffer lea di,num mov bx,0 ;存放当前数值 cld loop1: mov dl,[si] cmp dl,' ' push dx jz loop2 cmp dl,13 jz loop2 mov ax,10 ;10进制乘数,16位乘法 mul bx ;16位乘法 mov bx,ax ;由于本题的限制,只要低16位即可 pop dx sub dl,30h ;从ascii变回数值 mov al,dl cbw mov dx,ax add bx,dx jmp flag loop2: mov ax,bx stosw ;将内容存到num中 mov bx,0 space: inc si mov dl,[si] cmp dl,'0' jl space sub si,1 flag: inc si loop loop1 sub di,2 push di ;num结束地址 ;将num中的数排序 lea si,num push si sort1: pop bx pop ax cmp ax,bx push ax jz sort1end add bx,2 push bx mov di,si sort2: pop bx pop ax cmp ax,di push ax push bx jz sort1 mov ax,[di] add di,2 mov bx,[di] cmp ax,bx ja swap jmp sort2 swap: mov cx,ax mov ax,bx mov bx,cx push di cld sub di,2 stosw mov ax,bx stosw pop di jmp sort2 sort1end: ;output num lea di,num loop3: mov bx,0 ;高位0标记 mov ax, [di] ;索引数组元素 mov dx, 0 ;令高位为0 mov cx, 10000 div cx push dx mov dx, ax add dx, 30h ;转化成ascii码 mov ah, 2 ;设置 int输出dl中字符 cmp bx,0 ja not01 cmp dl, 30h jz zero1 ;万位为0则不输出 not01: int 21h ;输出万位 mov bx,1 zero1: pop dx mov ax,dx ;余数放在ax中 mov dx, 0 ;令高位为0 mov cx, 1000 div cx push dx mov dx, ax add dx, 30h ;转化成ascii码 mov ah, 2 ;设置int输出dl中字符 cmp bx,0 ja not02 cmp dl, 30h jz zero2 ;千位为0则不输出 not02: int 21h ;输出千位 mov bx,1 zero2: pop dx mov ax,dx ;余数放在ax中 mov dx, 0 ;令高位为0 mov cx, 100 div cx push dx mov dx, ax add dx, 30h ;转化成ascii码 mov ah, 2 ;设置int输出dl中字符 cmp bx,0 ja not03 cmp dl, 30h jz zero3 ;百位为0则不输出 not03: int 21h ;输出百位 mov bx,1 zero3: pop dx mov ax,dx ;余数放在ax中 mov dx, 0 ;令高位为0 mov cx, 10 div cx push dx mov dx, ax add dx, 30h ;转化成ascii码 mov ah, 2 ;设置int输出dl中字符 cmp bx,0 ja not04 cmp dl, 30h jz zero4 ;十位为0则不输出 not04: int 21h ;输出十位 mov bx,1 zero4: pop dx mov ax,dx ;余数放在ax中 mov dx, 0 ;令高位为0 mov cx, 1 div cx mov dx, ax add dx, 30h ;转化成ascii码 mov ah, 2 ;设置int输出dl中字符 cmp dl, 30h int 21h ;输出个位 add di,2 ;inc bx ;cmp bx, cx mov dl, 0dh ;回车 mov ah, 2 int 21h mov dl, 0ah ;换行 int 21h pop ax mov bx,ax add bx,2 cmp bx,di ;判断是否结束 push ax jnz loop3 ;程序结束,返回到操作系统系统 mov ax, 4c00h int 21h end start code ends ret
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记
- ¥15 保护模式-系统加载-段寄存器