来看看这个程序怎么编才好呢
1、编写一个过程OddMaxMinAvg,用于求字数组中所有奇数的最大值、最小值和平均值。该过程必须有三个参数: (1)数组在数据段中的地址。
(2)数组元素的个数。
(3)保存结果的地址,其中结果顺序为:最大值、最小值、平均值。 要求用堆栈传递参数,寄存器的内容不改变。
2、编写主程序测试OddMaxMinAvg。
有完整的程序么。。据说简单。。但是还是不会 悲剧
; ;This Program Compiled Sucess by Masm 6.15 ; assume cs:code,ds:data data segment array dw 12h,34h,23h,15h,123h,1254h,1999h ;待测数据 max dw 0 ;初始化最大值 min dw 0ffffh ;初始化最小值 ave dw 0 ;初始化平均值 sum dw 0 ;初始化总和 data ends code segment start: mov ax,data ;定义数据段 mov ds,ax mov bx,offset array ;将段地址以及数组偏移地址 push ds ;通过堆栈传递给子程序 push bx call odd ;调用子程序 mov ah,4ch ;返回DOS int 21h ;子程序 odd proc push bp ;保存基址指针 mov bp,sp ;堆栈基址 push ds ;保存段地址 push bx ;保存偏移地址 xor dx,dx ;高位清零,最后做除法使用 xor si,si ;计数器,用作统计奇数个数 mov ds,[bp+6] ;设定入口参数 mov bx,[bp+4] mov cx,lengthof array ;数组个数 s: mov ax,[bx] ;开始遍历, test ax,1 ;测试奇偶数 jz jx ;是偶数,跳过, inc si ;是奇数,开始统计计算等操作 add sum,ax ;累加 cmp ax,max ;比较大小数 ja ma cmp ax,min jb mi ma: mov max,ax ;大数暂存max jmp jx mi: mov min,ax ;小数暂存min jx: add bx,2 ;指向下一个数据 loop s mov ax,sum ;求平均数 div si mov ave,ax ;结果放置ave pop bx ;恢复寄存器 pop ds pop bp ;恢复基址 ret 4 ;清理堆栈 odd endp ; code ends end start