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

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

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

06 июн 2014, 20:50

Помогите пожалуйста найти ошибки в программе на masm 4.0 (16 бит) под DOS:
Разработать программу которая вводит массив из 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
Ответить