Поиск:

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


Новичок



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

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



Сильно не ругайтесь я только начал изучать Asm
Помогите отредактировать код. Вот само задание: Дан массив размерности n. Перевернуть массив a(n)=a(0), a(n-1)=a(1) и т.д. 

Код

.586
    .model flat, stdcall    
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\masm32.inc
    include \masm32\include\msvcrt.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\msvcrt.lib
.data
req db  'Введите количество элементов:',0
tpt db  '%d',0
mtpt    db  'mas[%d]= ',0
dtpt    db  'mas[%d]= %d\n\r',0
@cls    db  'cls',0
.data?
n   dd  ?
mas dd  ?
res dd  ?
.code
start:
;system ("chcp 1251");
    invoke  SetConsoleCP, 1251
    invoke  SetConsoleOutputCP, 1251
;system ("cls");
    invoke  crt_system, ADDR @cls
;printf ("Введите количество элементов:");
    invoke  crt_puts, ADDR req
;scanf ("%d",&n);
    invoke  crt_scanf, ADDR tpt, ADDR n
;mas=(int*) malloc(n*sizeof(int));
    mov eax,[n]
    shl eax,2       ; n*sizeof(int)
    invoke  crt_malloc, eax
    mov [mas], eax
;for(i=0;i<n;i++)
;{printf("mas[%d]= ",i);
;scanf("%d",&mas[i]);
;}
    xor edx, edx
    mov ecx, [n]
    mov esi, [mas]
@@: push    ecx         ; ecx, edx загадятся
    push    edx     ;
    invoke  crt_printf, ADDR mtpt, edx ; mtpt   db  'mas[%d]= ',0
    invoke  crt_scanf, ADDR tpt, esi
    pop edx
    pop ecx
    add esi,4
    inc edx
    loop    @B
;for(i=0;i<n/2;i++)
    xor edx, edx
    mov ecx, [n]
    shr ecx, 1      ; n/2
    mov esi, [mas]
@@: 
;{temp = mas[i];
    push    [esi]
;mas[i] = mas[n-i-1];
    mov ebx,[n]
    sub ebx, edx
    dec ebx
    mov eax, mas[ebx]
    mov [esi], eax
;mas[n-i-1] = temp;}
    pop mas[ebx]
    inc edx
    add esi,4
    loop    @B
 
;for(i=0;i<n;i++)
;printf("%d ",mas[i]);
    mov ecx, [n]
    xor edx, edx
    mov esi,[mas]
@@: lodsd
    push    ecx
    push    edx
    invoke  crt_printf, dtpt, edx, eax
    pop edx
    pop ecx
    inc edx
    loop    @B
 
    invoke  crt__getch
exit:
    invoke  crt_free,[mas]
    invoke  crt_exit,0
 
    end start

PM MAIL   Вверх
ФедосеевПавел
Дата 13.5.2014, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я могу ошибаться, но при перемещении по массиву регистр нужно не на 1 изменять, а на размер элемента в байтах, т.е.
Код
@@: 
;{temp = mas[i];
    push    [esi]
;mas[i] = mas[n-i-1];
    mov ebx,[n]
    sub ebx, edx
    dec ebx
    mov eax, mas[ebx]      <-------- здесь ebx - индекс, а не смещение
    mov [esi], eax
;mas[n-i-1] = temp;}
    pop mas[ebx]
    inc edx
    add esi,4                           <------ тут всё правильно, в esi - смещение
    loop    @B

А почему ты не хочешь идти навстречу двумя смещениями esi и edi?
PM   Вверх
SaYfeR
Дата 13.5.2014, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ФедосеевПавел, 
Цитата

А почему ты не хочешь идти навстречу двумя смещениями esi и edi? 

а как?
PM MAIL   Вверх
ФедосеевПавел
Дата 13.5.2014, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не проверял, только предполагаю, что будет работать
Код

    mov eax, [n]
    dec eax
    mov ebx, 4      <---- sizeof int
    mul ebx
    mov edi, eax        <---- теперь edi указывает на mas[n-1]

@@: 
;{temp = mas[i];
    push    [esi]
;mas[i] = mas[n-i-1];
    mov eax, mas[edi]
    mov [esi], eax
;mas[n-i-1] = temp;}
    pop mas[edi]
    add esi, 4
    sub edi, 4
    loop    @B

Примерно так.
PM   Вверх
SaYfeR
Дата 13.5.2014, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ругается на duplicate declaration of: @@
Цитата

Код

@@: 
;{temp = mas[i];
    push    [esi]
;mas[i] = mas[n-i-1];
    mov eax, mas[edi]
    mov [esi], eax
;mas[n-i-1] = temp;}
    pop mas[edi]
    add esi, 4
    sub edi, 4
    loop    @B



Добавлено через 1 минуту и 58 секунд
ФедосеевПавел,  как это можно исправить?

PM MAIL   Вверх
ФедосеевПавел
Дата 14.5.2014, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не знаю.

Я взял твою программу из поста №1, заменил один цикл на приведённый в моём посте, при компиляции и линковке в masm32 (я воспользовался оболочкой qeditor) выдало ошибки на какие-то вызовы API Win32, я скопировал "шапку" include/includelib из какого-то примера. Теперь компиляция без ошибок. Ошибок с метками не возникало. Я не отлаживал код и не знаю, как он работает (сейчас тороплюсь)
Код

.586
    .model flat, stdcall    
    option casemap :none


;     include files
;     ~~~~~~~~~~~~~
      include \MASM32\INCLUDE\windows.inc
      include \MASM32\INCLUDE\masm32.inc
      include \MASM32\INCLUDE\gdi32.inc
      include \MASM32\INCLUDE\user32.inc
      include \MASM32\INCLUDE\kernel32.inc
      include \MASM32\INCLUDE\Comctl32.inc
      include \MASM32\INCLUDE\comdlg32.inc
      include \MASM32\INCLUDE\shell32.inc

      include \masm32\include\msvcrt.inc
      include \masm32\macros\macros.asm


;     libraries
;     ~~~~~~~~~
      includelib \MASM32\LIB\masm32.lib

      includelib \MASM32\LIB\gdi32.lib
      includelib \MASM32\LIB\user32.lib
      includelib \MASM32\LIB\kernel32.lib
      includelib \MASM32\LIB\Comctl32.lib
      includelib \MASM32\LIB\comdlg32.lib
      includelib \MASM32\LIB\shell32.lib

      includelib \masm32\lib\msvcrt.lib
      includelib \masm32\lib\masm32.lib


.data
req db  'Введите количество элементов:',0
tpt db  '%d',0
mtpt    db  'mas[%d]= ',0
dtpt    db  'mas[%d]= %d\n\r',0
@cls    db  'cls',0
.data?
n   dd  ?
mas dd  ?
res dd  ?
.code
start:
;system ("chcp 1251");
    invoke  SetConsoleCP, 1251
    invoke  SetConsoleOutputCP, 1251
;system ("cls");
    invoke  crt_system, ADDR @cls
;printf ("Введите количество элементов:");
    invoke  crt_puts, ADDR req
;scanf ("%d",&n);
    invoke  crt_scanf, ADDR tpt, ADDR n
;mas=(int*) malloc(n*sizeof(int));
    mov eax,[n]
    shl eax,2       ; n*sizeof(int)
    invoke  crt_malloc, eax
    mov [mas], eax
;for(i=0;i<n;i++)
;{printf("mas[%d]= ",i);
;scanf("%d",&mas[i]);
;}
    xor edx, edx
    mov ecx, [n]
    mov esi, [mas]
@@: push    ecx         ; ecx, edx загадятся
    push    edx     ;
    invoke  crt_printf, ADDR mtpt, edx ; mtpt   db  'mas[%d]= ',0
    invoke  crt_scanf, ADDR tpt, esi
    pop edx
    pop ecx
    add esi,4
    inc edx
    loop    @B
;for(i=0;i<n/2;i++)
    xor edx, edx
    mov ecx, [n]
    shr ecx, 1      ; n/2
    mov esi, [mas]


    mov eax, [n]
    dec eax
    mov ebx, 4;      <---- sizeof int
    mul ebx
    mov edi, eax;        <---- теперь edi указывает на mas[n-1]

@@: 
;{temp = mas[i];
    push    [esi]
;mas[i] = mas[n-i-1];
    mov eax, mas[edi]
    mov [esi], eax
;mas[n-i-1] = temp;}
    pop mas[edi]
    add esi, 4
    sub edi, 4
    loop    @B

 
;for(i=0;i<n;i++)
;printf("%d ",mas[i]);
    mov ecx, [n]
    xor edx, edx
    mov esi,[mas]
@@: lodsd
    push    ecx
    push    edx
    invoke  crt_printf, dtpt, edx, eax
    pop edx
    pop ecx
    inc edx
    loop    @B
 
    invoke  crt__getch
exit:
    invoke  crt_free,[mas]
    invoke  crt_exit,0
 
    end start

PM   Вверх
ФедосеевПавел
Дата 14.5.2014, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SaYfeR, попробовал я запустить компилирующуюся прогу - она закрылась с ошибкой. Запустил её в отладчике OllyDbg, нашёл, что ты неправильно вызываешь printf при выводе результатов обмена (забыл ADDR). Заодно, я подправил свой вариант цикла обмена.
Т.к. для меня это вторая программа на ассемблере для Windows, то я не разобрался:
1) с выводом строки в printf - выводится весь массив в одну строку без перевода строки;
2) переключением кодовой страницы - вместо русских букв - кракозябры.
Код

.586
    .model flat, stdcall    
    option casemap :none


;     include files
;     ~~~~~~~~~~~~~
      include \MASM32\INCLUDE\windows.inc
      include \MASM32\INCLUDE\masm32.inc
      include \MASM32\INCLUDE\gdi32.inc
      include \MASM32\INCLUDE\user32.inc
      include \MASM32\INCLUDE\kernel32.inc
      include \MASM32\INCLUDE\Comctl32.inc
      include \MASM32\INCLUDE\comdlg32.inc
      include \MASM32\INCLUDE\shell32.inc

      include \masm32\include\msvcrt.inc
      include \masm32\macros\macros.asm


;     libraries
;     ~~~~~~~~~
      includelib \MASM32\LIB\masm32.lib

      includelib \MASM32\LIB\gdi32.lib
      includelib \MASM32\LIB\user32.lib
      includelib \MASM32\LIB\kernel32.lib
      includelib \MASM32\LIB\Comctl32.lib
      includelib \MASM32\LIB\comdlg32.lib
      includelib \MASM32\LIB\shell32.lib

      includelib \masm32\lib\msvcrt.lib
      includelib \masm32\lib\masm32.lib


.data
req db  'Введите количество элементов:',0
tpt db  '%d',0
mtpt    db  'mas[%d]= ',0
dtpt    db  'mas[%d]= %d\n\r',0
@cls    db  'cls',0
.data?
n   dd  ?
mas dd  ?
res dd  ?
.code
start:
;system ("chcp 1251");
    invoke  SetConsoleCP, 1251
    invoke  SetConsoleOutputCP, 1251
;system ("cls");
    invoke  crt_system, ADDR @cls
;printf ("Введите количество элементов:");
    invoke  crt_puts, ADDR req
;scanf ("%d",&n);
    invoke  crt_scanf, ADDR tpt, ADDR n
;mas=(int*) malloc(n*sizeof(int));
    mov eax,[n]
    shl eax,2       ; n*sizeof(int)
    invoke  crt_malloc, eax
    mov [mas], eax
;for(i=0;i<n;i++)
;{printf("mas[%d]= ",i);
;scanf("%d",&mas[i]);
;}
    xor edx, edx
    mov ecx, [n]
    mov esi, [mas]
@@: push    ecx         ; ecx, edx загадятся
    push    edx     ;
    invoke  crt_printf, ADDR mtpt, edx ; mtpt   db  'mas[%d]= ',0
    invoke  crt_scanf, ADDR tpt, esi
    pop edx
    pop ecx
    add esi,4
    inc edx
    loop    @B
;for(i=0;i<n/2;i++)
    mov ecx, [n]
    shr ecx, 1      ; n/2

    mov esi, [mas]

    mov eax, [n]
    dec eax
    mov ebx, 4;          <---- sizeof int
    mul ebx
    mov edi, [mas]
    add edi, eax;        <---- теперь edi указывает на mas[n-1]

@@: 
;{temp = mas[i];
    push    [esi]
;mas[i] = mas[n-i-1];
    mov eax, [edi]
    mov [esi], eax
;mas[n-i-1] = temp;}
    pop [edi]
    add esi, 4
    sub edi, 4
    loop    @B

 
;for(i=0;i<n;i++)
;printf("%d ",mas[i]);
    mov ecx, [n]
    xor edx, edx
    mov esi, [mas]
@@: mov     eax, [esi]
    add     esi, 4
    push    ecx
    push    edx
    invoke  crt_printf, ADDR dtpt, edx, eax
    pop edx
    pop ecx
    inc edx
    loop    @B
 
    invoke  crt__getch
exit:
    invoke  crt_free,[mas]
    invoke  crt_exit,0
 
    end start

PM   Вверх
SaYfeR
Дата 15.5.2014, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ФедосеевПавел, в .data добавил
Код

chcp    db  'chcp 1251',0


и заменил
Код

invoke  SetConsoleCP, 1251
invoke  SetConsoleOutputCP, 1251

вот этим
Код

invoke  crt_system, ADDR chcp

Вроде работает, так что огромное СПАСИБО за помощь новичку.

Добавлено через 2 минуты и 56 секунд
сможете еще вот этот код посмотреть
Код

.586
    .model flat, stdcall    
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\masm32.inc
    include \masm32\include\msvcrt.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\msvcrt.lib
.data
reqa    db  'Введите a:',0
reqb    db  'Введите b:',0
reqn    db  'Введите n:',0
tpt db  '%d',0
res db  'a*n/b=%d\n\r',0
@cls    db  'cls',0
.data?
a   dd  ?
b   dd  ?
n   dd  ?
.code
start:
;system ("chcp 1251");
    invoke  SetConsoleCP, 1251
    invoke  SetConsoleOutputCP, 1251
;system ("cls");
    invoke  crt_system, ADDR @cls
;printf ("Введите a:");
    invoke  crt_puts, ADDR reqa
;scanf ("%d",&a);
    invoke  crt_scanf, ADDR tpt, ADDR a
;printf ("Введите n:");
    invoke  crt_puts, ADDR reqn
;scanf ("%d",&n);
    invoke  crt_scanf, ADDR tpt, ADDR n
;printf ("Введите b:");
    invoke  crt_puts, ADDR reqb
;scanf ("%d",&b);
    invoke  crt_scanf, ADDR tpt, ADDR b
;s=a*n/b;
    mov eax, [a]
    cdq
    imul    [n]
    idiv    [b]
;printf ("a*n/b=%d",s);
    invoke  crt_printf, ADDR res, eax
;getch();
    invoke  crt__getch
exit:
;exit(0);
    invoke  crt_exit,0

    end start

PM MAIL   Вверх
ФедосеевПавел
Дата 15.5.2014, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Могу. Посмотрел. smile 

Опять вижу
Код
invoke  SetConsoleCP, 1251
invoke  SetConsoleOutputCP, 1251


Опять при компиляции и линковке выдаёт ошибку из-за отсутствия какой-то библиотеки.

Это сообщение отредактировал(а) ФедосеевПавел - 15.5.2014, 15:33
PM   Вверх
SaYfeR
Дата 15.5.2014, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ФедосеевПавел,  опять не заметил
Код

invoke  SetConsoleCP, 1251
invoke  SetConsoleOutputCP, 1251

значит все дело в отсутствии библиотеки?
PM MAIL   Вверх
ФедосеевПавел
Дата 15.5.2014, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Когда линкер выдаёт ошибку "error LINK2001: unresolved external symbol _ExitProcess@4" - да, это отсутствие описания в includelib. Можешь подобавлять include и includelib из раннего примера и убедится, что ошибки компиляции и линковки исчезнут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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