Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Ошибки в процедуре по обработке массива masm


Автор: Anbore 6.6.2014, 19:36
Помогите пожалуйста найти ошибки в программе на masm 4.0 (16 бит):
Разработать программу которая вводит массив из 5 элементов типа байт и число C.
Требуется, используя подпрограмму, найти максимальный элемент в массиве если каждый из заданных элементов меньше C. Параметры (указатель на массив, длина массива и число С), в подпрограмму, передаются через стек, а результат возвращается через регистр АХ или регистры AX,DX. Восстановить стек в стиле языка Паскаль. В стиле языка Паскаль стек восстанавливается командой ret с указанием числа байт, на которые надо скорректировать указатель стека.
Не передаются параметры через стек.
Код

include io.asm ;подключение операций ввода-вывода

stack segment stack
    dw 128 dup (?)
stack ends

data segment
; место для переменных и констант
x db 5,13,4,14,12
c equ 7
l equ 5
data ends

code segment 'code'
    assume ss:stack, ds:data, cs:code
; место для описания процедур
foo proc 
push bp
mov bp, sp

mov bx, [bp+4]
mov al,[bp]
lp:    cmp [bp],al    ;если текущее значение не больше максимального
    jle m1        ;то пропустить
    mov al,[bp]    ;если больше, запомнить новый максимум
m1:    inc bp        ;следующий элемент массива
    loop lp        ;обработать весь массив
    cmp al,c    ;сравнить макс и с
    jge m2        ;если макс не меньше с, то пропустить
    mov al,c    ;если с больше, сделать с максимумом
m2:    pop bp
    ret 4
foo endp
start:
    mov ax,data
    mov ds,ax
mov ax, offset x 
push ax
mov ax,l; помещаем длину массива 
push ax; в стек
mov ax,c
push ax
call foo 
outint ax
newline
    finish
code ends
    end start 

Автор: ФедосеевПавел 7.6.2014, 11:09
Ты помещаншь в стек 6 байт (3 вызова push ax), а освобождаешь 4 (ret 4).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)