Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Нужна помощь с массивом в ассемблере i8086 (http://forum.oszone.net/showthread.php?t=274691)

bubbler 25-12-2013 17:24 2278425

Нужна помощь с массивом в ассемблере i8086
 
Нужно написать программу для определения минимального числа в массиве из 10 беззнаковых 8 разрядных чисел, адреса которых хранятся последовательно в памяти, начиная с адреса 0700:1000. Для чтения адресов используйте косвенно-регистровую адресацию. Минимальный элемент замените значением константы C1, равной 0. Замените все элементы массива последовательно следующими числами: 1, 5, 7, 16, 18, 22, 34, 12, 11, 32.

Заранее спасибо

Iska 25-12-2013 17:44 2278438

Вы просите не «помощь», а «сделать за меня»: Правила Форума.

Ждём Ваших наработок.

bubbler 25-12-2013 17:51 2278444

Вот такая наработка

MOV di,0
MOV si,1
MOV cx,10
start:
mov bl,mass[si]
cmp mass [di],bl

loop start

add si,1
mov di,si

Mass db 1h,5h,7h,16h,18h,22h,34h,12h,11h,32h

Efir 26-12-2013 00:23 2278628

bubbler, ужс, а не код :). попробую помочь, но не обещаю.

AMDBulldozer 26-12-2013 04:55 2278669

Цитата:

Цитата bubbler
Вот такая наработка »

Если честно, я вообще не понял, что Вы написали. Ваш вариант выполнит 10 одинаковых сравнений, потом пару операций неочевидного смысла и радостно передаст управление на блок констант.
Лучше отталкивайтесь для начала от чего-то такого:
Код:

    1 00000000 EB0B                    Start                JMP .start
    2                                                  align 2
    3 00000002 010507101216220C0B-    .Array:                DB 1, 5, 7, 16, 18, 22, 34, 12, 11, 32
    4 0000000B 20               
    5 0000000C 00                      .C1                DB 0
    6 0000000D FC                      .start                CLD
    7 0000000E BCFCFF                                  MOV SP, -4
    8 00000011 8CC8                                    MOV AX, CS
    9 00000013 8EC0                                    MOV ES, AX
    10 00000015 8ED0                                    MOV SS, AX
    11 00000017 680007                                  PUSH 700h
    12 0000001A 1F                                      POP DS
    13 0000001B BE0010                                  MOV SI, 1000h
    14 0000001E B90A00                                  MOV CX, 10
    15 00000021 B3FF                                    MOV BL, -1
    16 00000023 AC                      .loop                LODSB
    17 00000024 38D8                                    CMP AL, BL
    18 00000026 7704                                    JA .loopend
    19 00000028 88C3                                    MOV BL, AL
    20 0000002A 89F7                                    MOV DI, SI
    21 0000002C E2F5                    .loopend        LOOP .loop
    22 0000002E B0[0C]                                  MOV AL, .C1
    23 00000030 8845FF                                  MOV [DI-1], AL
    24 00000033 1E                                      PUSH DS
    25 00000034 07                                      POP ES
    26 00000035 0E                                      PUSH CS
    27 00000036 1F                                      POP DS
    28 00000037 8D36[0200]                              LEA SI, [.Array]
    29 0000003B BF0010                                  MOV DI, 1000h
    30 0000003E B105                                    MOV CL, 5
    31 00000040 F3A5                                    REP MOVSW

Сразу предупреждаю - код не проверял, набросал наспех. Эффективность кода низкая в связи с использованием строчных операций (самый короткий способ воспользоваться той самой "косвенно-регистровой адресацией"). Можно было бы его упростить, пригладить, избавиться еще от одного перехода и связанной с ним метки
(заменить строки 16-18 на две клманды "CMOVBE BX, AX; CMOVBE DI, SI". Но зато в нынешнем варианте Вы можете гордо сказать преподавателю, что комбинация cmp/ja позволит процессору объединить эту пару команд, используя macrofusion. :wink:

Да, еще одно важное замечание: код был написан для аасемблера nasm (Вам его легче будет понять, чем as), но этот ассемблер не поддерживает модели памяти. Поскольку не предназначен для MS-DOS.
Поэтому инициализация сегментных регистров производилась в явном виде. Блокирование прерываний до установки сегмента стека не осуществлялось, чтобы не перегружать программу проверками IOPL/CPL/PE/VM, поскольку при некоторых комбинациях этих полей команда CLI вызовет общее нарушение защиты.

Еще раз повторяю: ЭТО ВСЕГО ЛИШЬ ЧЕРНОВИК! Я его не проверял.

P.S. Код написан неправильно!!! Читайте ниже сообщение уважаемого Efir - я неправильно понял условия задачи. Тем не менее, пока его не удаляю.

Efir 26-12-2013 13:12 2278793

AMDBulldozer, по условию задачи по адресу 0700:1000 лежит не массив чисел, а массив адресов на числа. Поскольку неговорится какие это указатели, полагаю надо считать, что дальние. Вообще задача сформулирована не совсем корректно, т.к. если считать, что числа находятся по разным адресам, то это нифига не массив, как сказано в задаче, ибо массив, как известно, последовательность однотипных элементов. Если же адреса указывают на последовательно расположенные байты(числа), то нафига читать все адреса, если можно прочитать первый, а дальше по индексу. Поэтому формулировка задачи не ахти. И кстати C1 по условию константа, не инициализированная переменная, тобишь C1 equ 0.


Время: 20:26.

Время: 20:26.
© OSzone.net 2001-