注册 登录
编程论坛 汇编论坛

来看看这个程序怎么编才好呢

fina2046 发布于 2011-06-01 10:46, 576 次点击
1、编写一个过程OddMaxMinAvg,用于求字数组中所有奇数的最大值、最小值和平均值。该过程必须有三个参数:
(1)数组在数据段中的地址。
(2)数组元素的个数。
(3)保存结果的地址,其中结果顺序为:最大值、最小值、平均值。 要求用堆栈传递参数,寄存器的内容不改变。

2、编写主程序测试OddMaxMinAvg。


有完整的程序么。。据说简单。。但是还是不会  悲剧
6 回复
#2
ansic2011-06-01 10:54
字数组 是字符数组还是数值数组?
#3
fina20462011-06-01 10:57
数值数组啊。。。打错了
#4
ansic2011-06-01 11:23
简单。但有些繁琐,我给你一个基本框架吧
调用子程序之前,将数组的段地址和偏移地址入栈,如:
在主程序里:
...
push ds
lea bx,array
push bx
call OddMaxMinAvg
...
OddMaxMinAvg proc
    push bp
    mov sp,bp
    push ds
    push bx
    mov ds,[bp+6]
    mov bx,[bp+4]
;开始对数组操作
   pop bx
   pop ds
   pop bp
   ret 4
OddMaxMinAvg endp
#5
ansic2011-06-01 11:58
程序代码:

;
;
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

max=1999
min=15
ave=6bd
只有本站会员才能查看附件,请 登录


[ 本帖最后由 ansic 于 2011-6-1 12:00 编辑 ]
#6
zaixuexi2011-06-01 22:52
挺好的,有些小问题
#7
ansic2011-06-02 10:06
以下是引用zaixuexi在2011-6-1 22:52:30的发言:

挺好的,有些小问题

嗯,sum应该用dd,否则容易溢出。
1