|
Вопрос # 3 861/ вопрос открыт / |
|
Всем привет!
Снова вопрос по присоединению OBJ файла, скомпилированного в TASM к проекту delphi.
Никто не вкурсе почему не работает команда ROL, в то время как команда ROR работает превосходно, при том что если набирать во встроенном асме то ROL работает.
Если кто знает как можно исправить, или где можно скачать нормальный TASM (WWW.WASM.ru уже пробывал) то пишите.
Приложение: Переключить в обычный режим- ROLROR.asm
- =============================================
- title ROLROR for 32 byte
- .386p
- .MODEL FLAT, STDCall
-
- ;===================================
-
- .DATA
- EXTRN x:BYTE,y:BYTE
-
- ;===================================
-
- .CODE
- PUBLIC ROL1
- PUBLIC ROR1
-
- ;===================================
-
- ROL1 PROC
-
- mov al,x
- mov cl,y
- ror al,cl
- mov x,al
-
- ROL1 ENDP
-
- ;===================================
-
- ROR1 PROC
-
- mov al,x
- mov cl,y
- ror al,cl
- mov x,al
-
- ROR1 ENDP
-
- ;===================================
-
- END
-
- =====================================
-
- unit1.pas
- =====================================
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls;
-
- type
- TForm1 = class(TForm)
- Edit1: TEdit;
- Label1: TLabel;
- Button1: TButton;
- Button2: TButton;
- RadioGroup1: TRadioGroup;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- Procedure ROL1(); STDCall; EXTERNAL;
- Procedure ROR1(); STDCall; EXTERNAL;
- {$L ROLROR}
-
- var
- Form1: TForm1;
- x,y:byte;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- x:=StrToInt(Edit1.Text);
- case radiogroup1.ItemIndex of
- 0:y:=1;
- 1:y:=2;
- 2:y:=3;
- end;
- {asm
- mov cl,y
- rol x,cl
- end;}
- ROL1();
- Edit1.Text:=IntToStr(x);
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- x:=StrToInt(Edit1.Text);
- case radiogroup1.ItemIndex of
- 0:y:=1;
- 1:y:=2;
- 2:y:=3;
- end;
- ROR1();
- Edit1.Text:=IntToStr(x);
- end;
-
- end.
|
Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 8 марта 2010, 13:54
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Паровоз
Здравствуйте, SOA!
Исправляйте текст:
title ROLROR for 32 byte
.386p
.MODEL FLAT, STDCall
;===================================
.DATA
EXTRN x:BYTE,y:BYTE
;===================================
.CODE
PUBLIC ROL1
PUBLIC ROR1
;===================================
ROL1 PROC
PUSHA ;сохраняем регистры
mov al,x
mov cl,y
rol al,cl
mov x,al
POPA ;восстанавливаем регистры
RET
ROL1 ENDP
;===================================
ROR1 PROC
PUSHA ;сохраняем регистры
mov al,x
mov cl,y
ror al,cl
mov x,al
POPA ;восстанавливаем регистры
RET
ROR1 ENDP
;===================================
END
|
Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 8 марта 2010, 22:43
Оценка за ответ: 5
Комментарий к оценке: Большое спасибо.
|
Мини-форум вопроса
Всего сообщений: 40; последнее сообщение — 11 марта 2010, 19:59; участников в обсуждении: 5.
Страницы: [1] [2] [Следующая »]
|
Вадим К (статус: Академик), 8 марта 2010, 16:07 [#1]:
не работает - это не компилируется, или программа компилируется, но выдает неверные результаты?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SOA (статус: Посетитель), 8 марта 2010, 16:17 [#2]:
В том то и дело что прога компилируется, но при нажатиина соответствующие кнопки ROR сдвигает 1 в байте вправо, а rol нет. При этом если я набираю во встроенном asm в delphi то все сдвигается.
|
|
Егор (статус: 10-ый класс), 8 марта 2010, 16:45 [#3]:
вывод - осваиваем си! там просто:
x>>1; y<<1;
и никаких проблем!
)))))))))))))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
SOA (статус: Посетитель), 8 марта 2010, 16:58 [#4]:
Какой исчерпывающий ответ!!!
|
|
Паровоз (статус: 10-ый класс), 8 марта 2010, 17:16 [#5]:
Вы посмотрите повнимательнее свой ассемблерный текст. Там в обеих процедурах выполняется команда ror.
|
|
min@y™ (статус: Доктор наук), 8 марта 2010, 18:26 [#6]:
Чото я не нашёл в твоём ассемблере команды ROL.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 8 марта 2010, 19:52 [#7]:
To паровоз:
действительно при наборе вопроса случилась очепятка, но смысла это не меняет rol не работает, что легко проверить скомпилировав программу.
|
|
min@y™ (статус: Доктор наук), 8 марта 2010, 19:59 [#8]:
Бросай ты это дело.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 8 марта 2010, 20:00 [#9]:
А че так? A?!
|
|
min@y™ (статус: Доктор наук), 8 марта 2010, 20:03 [#10]:
Цитата (SOA):
А че так? A?!
Это моё мнение.
Если хочешь ассемблер + delphi, то лучше юзать именно встроенный.
Отлаживать программы ПРОЩЕ!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 8 марта 2010, 20:06 [#11]:
Я уже писал по поводу встроенного асма кажется.
|
|
min@y™ (статус: Доктор наук), 8 марта 2010, 20:22 [#12]:
Цитата (SOA):
Я уже писал по поводу встроенного асма кажется.
Я помню. [здесь я написал длинную фразу про сабж, но потом подумал и удалил её].
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 8 марта 2010, 20:24 [#13]:
Да Да...
|
|
Паровоз (статус: 10-ый класс), 8 марта 2010, 21:32 [#14]:
Выкладывайте свой obj-файл.
|
|
SOA (статус: Посетитель), 8 марта 2010, 22:17 [#15]:
title ROLROR for 32 byte
.386p
.MODEL FLAT, STDCall
;===================================
.DATA
EXTRN x:BYTE,y:BYTE
;===================================
.CODE
PUBLIC ROL1
PUBLIC ROR1
;===================================
ROL1 PROC
PUSHA ;сохраняем регистры
mov al,x
mov cl,y
rol al,cl
mov x,al
POPA ;восстанавливаем регистры
ROL1 ENDP
;===================================
ROR1 PROC
PUSHA ;сохраняем регистры
mov al,x
mov cl,y
ror al,cl
mov x,al
POPA ;восстанавливаем регистры
ROR1 ENDP
;===================================
END
Ну а сам obj файл сейчас могу разместить только в новом вопросе, так что предлагаю вам воизбежание криков мол неизвестно что я там еще скомпилировал в своем obj файле, скомпилировать его вам в TASM.
|
|
Паровоз (статус: 10-ый класс), 8 марта 2010, 22:23 [#16]:
"предлагаю вам воизбежание криков мол неизвестно что я там еще скомпилировал в своем obj файле, скомпилировать его вам в TASM"
Как раз наоборот, все что Вы скомпилировали в своем obj файле прекрасно видно в окне CPU.
|
|
Вадим К (статус: Академик), 8 марта 2010, 22:42 [#17]:
Замечу, что встроенный ассемблер в последних версиях делфи очень продвинутый, он понимает и MMX, SSE и другие команды.
Но если какой то команды нет, то никто не мешает ее вставить в виде опкода
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 8 марта 2010, 22:47 [#18]:
P.S.
У Вас отсутствут команда возврата из процедуры. Сразу же после ROL1 выполняется процедура ROR1, которая делает обратный сдвиг. Что какается ROR1, то вам просто повезло, что программа не вылетела и после ROR1 идет код не требующий восстановления стека.
|
|
SOA (статус: Посетитель), 9 марта 2010, 10:32 [#19]:
Действительно с ret работает. 8)
|
|
min@y™ (статус: Доктор наук), 9 марта 2010, 10:54 [#20]:
Цитата (SOA):
Действительно с ret работает. 8)
Если бы юзал отладчик - понял бы сразу, в чём ошибка.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|