1 Востаннє редагувалося Дмитро-Чебурашка (14.11.2014 00:06:32)

Тема: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

      MOV ECX,30
      MOV EAX,00000000
      REP STOS DWORD PTR ES:[EDI]
      XOR EAX,EAX
      XOR ECX,ECX
      XOR EBX,EBX
      XOR EDX,EDX
      LEA ESI,DWORD PTR SS:[EBP+X45]
      LEA EDI,offset buffer
  M2: MOV EAX,DWORD PTR DS:[ESI]
      CMP EAX,0
      JGE SHORT M1
      PUSH 2D
      NEG EAX
  M1: MOV EBX,0A
  oN: DIV EBX
      PUSH EDX
      INC ECX
      CMP EAX,0
      JNZ SHORT oN
     

      
      
      
      Доброго вечора всім!
     Дуже радий потрапити на цей форум. Дуже приємно!
Дуже прошу, допоможіть! Код поза такий. Тобто частина коду. ось в ній і відбувається якась звіряча помилка.
мені ще не доводилось використати команду DIV.  Звичайно я міг написати нісенітницю. Так ось. Дивиться, ніби то все як треба-і де воно помиляється, та й чого??

Мабуть воно ніби поділу відбувається кілька циклів як треба.  Потім же відбувається вже хто знає що, мабудь число стає негативним.

Я ж гадав буде поділу до нуля, і з мого коду це можна побачити.



Заздалегідь дуже дякую!!!   Друзі  та  форумчани, навчить будь ласка!  Не залиште в невіданні!  Дуже чекаю відповідей..

Може не розибравсь з темою. Шановні модератори!  Якщо щось не те- розділ форуму не тієї або що- прошу вибачення! Перенесіть я врахую на майбутнє

2

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Зазвичай асемблер пише що його не влаштовує. Мене - все не влаштовує, то ж будемо по черзі розбирати помилки. Прошу винести першу помилку, що видав асемблер, в студію!

3 Востаннє редагувалося Дмитро-Чебурашка (14.11.2014 23:30:49)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Спасибі! Не чекав сьогодні відповіді!
Помилок, як таких - немає. Справа в тому, що код нічого не робить і навiть зациклюється.

Взагалі я хотiв, щоб велике шістнадцяткове число перетворювалось на десятковий рядок. Але вже 8 годин мізкiв
не вистачає ..

Просте але якесь неохватне завдання!!!!!
Ось наприклад    скажемо якесь str1         "A2B36ED2019"    у 
str2     "313131383037323133831343031"

4 Востаннє редагувалося Chemist-i (14.11.2014 01:07:20)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Дмитро-Чебурашка написав:

Спасибі! Не чекав сьогодні відповіді!
Помилок, як таких - немає. Справа в тому, що код нічого не робить і навiть зациклюється.

Взагалі я хотiв, щоб велике шістнадцяткове число перетворювалось на десятковий рядок. Але вже 8 годин мізкiв
не вистачає ..

Простo, але якась неохватна задача!!!!!
Ось наприклад    скажiмо якесь str1         "A2B36ED2019"    у 
str2     "313131383037323133831343031"

Мені чомусь сі здало, що Ви з чебурнету прийшли.

Подякували: Дмитро-Чебурашка1

5 Востаннє редагувалося koala (14.11.2014 07:32:09)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Пане Дмитро-Чебурашка, за наведених умов цей код точно не робитиме того, що ви хочете - хоча б тому, що в ньому жодного разу не згадується ані str1, ані str2. Ну і ніколи не припускайте, що з некоректного коду можна щось побачити - хоча б тому, що він некоректний. Ну базова ж логіка: ваш код робить не те, що вам треба - то яким чином інші з коду, що робить не те, здогадаються, що саме вам треба?

Подякували: Дмитро-Чебурашка1

6

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Я пропоную вам зробити за наступною схемою:
Стрічку з шістнадцятковим числом спочатку перетворюєте на DWord, а потім одержаний результат перетворюєте на стрічку з десятковим числом

7 Востаннє редагувалося Дмитро-Чебурашка (14.11.2014 20:31:24)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Peretvorennja@2 proc

      PUSH EBP
      MOV EBP,ESP
      SUB ESP,0C0
      PUSH EBX
      PUSH ESI
      PUSH EDI
      LEA EDI,DWORD PTR SS:[EBP-C0]
      MOV ECX,30
      MOV EAX,00000000
      REP STOS DWORD PTR ES:[EDI]
      XOR EAX,EAX
      XOR ECX,ECX
      XOR EBX,EBX
      XOR EDX,EDX
      LEA ESI,DWORD PTR SS:[EBP+X45]
      LEA EDI,offset buffer
 M2:  MOV EAX,DWORD PTR DS:[ESI]
      CMP EAX,0
      JGE SHORT M1
      PUSH 2D
      NEG EAX
 M1:  MOV EBX,0A
 opN: DIV EBX
      PUSH EDX
      INC ECX
      CMP EAX,0
      JNZ SHORT opN:
      MOV AH,2
 M3:  POP DX
      ADD DL,30
      MOV BYTE PTR DS:[EDI],DL
      INC EDI
      LOOPD M3
 M5:  MOV BYTE PTR DS:[EDI],0
      LEA ESI,DWORD PTR SS:[EBP+C]
      CMP CL,0
      JG SHORT M2
      DEC CL
      MOV ESI,ESP
      PUSH [zapalyuvach]                       
      CALL DWORD PTR DS:[<drukuvatel`>]  
      ADD ESP,4
      CMP ESI,ESP
      CALL zakry`vashka
      POP EDI
      POP ESI
      POP EBX
      ADD ESP,0C0
      CMP EBP,ESP
      CALL zakry`vashka
      MOV ESP,EBP
      POP EBP
      RETN


Peretvorennja@2 endp


Я насправді може бути погано написав. В першу чергу мене ту цікавить що- в регістр EAX потрапляє число і ми (я) його ділимо на 10
(0Ah відповідно). Ділимо перший, ділимо другий. Залишок кладемо в стек. Ось, в EAX повинен залишитися 0? Ну адже повинен?
Я значить не розумію що у мене відбувається.

Далі все оте кодоверчння можна і не роздивлятися. Я багато разів дописував строчки, старі закоментувавши крапками з комою, нові й нові,
все поступово змінювалося до невпізнання .. Частини видаляв. Там просто чортзна-що.

Велике спасибі !!!!!!

за Наступний схемою:
Стрічку з шістнадцятковім числом спочатку перетворюєте на DWord, а потім одержаний результат перетворюєте на стрічку з десятковім числом

Так. Але з початку  чого воно не ділиться?


А саме ось це, саме тут вміст регістра EAX ділиться на 10, по моїй задумці. Саме тут трапляється щось не те.

 M1:  MOV EBX,0A
 opN: DIV EBX
      PUSH EDX
      INC ECX
      CMP EAX,0
      JNZ SHORT opN 

8

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

А саме ось це, саме тут вміст регістра EAX ділиться на 10, по моїй задумці.

Ділиться не EAX, а EDX:EAX :) Тобто перед діленням треба обнулити EDX. Докладніше читайте тут

Подякували: koala, Дмитро-Чебурашка2

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Дуже дякую!!!!    ООООО!!

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Величезнише спасибі!!!  Усе стає на свої місця! Все зрозумiло.

11 Востаннє редагувалося Дмитро-Чебурашка (16.11.2014 12:59:47)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Доброго вечора !! Функція до сьогоднішнього вечора працює в цілому так як треба. Наприклад в рядок перетворювалися нормально шістнадцяткові числа
2F410BC0 і так далі. І раптом програма падає! Розбираюся. В регістр EAX потрапляє FFFF811B- негативне число, власне.
Далі воно потрапляє до виконаня додатковою ділянкою кода- команди NEG EAX, переходить в позетивне число ( Тобто зберігається число по модулю).
І все- тут програма падає .. Точно це на діленні. я впевнений в цьому. Підкажіть будь ласка що не так. Як виправити. Що можна перебудувати.
Чого це воно взагалі що ж таке?
Ніби ж то і на перший і на другий погляд все горазд, число по модулю невелике, ділення на нуль свідомо немає ..

                                                       
     

    Peretvorennja@2 proc

      PUSH EBP
      MOV EBP,ESP
      SUB ESP,0C0h
      PUSH EBX
      PUSH ESI
      PUSH EDI
      LEA EDI,DWORD PTR SS:[EBP-C0h]
      MOV ECX,30h
      MOV EAX,00000000
      REP STOS DWORD PTR ES:[EDI]
      MOV EBX,1
      PUSH EBX
      XOR EAX,EAX
      XOR ECX,ECX
      XOR EBX,EBX
      XOR EDX,EDX
      LEA ESI,DWORD PTR SS:[EBP+X1]
      LEA EDI,offset buffer
 M2:  MOV EAX,DWORD PTR DS:[ESI]
      CMP EAX,0
      JGE SHORT M1
      PUSH 2Dh
      INC ECX
      NEG EAX
 M1:  MOV EBX,0Ah
 opN: DIV EBX
      PUSH EDX
      XOR EDX,EDX
      INC ECX
      CMP EAX,0
      JNZ SHORT opN
      MOV AH,2
 M3:  POP EDX
      ADD DL,30h
      MOV BYTE PTR DS:[EDI],DL
      INC EDI
      LOOPD M3
      MOV BYTE PTR DS:[EDI],0
      POP ECX
      CMP ECX,1
      JNZ SHORT mm1
      LEA ESI,DWORD PTR SS:[EBP+X2]
      XOR ECX,ECX
      PUSH ECX
      JMP SHORT M2
mm1:  MOV ESI,ESP
      PUSH [zapalyuvach]                       
      CALL DWORD PTR DS:[<drukuvatel`>]  
      ADD ESP,4
      CMP ESI,ESP
      CALL zakry`vashka
      POP EDI
      POP ESI
      POP EBX
      ADD ESP,0C0
      CMP EBP,ESP
      CALL zakry`vashka
      MOV ESP,EBP
      POP EBP
      RETN


Peretvorennja@2 endp
 

12 Востаннє редагувалося Дмитро-Чебурашка (16.11.2014 00:31:21)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

тобто рядок 28- саме там падає

13

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Може Ви на 0 ділите?
що там за дані за зміщенням 0Ah? Подивіться дебагером.

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Дивиться, як в мене код кльово кольорово засвічіний.

Так набагато краще, ніж сире забарвлення! Набагато!

Гаразд я пізніше дам подивитися.

Нотепад рулює!

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Я  ділю там на десять і лише на десять, нічого іншого не мається на увазі, точно.  Добре, погляну дебаггером.

16 Востаннє редагувалося Дмитро-Чебурашка (16.11.2014 01:25:00)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

зміщенням 0ah-   це не зміщення,  це дільник. Просто цифра.





До речі, дебаггер порадьте, кльовий.   Я вже не міркую на сьогодні.  Поки напевно. Гарної ночі  Спокійних снів всім.

17 Востаннє редагувалося 0xDADA11C7 (16.11.2014 02:14:12)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

В регістр EAX потрапляє FFFF811B- негативне число, власне.

Для команди DIV це беззнакове число, якщо вам потрібне знакове ділення - використовуйте IDIV. Тобто не треба жадних NEG
Стосовно знежучувачів - погляньте на OllyDebug і WinDbg.
Наступне - ваш асм генерує два пролога для хвункції, що не є гут. Перший ви самі пишете, а другий він автоматично робить через директиву proc.

Peretvorennja@2 proc
PUSH EBP
MOV EBP,ESP
SUB ESP,0C0h

Взагалі оформіть код по-людськи - додайте назви параметрів, локальні змінні і все що може зробити макроасемблер оддайте макроасемблеру.

Подякували: Дмитро-Чебурашка1

18 Востаннє редагувалося Дмитро-Чебурашка (16.11.2014 13:01:14)

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

Велике спасибі!!! Так набагато краще. Правда цінні поради. Порозбираюся в коді ще. До речі
я, баран, не передбачив лишнього разу обнулити рэгістр EDX ось

EAX 00007ee5
ECX 00000001
EDX 00000035
EBX 0000000a
ESP 0012fd4c
EBP 0012fe20
ESI 0012fe2c
EDI 0041701d Umn14.0041701d
EIP 00411816 Umn14.00411816



оддайте-  мабудь віддайте чи якось так. Адже віддасте, віддам, невіддам. Трохи слух ріже (зір точнише. ) До речі я й сам пишу з величезнишою і багатеннішую килькістю помилок так що шноди я прошу батька або брата подивитися перед відправленням поста, причому на усих мовах.

19

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

В моїй східняцькій говірці більше од- ніж від-, а в деяких говірках наявне навіть чергування цього.

Re: мова асемблера-Пожалуста допоможіть розібрати роботу ділянки коду

А, зрозуміло. Спасибі.  Тоді я останні рядки свого поста залишу, нормально. А то я їх прибрати хотів, нехай буде.   Я трохи сумбурно але міркую що зрозуміло.