Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2022, 17:51   #11
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Для того, чтобы точно понять что происходит, при отладке стоит открывать окно Ассемблера (Вид->Отладка->Ассемблер), а не пользоваться редактором и точками останова.
В редакторе всегда написан текст, а в окне Ассемблера уже преобразованный код обратно в текст. Что позволяет точно находить просчеты.
Пока не понял, где это искать...
Изображения
Тип файла: png изображение_2022-06-22_175111618.png (25.9 Кб, 22 просмотров)
Kronos913 вне форума Ответить с цитированием
Старый 22.06.2022, 18:01   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Пока не понял, где это искать...
Поставьте в коде точку останова. После запуска, когда встанете на точке, то CPU строка в последнем меню станет активна.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 22.06.2022, 18:33   #13
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Ctrl+Alt+C после остановки на точке останова в любом месте программы станет доступен. Точки остановки у вас тоже там же - Ctrl+Alt+B.
Перевод этого меню в разных версиях отличается, но окно точно есть - это отладка программы на уровне команд ассемблера.
Изображения
Тип файла: jpg Assembler.jpg (60.5 Кб, 0 просмотров)

Последний раз редактировалось macomics; 22.06.2022 в 18:45.
macomics вне форума Ответить с цитированием
Старый 22.06.2022, 19:53   #14
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Код:
Function Test1(k:byte; s:string4):LongWord;
asm
  mov ecx, 0
  mov eax, 0

  mov edx, s
  mov al, [edx]

  mov cl, k
  mov result, ecx
Просто тестирую. По какой-то непонятной причине, из функции выходит нe переменная k, а длина строки s
Kronos913 вне форума Ответить с цитированием
Старый 22.06.2022, 20:25   #15
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Результат функции обычно возвращается в eax. Как этот код показан через окно CPU? Щелкните слева от номера строки для установки breakpoint и, когда программа на ней остановится, откройте окно CPU и посмотрите последовательность команд. Останавливаться лучше на строке asm или mov ecx, 0

ADD: Компилятор даже функции с asm оформляет кодом пролога и эпилога. В этом коде может содержаться ответ на вопрос почему результат не верный.

Последний раз редактировалось macomics; 22.06.2022 в 20:29.
macomics вне форума Ответить с цитированием
Старый 22.06.2022, 20:53   #16
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Тот же вопрос: откуда возникает баг? Почему в регистрах внезапно равные значения, если не должны быть?
Код:
Function NaturChislo(const s:string255):string255;
var
  b, r:LongWord;
asm
  mov b, ebx

  mov ebx, s

  mov eax, Result
  mov r, eax

                    

  mov ecx, 0
  mov cl, [ebx]



  mov cl, 0
    jne @Go1

  mov [eax], 0
  jmp @Exit1

  @Go1:
  add ecx, ebx    {Почему после этого оператора ecx и ebx равны?!}

  @Start:
    cmp ebx, ecx
      jae @End1

    inc ebx
    mov dl, [ebx]

    cmp dl, 48
      jb @Start
    cmp dl, 57
      ja @Start

    inc eax
    mov [eax], dl

    jmp @Start

  @End1:
  mov ebx, r
  sub eax, ebx
  mov [ebx], al

  @Exit1:
  mov ebx, b
end;
Kronos913 вне форума Ответить с цитированием
Старый 22.06.2022, 21:18   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вы используете условный переход jne, но перед ним только mov команды, которые не меняют флаги, т.е. произойдет или нет переход, определяется не вашим кодом, а где-то до него.
Код:
mov ecx, 0
mov cl, [ebx] // эта строка ничего полезного не делает, так следующая строка запишет ноль
mov cl, 0
Т.е. перед выполнением "add ecx, ebx" в ecx ноль, поэтому после выполнения ecx и ebx равны.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 22.06.2022, 23:19   #18
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Спасибо, я понял, у меня mov вместо cmp
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление лишних символов optimi Microsoft Office Excel 12 03.08.2016 08:28
Удаление лишних символов из Memo NSV Общие вопросы Delphi 10 23.11.2012 08:38
удаление лишних символов Den1zzkkk0 SQL, базы данных 2 27.01.2012 13:27
удаление из строки лишних символов maxefficiently Общие вопросы Delphi 2 01.03.2011 08:53
Вывод без лишних символов Billy Spleen Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 26.01.2010 12:47