Консультация № 169212
09.06.2009, 22:43
0.00 руб.
0 3 1
Здравствуйте!
Дело в том, что мне надо сделать программу, которая будет работать с одномерным массивом и находить максимальный элемент и выводить его номер. Причем, каждая ячейка массива должна иметь размер 2 байта. У меня все получилось, только программа работает с байтом, а не двумя.
У меня вопрос: почему моя программа работает с моим массивом как будто у него каждая ячейка разрядностью байт, а не 2? Это выражается в том, что если ввести число, большее, чем 255, то получается неверный результат. Причем, номер элемента, если он больший, пишет правильно. Вот такая путаница.
Только одна просьбочка: не пишите свою программу с нуля, поправьте лучше мою. Я использую компилятор MASM. Программа в приложении.
Большое спасибо за помощь!

Приложение:
include macro.lib
stack segment para 'stack'
dw 512 dup(?)
stack ends
data segment para 'data'
x1 db'Vvedite n-razmer massiva: $'
x2 db'vvedite$'
x3 db'element massiva: $'
x4 db'Maks: $'
x5 db'N-elementa: $'
n dw ?
a dw 100 dup(?)
g dw ?
data ends
code segment para 'code'
assume ss:stack, cs:code, ds:data
kas proc far
mov ax,data
mov ds,ax
move_cursor 0,0
cls
message x1
key_$2bin
mov n,ax
cls
lea di,a
mov cx,1
m1:
crlf
call ant
add cx,1
cmp cx,n
jle m1
cls
mov cx,1
mov g,1
lea di,a
mov bx,[di]
m10:
mov ax,[di]
cmp ax,bx
jg m55
n11:
inc di
inc di
add cx,1
cmp cx,n
jle m10
jmp m4
m55:
call max
jmp n11
m4:
move_cursor 0,0
mov ax,bx
message x4
print_number
crlf
message x5
mov ax,g
print_number
key_$2bin
mov ax,4c00h
int 21h
max proc near
mov bx,[di]
mov g,cx
ret
max endp
ant proc near
mov ax,cx
message x2
print_number
crlf
message x3
key_$2bin
crlf
mov [di],ax
inc di
inc di
ret
ant endp
kas endp
code ends
end kas

Обсуждение

Неизвестный
09.06.2009, 23:46
общий
без macro.lib это бессмысленный код
давно
Посетитель
7438
7205
10.06.2009, 04:51
общий
это ответ
Здравствуйте, AkaProc.
Ошибка заложена в файле macro.lib. (Приведена здесь)
Рассмотрим фрагмент:
Код:
m4:
move_cursor 0,0
mov ax,bx
message x4
print_number
crlf

Макро move_cursor вызывает, в свою очередь, макро video_state,
а вот оно портит регистр bh (заносит в него номер страницы видеопамяти) !!!
А в BX у нас лежало максимальное значение...
Исправить можно двумя способами:
1) поменять местами две строки (регистр ax не портится):
Код:
m4:
mov ax,bx
move_cursor 0,0

2) исправить макро move_cursor:
Код:
move_cursor macro x,y
local ok,vs
push ax
push dx
push bx
;...
pop bx
pop dx
pop ax
endm
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
10.06.2009, 04:56
общий
AkaProc:
macro.lib надо приводить самому !
Если было раньше, давать ссылку...
Почему мы должны "стоять на ушах" и искать личный Ваш файл?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа