用汇编编写一个关于数据的程序~·急!

功能描述:
1. 从键盘输入20个数据(以十进制或十六进制输入均可),统计其中正数和负数的个数并显示出来(以十进制或十六进制显示均可)。
2. 求其中的最小偶数并显示出来。
3. 对输入的20个数按从小到大进行排序并显示出来。
注意:从键盘输入十进制数据的程序见参考资料1(沈美明)p199
从键盘输入十六进制数据的程序见参考资料1(沈美明)p225
但都需要加上对负号的处理。为了简单,也可以不从键盘输入数据,直接在数据段定义一些固定数据即可。
显示数据程序见参考资料1(沈美明)p161
希望能用比较简单的汇编语言,我只是一个初级学者,所以谢谢大家回答··~感激不尽·~

说明:输入、输出均为十进制数

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:在当前光标位置显示一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Unsi_Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
mov bx,10
lea di,@@Temp_SaveU[5]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide_U: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide_U
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_SaveU db 6 dup(?)
Unsi_Dec_ASCII EndP
; -------------------------------------
; 功能:把AX中的二进制有符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Sign_Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
test ah,80h
jz @@Tran_ASCII
neg ax
push ax
mov dl,'-'
mov ah,2
int 21h
pop ax
@@Tran_ASCII: mov bx,10
lea di,@@Temp_SaveS[5]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide_S: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide_S
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_SaveS db 6 dup(?)
Sign_Dec_ASCII EndP
; -------------------------------------
Buffer db 23,-69,-89,35,-46,57,-68,79,-51,-81,98,-43,56,-67,123,-98,102,-87,-91,-100
Counter equ $-Buffer ;数据个数
Prompt_Str1 db 'The positives: $' ;显示正数个数,提示信息
Prompt_Str2 db 13,10,'The negatives: $' ;显示负数个数,提示信息
Prompt_Str3 db 13,10,'The minimum even: $' ;显示最小偶数,提示信息
Prompt_Str4 db 13,10,13,10,'The increased: $',13,10 ;显示升序排序后的结果,提示信息
Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
; -------------------------------------
; 统计正数、负数个数,求最小偶数
lea si,Buffer ;取数组变量地址
mov cx,Counter ;元素个数
xor bx,bx ;BH=正数个数,BL=负数个数
xor ah,ah ;最小偶数初值
cld
@@Statics: lodsb ;读入一个元素
test al,80h ;是否正数?
jnz $+6 ;不是
inc bh ;是,正数计数
jmp $+4
inc bl ;负数计数
test al,1 ;偶数?
jnz $+8 ;不是
cmp ah,al ;当前最小偶数<=当前元素?
jle $+4 ;是,不更新
mov ah,al ;更新最小偶数
loop @@Statics
push ax
Output Prompt_Str1 ;提示显示正数个数
mov al,bh
xor ah,ah
call Unsi_Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
Output Prompt_Str2 ;提示显示负数个数
mov al,bl
xor ah,ah
call Unsi_Dec_ASCII
Output Prompt_Str3 ;提示显示最小偶数
pop ax
xchg ah,al
cbw ;扩展为字
call Sign_Dec_ASCII
; -------------------------------------
; 用冒泡排序法将数组元素升序排序,显示排序结果
lea si,Buffer ;取数组变量地址
mov cx,Counter ;元素个数
dec cx ;准备用冒泡排序法排序
@@Sorting: push cx ;入栈保存外循环次数
push si ;入栈保存数组地址
@@Compare: push si
pop di ;当前数组元素地址赋给目的变址寄存器,以备交换之用
lodsb ;读入当前字数据给AX
cmp al,[si] ;当前字数据与相邻的下一个字数据相比较
jle $+5 ;若小于或等于,不作数据交换,处理下一个数组元素
xchg al,[si] ;若大于,交换数据
stosb ;保存数值较小者
loop @@Compare ;处理下一个数组元素
pop si ;数组地址出栈
pop cx ;外循环次数出栈
loop @@Sorting ;下一趟比较
Output Prompt_Str4 ;提示显示升序排序后的结果
lea si,Buffer ;取数组变量地址
mov cx,Counter ;元素个数
@@List_Table: lodsb
cbw ;扩展为字
call Sign_Dec_ASCII
mov dl,20h
call Output_Chr ;在当前光标位置显示一个字符
loop @@List_Table
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-12-28
又是老汤

一个比较简单的汇编宏汇编程序设计急!急!非常感谢(我把分都给你,虽然...
) ;堆栈段有512字(1024字节)空间sseg ends ;堆栈余旦段结束竖轮扰;dseg segment ;定义数据段 ;12=0ch,34=22h,46=2ehdata1 db 12h,34h,56h,78h,90h,12h,45h,73h,20hdata2 db 34h,12h,56h,87h,90h,21h,

汇编语言怎么写1到100的累加和
循环执行100次累加操作:MOV CX,100;循环100次NEXT: ADD RESULT,AX;每次向和中累加AX INC AX;然后AX加1 LOOP NEXT 结束程序,返回操作系统:MOV AX,4C00H;结束程序INT 21H CSEG ENDS END START 以上就是使用汇编语言实现1到100累加和的程序代码。代码中使用了数据段(DSEG)和代码段(CSEG)来分...

汇编题,写一个完整的程序,实现1到100之间的偶数求和,将结果保存在数据段...
CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AX MOV AX,DATAMOV ES,AX 准备循环数据,偶数,所以这里使用了取巧的方法,直接加2。通用的可以使用模2的方法计算。MOV CX,50MOV BX,2MYLOOP。ADD SUM,BXADD BX,2 LOOP MYLOOP ...

简单的汇编语言程序设计!加急!
MOV A, 30H CLR C SUBB A, 31H ;(30H)-(31H)JC EXIT ;不够减转移 MOV 32H, 31H ;否则31H才是小数 EXIT:END --- 2. 将片内RAM单元中 30H~37H 的数据送到片外RAM的 40H~47H。MOV R0, #30H MOV R1, #40H MOV R2, #8 LOOP:MOV A, @R0 MOVX @...

用汇编语言编写程序,建立一数据表,表中存放1-9的平方,查表求某数字的...
; 数据表格.TABLE DW 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 DATA ENDS ;--- STACK SEGMENT DW 128 DUP(0)STACK ENDS ;--- CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK START:MOV AX, DATA MOV DS, AX MOV ES, AX M_LOOP:MOV AH, 1 INT 21H ...

求一段汇编程序,编制程序求一组数据中的最大数和最小数及其存放地址...
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。影响资源:PSW、A、B、R1~R7 堆栈需求: 4字节 MMS: MOV B,R7 ;保存数据个数 MOVX A,@DPTR ;读取第一个数据 MOV R6,A ;作为最大值的初始值 MOV R7,A ;也作为最小值的初始值 MOV A,DPL ;取第一个数据...

编写一段代码使用C语言嵌人汇编程序,在汇编程序中实现求两个数的最...
在C语言中嵌入汇编代码可以使用`asm`关键字,具体的实现方式取决于所使用的编译器和平台。下面是一个简单的示例代码,使用C语言嵌入汇编程序来求两个数的最大公约数:```c include <stdio.h> int gcd(int a, int b) { int result;asm volatile("mov %1, %%eax\\n" \/\/ 将a的值放入eax...

用完整的汇编语言编写使数码管循环显示0,1,2,3,4,5,6,7,8,9的程序
程序如下:\/ 用P0口输出到数码管显示0-9 编写:jzy23 交流:paulucy@126.com \/ include<reg52.h> define uint unsigned int define uchar unsigned char \/ 共阴数码管显示码 \/ uchar code display[10]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };\/ 延时函数 功...

用汇编语言编写一个小小程序
这个还不简单#include<stdio.h>void main(){ float a,b,c,s;\/*定义数据类型,数据初始化*\/s=(a*b+c)\/a;\/*计算并把计算结果赋值给s*\/printf("s=%f\\n",s);\/*输出计算结果*\/}

怎样用汇编编写一段十进制两位数相除的程序求商跟余数
依次输入两个两位数,第一个为被除数,输出商和余数,第一个为商。不包含数字输入检验,和除零检验 assume cs:codes,ss:stacks stacks segment dw 32 dup(0000h)stacks ends codes segment start:mov ax,stacks mov ss,ax mov sp,0040h xor ah,ah xor bh,bh call readnumto_bl call newline...

相似回答
大家正在搜