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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2016, 10:48   #1
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
Печаль Встроенный ассемблер сдвигает на бит

В процедуре изменяется значение dest
При работе, если
source 255 (0х11111111)
в dest получается 224 (0х11100000) вместо 240 (0х11110000)

При отладке в регистре EBX значение правильное, но при помещении в переменную dest какая-то ерунда. Что я сделал неправильно.


Код:
Procedure b01_04_hi_asm22 (const source: uint32; var dest: uint8); pascal;
    asm
    PUSH EBP
    PUSH EBX
    XOR EBX, EBX
    MOV EAX, [EBP+$08]
    MOV BL, BYTE PTR [EAX]
    MOV EAX, SOURCE

    TEST EAX, $1
    ADD  EBX, $10

    TEST EAX, $02
    ADD  EBX, $20

    TEST EAX, $04
    ADD  EBX, $40

    TEST EAX, $08
    ADD  EBX, $80


    MOV EAX, [EBP+$08]
    MOV UINT8 PTR [EAX], BL

    POP EBP
    POP EBX

    end;
Turbine вне форума Ответить с цитированием
Старый 21.09.2016, 11:19   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

как то странно Вы отлаживаете.

или компилятор другой (у меня Turbo Delphi == Borland® Delphi® for Microsoft® Windows™ Version 10.0.2558.35231 )

смотрите

Код:
к этой строчке в EBX ноль
ADD  EBX, $10  // в EBX стало 0x00000010

TEST EAX, $02
ADD  EBX, $20 // в EBX стало 0x00000030

TEST EAX, $04
ADD  EBX, $40 // в EBX стало 0x00000070

TEST EAX, $08
ADD  EBX, $80  // в EBX стало 0x000000F0

MOV UINT8 PTR [EAX], BL // вернули значение 0x000000F0 (оно же F0, оно же 240)
что не так?

и возвращается нужное значение:
sshot.png
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2016, 11:21   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а зачем вы кросспостите?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2016, 11:41   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а зачем вы кросспостите?
ну, тут сложный вопрос.. там он обсуждал ассемблер, тут - уже как Delphi принимает/передаёт параметры...

Хотя, по сути, конечно, две темы - это явный кросспост!
я закрою тему http://programmersforum.ru/showthread.php?t=297460
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2016, 11:49   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Turbine, зачем Вы пишете
Цитата:
Код:
MOV EAX, [EBP+$08]
?!

разве так не лучше?
Код:
MOV EAX, dest
тогда сразу будет видно, что у Вас выходное значение зависит от входного (что передали в dest:

Цитата:
Код:
    MOV EAX, [EBP+$08]  // на самом деле это и есть MOV EAX, dest
    MOV BL, BYTE PTR [EAX]

поэтому корректнее вызывать так:

procedure TForm3.Button1Click(Sender: TObject);
var sr : uint32;
dd : uint8;
begin
sr := 255;
dd := 0;
b01_04_hi_asm22(sr, dd);
ShowMessage('dd='+IntToStr(dd));
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2016, 12:05   #6
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, тут сложный вопрос.. там он обсуждал ассемблер, тут - уже как Delphi принимает/передаёт параметры...

Хотя, по сути, конечно, две темы - это явный кросспост!
я закрою тему http://programmersforum.ru/showthread.php?t=297460
Приношу извинения, но как быть в случаях, когда не отвечают.

Просто ситуация странная. Сдвигает на бит и все тут.
Если dest типа байт - 11100000
Если dest сделать типа word, то 0000000111100000

Как получается, что в очевидном алгоритме, когда все верно в регистрах, двигается на бит?
Влияют ли на это ключи компилятора или что-то еще?
Turbine вне форума Ответить с цитированием
Старый 21.09.2016, 12:08   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ещё раз повторяю.
у меня ничего не сдвигает.
выложите исходники проекта на Delphi, где у Вас сдвигает.
посмотрим.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2016, 15:02   #8
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Причина проблемы выяснена. Это косяк компилятора XЕ6. Переписывал по другому. Петрушка та же. Даже если сверять команды с Disassembly написанной на дельфях толку ноль.
На турбо все действительно ок. Но поскольку у товарищей на рабочем месте именно XE6 - то разводим руками.
Всем спасибо!

Последний раз редактировалось Turbine; 21.09.2016 в 15:08.
Turbine вне форума Ответить с цитированием
Старый 21.09.2016, 19:22   #9
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Спешу поделиться тем, что выяснена и причина глюка. На момент компиляции из 24 ГБ памяти было занято около 18. Причем не игрушками, а обработкой данных. Естественно, перезапуск IDE ничего не давал. Она периодически преподносит чудеса, будучи за пределами 32битных адресов. Лично для себя придется это запомнить РАЗ И НАВСЕГДА. Как всегда помогла перезагрузка.
Turbine вне форума Ответить с цитированием
Старый 21.09.2016, 20:15   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Поможет не перезагрузка, а разбор полетов работы с памятью. Вы её где-то загадили самую малость. Вот ваша проблема.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод графики встроенный ассемблер Free Pascal иванлеон Помощь студентам 0 26.04.2012 14:00
Делфи 7 - Встроенный ассемблер Katus Помощь студентам 2 05.02.2012 00:19
скрол браузера сдвигает контент Anait HTML и CSS 0 06.05.2010 12:12
Ковертирование из png 24 бит в png 8 бит isat Общие вопросы .NET 0 22.03.2010 13:38