Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка массива, ошибка при компиляции 
:(
    Опции темы
captan
Дата 14.9.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.9.2008

Репутация: нет
Всего: нет



Здравствуйте!
Помогите доделать сортировку массива из 200 чисел типа WORD.

Компилятор TASM выдает ошибку в 12,13,15,16 строках кода - Illegal indexing mode

Как правильно?!

cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
main:

mov si,offset array
mov cx,200

start:    mov dx,0
sort:    cmp dx,cx
    jge stop
    mov ax,[si+dx*2+2]; ?ошибка
    cmp [si+dx+2],ax  ;   ?ошибка
    jge noswap
    xchg [si+dx*2],ax ;    ?ошибка
    mov [si+dx*2+2],ax; ?ошибка
noswap: inc dx
    jmp start
stop:    loop start

int 20h

array:

nmb=0
rept 200
dw nmb
nmb=nmb+10
endm

cseg ends
end main

Заранее спасибо!
PM MAIL   Вверх
airyashov
Дата 15.9.2008, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



адресация по базе с индексированием и масштабированием появилась только с 386 и только для 32 битных регистров
Код

cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
.386

main:

mov si,offset array
mov cx,200

start:    mov dx,0
sort:    cmp dx,cx
    jge stop
    mov ax,[Esi+Edx*2+2]; ?ошибка
    cmp [Esi+Edx+2],ax  ;   ?ошибка
    jge noswap
    xchg [Esi+Edx*2],ax ;    ?ошибка
    mov [Esi+Edx*2+2],ax; ?ошибка
noswap: inc dx
    jmp start
stop:    loop start

int 20h

array:

nmb=0
rept 200
dw nmb
nmb=nmb+10
endm

cseg ends
end main



--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
captan
Дата 15.9.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.9.2008

Репутация: нет
Всего: нет



Спасибо airyashov за подсказку!

Запускал в отладчиках CodeView, TDebugger - во внешнем цикле LOOP, когда должен был уменьшиться счетчик CX, почему-то перехода не происходило, а выполнялась следующая команда INT 20h.

А вот запустил в отладчике AFDPRO, там все нормально работает.

Хотелось бы для красоты разрешить такой вопрос:
Как можно вывести на экран сначала исходный массив, а после сортировки - отсортированный?
PM MAIL   Вверх
dumb
Дата 15.9.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(captan @  15.9.2008,  18:55 Найти цитируемый пост)
Запускал в отладчиках CodeView, TDebugger - во внешнем цикле LOOP, когда должен был уменьшиться счетчик CX, почему-то перехода не происходило, а выполнялась следующая команда INT 20h.
потому что по Step over(F8 в TD) при прохождении инструкции loop выполняются все итерации цикла. шагай по Step in(F7).

и, кстати, если используешь 32-битные регистры, то и инициализировать надо 32 бита, а не только младшие 16: mov dx, 0 -> mov edx,0(или xor edx,edx), то же с esi.
PM MAIL   Вверх
captan
Дата 15.9.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.9.2008

Репутация: нет
Всего: нет



Все, теперь проблем с пошаговым прохождением нет, спасибо dumb.
Но,после инициализации 32-битовых регистров, появилась другая ошибка.
Транслятор ошибок не выдает,зато компоновщик ругается:

->tasm sort.asm
<- все нормально
->tlink sort.obj /t
<-Error: 32-bit record encountered in module SORT.ASM : use "/3" option

Код

.386
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
cseg segment use32

main:

mov esi,offset array
mov ecx,20

start:    xor edx,edx
sort:    cmp edx,ecx
    jge stop
    mov eax,[esi+edx*2+2]
    cmp [esi+edx*2],eax
    jge noswap
    xchg [esi+edx*2],eax
    mov [esi+edx*2+2],eax
noswap: inc edx
    jmp sort
stop:    loop start

int 20h

array:

nmb=0
rept 20
dw nmb
nmb=nmb+1
endm
cseg ends
end main

PM MAIL   Вверх
dumb
Дата 16.9.2008, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



не нужно все регистры менять на 32-битные - логика меняется. достаточно обнулить старшую часть регистров, используемых при адресации:
Код

main:
xor esi,esi
xor edx,edx
mov si,offset array
mov cx,200
...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.