Показать полную графическую версию : Нужна помощь с массивом в ассемблере i8086
Нужно написать программу для определения минимального числа в массиве из 10 беззнаковых 8 разрядных чисел, адреса которых хранятся последовательно в памяти, начиная с адреса 0700:1000. Для чтения адресов используйте косвенно-регистровую адресацию. Минимальный элемент замените значением константы C1, равной 0. Замените все элементы массива последовательно следующими числами: 1, 5, 7, 16, 18, 22, 34, 12, 11, 32.
Заранее спасибо
Вы просите не «помощь», а «сделать за меня»: Правила Форума (http://forum.oszone.net/announcement-21-187.html).
Ждём Ваших наработок.
Вот такая наработка
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
bubbler, ужс, а не код :). попробую помочь, но не обещаю.
AMDBulldozer
26-12-2013, 04:55
Вот такая наработка »
Если честно, я вообще не понял, что Вы написали. Ваш вариант выполнит 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 - я неправильно понял условия задачи. Тем не менее, пока его не удаляю.
AMDBulldozer, по условию задачи по адресу 0700:1000 лежит не массив чисел, а массив адресов на числа. Поскольку неговорится какие это указатели, полагаю надо считать, что дальние. Вообще задача сформулирована не совсем корректно, т.к. если считать, что числа находятся по разным адресам, то это нифига не массив, как сказано в задаче, ибо массив, как известно, последовательность однотипных элементов. Если же адреса указывают на последовательно расположенные байты(числа), то нафига читать все адреса, если можно прочитать первый, а дальше по индексу. Поэтому формулировка задачи не ахти. И кстати C1 по условию константа, не инициализированная переменная, тобишь C1 equ 0.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.