Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к элементам массива(NASM) 
V
    Опции темы
TrЭin3e
  Дата 3.5.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



программа должна провести пирамидальную сортировку массива.
компилятор NASM выдает ошибку при обращении к элементам массива след. образом: mas[i].
Подскажите, как избавиться от этой ошибки.
Код

global _main
extern _printf
extern _scanf
extern _getch

BITS 32

segment .stack use 32
stack times 1000 db 0

segment .data use32
mas db 12,42,23,62,21,34,63      
x db 0              ; временная переменная
i dw 0
l dw 0
m dw 0
j dw 0
k dw 0

segment .code use32

;процедура insert_item_in_tree(i, mas, N)
_insert_item_in_tree:
    push si
    push cx
    mov j, si      ; j := i
@@m4:    mov si, j      ; j -> si
    mov ax, j      ; k := 2*j; l := k+1
    shl ax, 1      ; j*2
    mov k, ax      ; k := j*2
    inc ax
    mov l, ax      ; l := k+1
    cmp ax, m      ; l < m?
    ja @@m2
    mov al, mas[si-1] ; ax := mas[j]
    mov di, k
    cmp al, mas[di-1]
    jna @@m6
    inc di
    cmp al, mas[di-1]
    jna @@m6
    jmp @@m2
; условие выполнилось:
; 2j+1 =< M AND (mas[j] < mas[2j] OR mas[j] < mas[2j+1])
; обмен с mas[j]
@@m6:    mov di, k
    mov al, mas [di-1] ; ax := mas[k]
    inc di
    cmp al, mas[di-1]  ; mas[k] > mas[l]?
    jna @@m3
    mov al, mas[si-1]
    mov x, al       ; x := mas[j]
    dec di
    mov al, mas[di-1]
    mov mas[si-1], al  ; mas[j] := mas[k]
    mov j, di       ; j := k
    mov al, x
    mov mas[di-1], al  ; mas[k] := x
    jmp @@m4
; @@m3: x := mas[j] перейти на @@m1
@@m3:    mov al, mas[si-1]  ; mas[k] <= mas[l]
    mov x, al       ; x := mas[j]
    mov al, mas[di-1]
    mov mas[si-1], al  ; mas[j] := mas[l]
    mov j, di       ; j := l
    mov al, x
    mov mas[di-1], al
    jmp @@m4
; условие выполнилось:
; 2j+1 =< M AND (mas[j] < mas[2j] OR mas[j] < mas[2j+1])
@@m2:    mov ax, k
    cmp ax, m
    jne @@m1
    mov di, k
    mov al, mas[di-1]  ; al := mas[k]
    cmp mas[si-1], al  ; mas[j] < mas[k]?
    jae @@m1
    mov al, mas[si-1]
    mov x, al
    mov di, n
    mov al, mas[di-1]
    mov mas[si-1], al  ; mas[j] := mas[n]
    mov al, x
    mov mas[di-1], al  ; mas[n] := x
@@m1:    pop cx
    pop si
    ret
ret

_main:
    ;...
    mov ax, n       ; n-1
    mov m, ax       ; m := n
    shr ax, 1
    mov i, ax       ; i := n/2
    mov l, ax       ; l := i
; строим пирамиду на основе входного массива:
    mov cx, l       ; цикл по k := 1..l
    mov si, i
@@cycl1:mov i, si
    call _insert_item_in_tree
    dec si           ; i := i-1
    loop @@cycl1
; а теперь собственно сортировка:
    mov cx, n-1       ; n-2
@@cycl2:xor si, si
    mov al, mas[si]
    mov x, al
    mov di, m
    mov al, mas[di-1]
    mov mas[si], al       ; mas[1] := mas[m]
    mov al, x
    mov mas[di-1], al  ; mas[m] := x
    dec m
    inc si           ; i := 1
    call _insert_item_in_tree
    loop @@cycl2
    ;...
ret

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

Это сообщение отредактировал(а) TrЭin3e - 3.5.2009, 15:25
PM MAIL   Вверх
Mikl_
Дата 4.5.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TrЭin3e, похоже, что ты скопировал на NASM задачу, которую писали на TASM или на MASM (другие диалекты ассемблера)
основная типичная ошибка строка 32 mov l, ax      ; l := k+1 для NASM название переменной без скобок как у тебя l -- это адрес переменной, а если учесть что у тебя на строке 6 указано BITS 32 то адрес переменной это двойное слово, а не l dw 0 по смыслу должно быть mov [l],ax передать содержимое регистра AX в переменную по имени l то есть необходимы квадратные скобки с именем переменной. Вторая типичная ошибка (на которую ты кстати и жалуешься) строка 75 mov al, mas[di-1]  для TASM и MASM такая конструкция подходит, а для NASM должно быть только так mov al, [mas+di-1]  еще одна ошибка -- строка 105 mov cx, n-1   в ассемблере должно быть сделано в два этапа: сперва mov cx, [n]   а затем dec cx строка 114 dec m даже когда поставишь квадратные скобки NASM выдаст ошибку operation size not specified должно быть dec word [m]  smile 
PM MAIL   Вверх
TrЭin3e
Дата 4.5.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Mikl_, спасибо огромное! smile 
кстати, вы абсолютно правы - я переделывал код TASM'а, т.к. по NASM'у не нашел примеров(и литературы вообще, если знаете - посоветуйте) в которых бы разбиралась работа с массивами.
также спасибо за то, что указали на другие ошибки, хотя их я скорее всего сам бы нашел после запуска программы.
теперь пойду тестить алгоритм.

Цитата(Mikl_ @  4.5.2009,  11:43 Найти цитируемый пост)
строка 105 mov cx, n-1   в ассемблере должно быть сделано в два этапа: сперва mov cx, [n]   а затем dec cx

здесь я с вами не согласен. разве будет ошибочным следующий код: mov cx, [n]-1 ?

Это сообщение отредактировал(а) TrЭin3e - 4.5.2009, 19:45
PM MAIL   Вверх
Mikl_
Дата 5.5.2009, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(TrЭin3e )
здесь я с вами не согласен. разве будет ошибочным следующий код: mov cx, [n]-1 ?

Будет error: invalid combination of opcode and operands
Подумай сам, компилятор NASM не знает о содержимом переменной n поэтому подставить в код число соответствующее содержимому n и отнять единицу он не может. Другое дело -- адрес переменной n, но взять адрес слова и отнять от него единицу компилятор может, только получится адрес чего? Еще один вариант -- n объявлен как константа диррективой %define n 100 тогда компилятор заменит код  mov cx,n-1 на код mov cx,99 но в этом случае не нужны квдратные скобки, правда и значение n нельзя изменить
Цитата(TrЭin3e )
т.к. по NASM'у не нашел примеров(и литературы вообще, если знаете - посоветуйте

Правда? smile  Зайди на сайт http://visual-assembler.pt.vu/ или http://asmgges.chez.com/nasm.html или набери в Google строке:  NASM и сразу будет предложена NASM документация, NASM manual, NASM tutorial, NASM hello world и так далее  smile 

Это сообщение отредактировал(а) Mikl_ - 5.5.2009, 09:46
PM MAIL   Вверх
TrЭin3e
Дата 6.5.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Mikl_ @  4.5.2009,  11:43 Найти цитируемый пост)
а для NASM должно быть только так mov al, [mas+di-1]

попробовал так сделать, но компилятор выдает следующую ошибку:
"COFF format does not support non-32-bit relocations"
подскажите, что не так на этот раз?
PM MAIL   Вверх
Mikl_
Дата 7.5.2009, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TrЭin3e
строка 6 BITS 32
а по тексту ниодного обращения к 32-битным регистрам
замени на BIT 16 и приведи текст bat- файла, которым собираешь свой exe-шник может быть в нем не те ключи указаны smile 
PM MAIL   Вверх
TrЭin3e
Дата 7.5.2009, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



компилирую 2мя строчками:
1) nasm -f win32 XXX.asm после выдает ошибки
2) gcc XXX.obj
PM MAIL   Вверх
Mikl_
Дата 7.5.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TrЭin3e
программа, которую ты пишешь должна работать c DOS функциями или с WinAPI?
До этого ты создавал рабочие программы в NASM?
PM MAIL   Вверх
dumb
Дата 7.5.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



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

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

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


 




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


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

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