Отрицательные числа в массиве

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Отрицательные числа в массиве

Re: Отрицательные числа в массиве

Xariec » 12 апр 2009, 21:07

Что имеется на данный момент, помогите довести до конца :confused:

Код: Выделить всё

.386
.MODEL COMPACT
.STACK 4096
.data
	
.code
main PROC
	mov ah,58h ;Код функции
	mov al,01h ;Код подфункции
	mov bl,02h ;Установка стратегии
INT 21h

	mov ah,48h ;Код функции
	mov bx,16h ;Выделяем размер памяти объёмом 16П
INT 21h

	mov ah,4aH ;Код функции
main ENDP
	mov al,4ch
INT 21h
END main

Re: Отрицательные числа в массиве

somewhere » 10 апр 2009, 09:38

"Последний подходящий блок" отличается от "Первого подходящего" только адресом блока. "Последний подходящий" будет находится в самом конце кучи, если конечно память не сильно фрагментирована. Не даром функция имеет номер 58h, а это уже говорит о том, что она не является основной и без нее жить можно. По умолчанию MS-DOS использует стратегию "Первый подходящий". Я с ходу даже не могу привести пример где бы ее могли использовать и кому она будет нужна. С UMB все понятно, но вот стратегия...

Re: Отрицательные числа в массиве

Xariec » 10 апр 2009, 08:47

airyashov, вот что смог найти:
Область памяти UMB

Функция DOS 58h — Считать/изменить стратегию выделения памяти
Ввод: АН = 58h
AL = 00h — считать стратегию
AL = 01h — изменить стратегию
ВХ = новая стратегия

биты 2 – 0:
00 — первый подходящий блок
01 — наиболее подходящий блок
11 — последний подходящий блок биты 4 – 3:
00 — обычная память
01 — UMB (DOS 5.0+)
10 — UMB, затем обычная память (DOS 5.0+)

AL = 02h — считать состояние UMB
AL = 03h — установить состояние UMB
ВХ = новое состояние: 00 — не используются, 01 — используются
Вывод: CF = 0, АХ = текущая стратегия для AL = 0, состояние UMB для AL = 2
CF = 1, AX = 01h, если функция не поддерживается (если не запущен менеджер памяти (например, EMM386) или нет строки DOS = UMB в CONFIG.SYS

Если программа изменяла стратегию выделения памяти или состояние UMB, она обязательно должна их восстановить перед окончанием работы.

Только зачем она и для чего в данный момент не имею ни малейшего понятия.

Re: Отрицательные числа в массиве

airyashov » 10 апр 2009, 07:57

Мне не понятна первая часть фразы Установить стратегию "последний подходящий"

Re: Отрицательные числа в массиве

Xariec » 09 апр 2009, 21:02

airyashov, благодарю за список функций прерывания, однако никак не разберусь, как же выполнить поставленное условие в коде :(

Re: Отрицательные числа в массиве

airyashov » 08 апр 2009, 08:45

насчет памяти это здесь
http://www.codenet.ru/progr/dos/int_0026.php
Функция DOS 48H: распределить память (дать размер памяти)
Функция DOS 49H: Освободить блок распределенной памяти
Функция DOS 4aH: Сжать или расширить блок памяти

Re: Отрицательные числа в массиве

Xariec » 07 апр 2009, 20:38

Прошу прощения, но мне опять требуется ваша помощь:
Не могу найти материал и разобраться в управлении памятью в MS-DOS:
Условие таково:
Установить стратегию "последний подходящий", выделить блок памяти размером 16П, увеличить его размер до 64П

Re: Отрицательные числа в массиве

somewhere » 06 апр 2009, 22:22

&quot писал(а):Зачем в комманде пересылки мы ставим "byte ptr[edi]"?
Компилятор, не обладая ИИ, не может угадать какой именно ноль записывать в память. Это может быть 8,16,32 битовый ноль. По сути нет разницы между mov [edi], byte ptr 0 или mov byte ptr [edi], 0. В обоих случаях мы дали понять, что нужно записать именно 8 бит по указанному адресу.

Re: Отрицательные числа в массиве

Xariec » 06 апр 2009, 20:38

[quote="airyashov"][/QUOTE]
Благодарю за правку. Только поясните мне следующее:

Код: Выделить всё

	mov byte ptr[edi],zero 
Зачем в комманде пересылки мы ставим "byte ptr[edi]"?

Re: Отрицательные числа в массиве

somewhere » 06 апр 2009, 10:50

&quot писал(а):А если есть свободный регистр, то перед циклом его можно обнулить, и проводить сравнение не с константой 0, а с этим регистром
Начиная с 386 нет никакой разницы. Да и способов проверки и выставления флагов великое множество. В любом случае приведеный код работать не будет и в любом случае установит первый элемент в 0. Виной тому:
1) EDI не меняется в цикле
2) Элементы массива объявлены как байты, а в коде mov eax, [edi]
3) При нахождении отрицательного числа цикл прекращается

Вернуться к началу