Assm - Нужна помощь с массивом в ассемблере i8086

Ответить
Аватара пользователя
bubbler

Assm - Нужна помощь с массивом в ассемблере i8086

Сообщение bubbler »

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



Заранее спасибо
Аватара пользователя
Iska

Re: Assm - Нужна помощь с массивом в ассемблере i8086

Сообщение Iska »

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



Ждём Ваших наработок.
Аватара пользователя
Iska

Re: Assm - Нужна помощь с массивом в ассемблере i8086

Сообщение Iska »

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



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

Re: Assm - Нужна помощь с массивом в ассемблере i8086

Сообщение Efir »

bubbler, ужс, а не код Изображение. попробую помочь, но не обещаю.
Аватара пользователя
AMDBulldozer

Re: Assm - Нужна помощь с массивом в ассемблере i8086

Сообщение AMDBulldozer »

Цитата bubbler:



Вот такая наработка
Assm - Нужна помощь с массивом в ассемблере i8086




Если честно, я вообще не понял, что Вы написали. Ваш вариант выполнит 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. Изображение



Да, еще одно важное замечание: код был написан для аасемблера nasm (Вам его легче будет понять, чем as), но этот ассемблер не поддерживает модели памяти. Поскольку не предназначен для MS-DOS.

Поэтому инициализация сегментных регистров производилась в явном виде. Блокирование прерываний до установки сегмента стека не осуществлялось, чтобы не перегружать программу проверками IOPL/CPL/PE/VM, поскольку при некоторых комбинациях этих полей команда CLI вызовет общее нарушение защиты.



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



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

Re: Assm - Нужна помощь с массивом в ассемблере i8086

Сообщение Efir »

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

Вернуться в «Программирование и базы данных»