Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Нахождение max массива на asm e   Найти похожие ветки 

 
Lyonux ©   (2010-05-12 10:07) [0]

Пишу небольшую лабу на асме, выглядит так:

.Model Tiny
.stack 100h
.data
ar db 23,45,4,6,98,3,21,17,30,78
.code
START:  mov ax, @data
mov ds, ax
xor ax, ax
mov si,0
mov al,offset ar[si]
METKA1:inc si
mov bl,offset ar[si]
cmp al,bl
jns METKA1
mov al,bl
cmp si,10
js METKA2
jmp METKA1
METKA2:xor ah,ah
mov dh,al
mov dl,ah
or dh,30h
or dl,30h
mov ah,02h
int 21h
xchg dh,dl
int 21h
mov ah,4ch
int 21h
end START


Программка должна вывести максимальное число массива, т.е. 98, но выводит "0=". Не понимаю, в чём проблема! Преподаватель тоже не видит, в чём может быть ошибка. Господа, может кто-то хорошо разбирается в асме и мог бы помочь?)  Я просто теряюсь в догадках..


 
Игорь Шевченко ©   (2010-05-12 10:22) [1]


> cmp al,bl
> jns METKA1


дико извиняюсь, почему не jge ?


> METKA1:inc si
> mov bl,offset ar[si]
> cmp al,bl
> jns METKA1
> mov al,bl
> cmp si,10
> js METKA2
> jmp METKA1


а это вообще фигня. у тебя si будет инкрементироваться только после замены максимального значения. а надо бы почаще.


 
Игорь Шевченко ©   (2010-05-12 10:22) [2]

Игорь Шевченко ©   (12.05.10 10:22) [1]

Тьфу, не инкрементироваться, а сравниваться с максимальным. Перепутал.


 
Alx2 ©   (2010-05-12 10:25) [3]

Первое, что бросилось в глаза: перевод в десятичную систему некорректен.
Вот это:
or dh,30h
or dl,30h
Не обязано работать для регистров, с содержимым > 9.
+ зачем or а не add?


 
Anatoly Podgoretsky ©   (2010-05-12 10:30) [4]

> Lyonux  (12.05.2010 10:07:00)  [0]

У тебя что отладчика нет?


 
Lyonux ©   (2010-05-12 10:31) [5]


> Anatoly Podgoretsky ©   (12.05.10 10:30) [4]

есть, аха.."блокнот" называется)


 
12 ©   (2010-05-12 10:33) [6]

так как-то написал бы
...
mov si,0
mov bl, 255
L:
inc si
cmp si, длинна данных +1
je L_END_CMP:

mov al,offset ar[si]
cmp bl,al
jge LL
jmp L

L_END_CMP:
вывод и т.п.

LL:
mov bl,al
jmp L


 
Lyonux ©   (2010-05-12 10:59) [7]

Иногда мне хочется быть морской свинкой: у них таких проблем не возникает.

> Alx2 ©   (12.05.10 10:25) [3]

Попробовала заменить - то же самое.


>          cmp si,10
           js METKA2
           jmp METKA1
METKA2:xor ah,ah

вот тут у меня написана - фигня. Это я обнаружила, когда комментировала каждую строчку кода. там надо было написать:

           cmp si,10
           js METKA1
METKA2:xor ah,ah

и вот тогда было бы правильно: si<10 -> надо ещё прокрутить цикл, а не выводить на экран результат. Мне это, правда, не очень помогло. Теперь вместо "0=" выводит "0*".


> а это вообще фигня. у тебя si будет сравниваться только
> после замены максимального значения. а надо бы почаще.

Можно с этого моменты поподробнее? У меня там не так много кода, чтобы si почаще сравнивать)


 
Alx2 ©   (2010-05-12 11:01) [8]

> Lyonux ©   (12.05.10 10:59) [7]

>Попробовала заменить - то же самое.

Речь не только про add и or. Для того, чтобы перевести число в десятичную систему, требуется больше работы.


 
Lyonux ©   (2010-05-12 11:04) [9]


> Речь не только про add и or. Для того, чтобы перевести число
> в десятичную систему, требуется больше работы.

Совсем больше?.. хм..Раньше эта схема нормально работала( Видимо придётся брать гигантский бубен и изображать из себя знатока)
Спасибо и на том, мил человек =)


 
12 ©   (2010-05-12 11:07) [10]

может попробовать не 02h, а 06h

Прямой вывод символа на экран (06h int 21h)
Функция 06h выводит один символ на экран.
Вход: АН = 06h — вывод символа на экран; DL = символ для вывода


 
Alx2 ©   (2010-05-12 11:17) [11]

>Lyonux ©   (12.05.10 11:04) [9]

DOS Fn 02H: вывод на дисплей
Вход

   * AH = 02H
   * DL = символ, выводимый на стандартный вывод

Выход

   * нет =

Описание:

Посылает символ из DL на стандартный вывод. обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. при обнаружении Ctrl-Break выполняется INT 23H.

http://www.codenet.ru/progr/dos/dos_0010.php
----------------

Теперь смотрим что получается с 98 по алгоритму, реализованному в [0]:
98 = 62h

62h or 30h =72h

Выводим его:
первый байт: 0h or 30h = 30h - выводится 0
второй байт 72h - выводится "r".

Но ведь "0r" ни разу не похож на "98".

А в приведенных вами примерах вывода, вооще не участвовало 98.


 
Alx2 ©   (2010-05-12 11:19) [12]

Вдогонку к Alx2 ©   (12.05.10 11:17) [11]
----------
первый байт: 0h or 30h = 30h - выводится 0
второй байт 72h - выводится "r".
---------

Про первый байт - фейк. Он вообще там не нужен, этот вечный ноль. К тому ж все данные однобайтовые.


 
Anatoly Podgoretsky ©   (2010-05-12 12:04) [13]


> + зачем or а не add?

Это чтобы запутать и больше времени потратить на отладку.


 
Anatoly Podgoretsky ©   (2010-05-12 12:05) [14]


> есть, аха.."блокнот" называется)

Переинсталируй и больше не отказывайся от отладчика, зачем ты себе устраиваешь сложную жизнь?


 
Anatoly Podgoretsky ©   (2010-05-12 12:05) [15]

Кстати даже и блокнот не требуется, можно на бумажке провести отладку!!!


 
12 ©   (2010-05-12 12:20) [16]

у меня складывается твердое убеждение, что АП - аля Николя Бурбаки..


 
oxffff ©   (2010-05-12 12:32) [17]


> Преподаватель тоже не видит, в чём может быть ошибка.


:(


 
Palladin ©   (2010-05-12 12:49) [18]

if(ученикНевидитОшибку==преподНевидитОшибку){
 зачет;
 return;
}


 
12 ©   (2010-05-12 12:57) [19]

if  (ученикНевидитОшибку==преподНевидитОшибку)
AND (ПрограммаЛажает(this)==Немного)
{
SAY("чето_с_системой");
зачет;
return 3;
}


 
Palladin ©   (2010-05-12 12:59) [20]

о... а это на каком языке?


 
Lyonux ©   (2010-05-12 13:17) [21]

if(ученикНевидитОшибку==НеРаботаетПравильно){
СделатьЧтобыРаботало;
return;
}

Ибо преподователю за 50, ей надо объяснить каждую строчку кода и показать правильный ответ. То, что мы работаем на древнейшем языке с 4 16ьитными регистрами никого смущать не должно) У нас на это всего полгода.


 
Alx2 ©   (2010-05-12 13:31) [22]

- Святой отец, а что это был за язык?
- О, это священный язык! Когда-то на нем разговаривала вся Галактика!

(с) "5-й элемент" :)

Имхо, его достаточно для начала. Концепция, в основном, не изменилась.


 
Lyonux ©   (2010-05-12 13:40) [23]


> Имхо, его достаточно для начала. Концепция, в основном,
> не изменилась.


Никто и не против)) Просто священный язык иногда не работает так, как ожидаешь.. времени вдаваться в тонкости нет, пишем так, как дают) А оно БАЦ! и не работает. Потом сиди и мучайся: в методичке так написано, а у тебя не пашет. А сдать надо, хоть убей.
Я-то впринципе понимаю, что пишу, но только на том уровне, на котором мне дают) На асме я на большее не потяну.)


 
Sha ©   (2010-05-12 13:51) [24]


 mov si, 0
 mov al, offset ar[si]
METKA1:
 inc si
 cmp si, 10
 jge METKA2
 mov bl, offset ar[si]
 cmp al, bl
 jge METKA1
 mov al, bl
 jmp METKA1
METKA2:


 
ProgRAMmer Dimonych ©   (2010-05-12 13:53) [25]

> То, что мы работаем на древнейшем языке с 4 16ьитными регистрами
> никого смущать не должно) У нас на это всего полгода.

С 8-ю общего назначения, минимум двумя сегментными, плюс IP, плюс FLAGS. И асм не может быть дрейнейшим. Это как признать компьютер устаревшим.

Могу кинуть проженьку (у самого похожая лаба как-то случилась), там вполне нормально пашет. Но в FASM-синтаксисе. Переделывать придётся самостоятельно ;)


 
Alx2 ©   (2010-05-12 14:00) [26]

Не знаю, будет ли полезным это (может, просто пишу мегабанальности):

Для того, чтобы "понятно" напечатать найденный максимум, делают его перевод в десятичную систему счисления. Для этого находим остаток от деления на 10 - это будет последняя цифра в распечатке. Затем делим нацело на 10 и снова ищем остаток от деления на 10 - это будет предпоследняя цифра результата. И т.д.
Получается что-то типа такого для N>0:
while N<>0 do begin
digit[k] := N mod 10;
 N := N div 10;
end;

На асме, соответственно, делением занимается команда div. Она сразу дает частное и остаток. Осталось организовать цикл и буферный массив для хранения результата (а он не длиннее 3 циф, так как используется байт).

Затем полученные цифры печатаем. Чтобы они на экране выглядили как цифры, при печати к ним прибавляем код символа "0" (он в программе в виде 30h).  Цифры получатся, потому-что в ASCII-таблице коды символов цифр идут подряд: "0": 48 (30h), "1": 49 (31h) и т.д.


 
Lyonux ©   (2010-05-12 14:10) [27]


> Sha ©   (12.05.10 13:51) [24]


Огроменное спасибо! Можно больше не насиловать себе мозг)


> Могу кинуть проженьку (у самого похожая лаба как-то случилась),
>  там вполне нормально пашет. Но в FASM-синтаксисе. Переделывать
> придётся самостоятельно ;)

Вы определённо хотите моей смерти)

Спасибо всем большое! Постараюсь больше по таким мелочам вопросов не задавать =)


 
Lyonux ©   (2010-05-12 14:11) [28]


> Alx2 ©   (12.05.10 14:00) [26]

METKA2:xor ah,ah
mov bl,10
div bl
mov dh,ah
mov dl,al
or dh,30h
or dl,30h
mov ah,02h
int 21h
xchg dh,dl
int 21h


 
Alx2 ©   (2010-05-12 14:18) [29]

>Lyonux ©   (12.05.10 14:11) [28]

Хм... Но в [0] было так :)
------------------
METKA2:xor ah,ah
mov dh,al
mov dl,ah
or dh,30h
or dl,30h
mov ah,02h
int 21h
xchg dh,dl
int 21h
mov ah,4ch
int 21h
end START
--------------
+ попробуй вместо 98 занести 222, например :)


 
ProgRAMmer Dimonych ©   (2010-05-12 14:30) [30]

> Вы определённо хотите моей смерти)

Скорее более глубокого понимания асма.


 
Lyonux ©   (2010-05-12 14:39) [31]


> ProgRAMmer Dimonych ©   (12.05.10 14:30) [30]

Ну ежели бы я этого сама хотела, до сидела бы сейчас обложившись кучей книжек, статей, понаоткрывав исхдников и усиленно кипела бы мозгами) НО, мне достаточно знать самый минимум) Увы)


> Alx2 ©   (12.05.10 14:18) [29]

бубубубу) Да, нужен цикл) Но мы притворимся сусликами и будем махать готовой задачей с пошаговой стратегией решения)


 
12 ©   (2010-05-12 14:39) [32]

Вы определённо хотите
1. "моей смерти)"
2. "более глубокого понимания асма"
3. "."



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.067 c
2-1272371119
abhtr
2010-04-27 16:25
2010.08.27
Нарушение кодировки при копировании из таблицы в таблицу


2-1270329778
Б
2010-04-04 01:22
2010.08.27
String -> WideChar


2-1267530370
Fr
2010-03-02 14:46
2010.08.27
компоненты в run-time


2-1266403680
Незнайка на Луне
2010-02-17 13:48
2010.08.27
База данных по научным статьям


3-1238243754
Ivan8511
2009-03-28 15:35
2010.08.27
Индексация даты в обратном порядке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский