Помогит найти ошибку в процедуре на ассемблере masm

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Anbore
Сообщения: 4
Зарегистрирован: 14 апр 2014, 22:35

08 июн 2014, 00:08

Привет всем. Помогите пожалуйста найти ошибки в программе на 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 6
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 
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

09 июн 2014, 15:07

Кругом одни требования - ни одной просьбы))
Посему скажу кратко, непонятно, но с намеком:
1) на стеке у тебя не массив, а его смещение
2) максимум "перепахивается" (т.е. не сохраняется, заменяется другим значением)
...и еще 2 ошибки
It's a long way to the top if you wanna rock'n'roll
Ответить