Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

delphi+assembler

76K
06 декабря 2011 года
skynex
5 / / 06.12.2011
Всем привет! Нужна помощь...
Есть уже готовая програма-калькулятор написаная на делфи.
http://s42.radikal.ru/i097/1112/fe/00e7d797093c.jpg
В нижней строке с помощью кнопок кальк работает ок.
Надо сделать чтобы верхняя строка делала вот это:
реализация ввода / вывода информации;
организация арифметических вычислений (сложение, вычитание,
умножение, деление).
у меня есть исходник написан на ассемблере:

Код:
procedure TForm2.edt1Change(Sender: TObject);
var
op1,d,osn,dey:integer;
s:string[15];
gr:string[25]  ;
begin
op1:=0;
d:=0;
osn:=0;
dey:=0;
s:='not nomber' ;
gr:='this number is grand'   ;
      begin
                                  asm
        @start:
call input
mov eax,d
mov op1,eax

@menu:
mov eax,dey
cmp al,'='
jne @m1
call output
mov ah,7h
int 21h
mov ah,4ch
int 21h

@m1:
cmp al,'+'
jne @m2
call input
mov eax,d
add op1,eax
jmp @menu
@m2:
cmp al,'-'
jne @m3
call input
mov eax,d
sub op1,eax
jmp @menu
@m3:
cmp al,'*'
jne @m4
call input
mov eax,op1
mul d
mov op1,eax
jmp @menu
@m4:
cmp al,'/'
jne @m5
call input
mov eax,op1
div d
mov op1,eax
jmp @menu
@m5:
cmp al,0Eh
jne @menu
pop dx
jmp @menu


@input:
@begin1:
mov ah,1h
int 21h
cmp al,'='
jne @h
mov dey,eax
ret
@h:
cmp al,'0'
jge @dal1
mov dey,eax
ret
@dal1:
cmp al,'9'
jle @dal2
mov ah,9h
lea dx,s
mov ah,4ch
int 21h ;
jmp @begin1
@dal2:
sub al,'0'
cbw
mov esi,eax
mov eax,d
mul osn
jnc @dal3
mov ah,9h
lea dx,gr
int 21h
mov ah,4ch
int 21h
@dal3:
add eax,esi
mov d,eax
jmp @begin1
ret


@output:
mov eax,op1
mov ecx,0
@out_dec:
mov dx,0
div osn
push dx
inc cx
cmp ax,0
jne @out_dec
@dmet:
pop dx
add dl,'0'
mov ah,2h
int 21h
loop @dmet
ret
ret
      end;
end;

end;

он делает всё что написано выше, но я никак не могу вставить его нормально в делфи.Много книг перечитал по объединению ассемблера и делфи, но ничего не получается. Помогите если кто знает как... Спасибо
14
06 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Ваш исходник для DOS, а Delphi для Windows. Сначала нужно перевести код из DOS в Windows
76K
07 декабря 2011 года
skynex
5 / / 06.12.2011
как я понимаю заменить только прерывания или ещо чтото?
14
08 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
разрядность неплохо бы заменить, сегментирование убрать
76K
08 декабря 2011 года
skynex
5 / / 06.12.2011
изменил первый пост, насчёт работы "int 16" не очень понял, как с ним работать, поэтому пока не изменил... может будут какие советы? и как насчёт edit1? я правельно вставил код? извините за глупые вопросы, просто делфи учил давно, а ассемблер только щас начал, поэтому что есть то есть...
14
09 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
А ассемблерный код должен вызываться при любом изменении едита? Если да - то вобщем-то правильно. int16 нет и не будет, строку получают или свойством или через GetWindowsText
А зачем такое извращение?
76K
09 декабря 2011 года
skynex
5 / / 06.12.2011
задание на курсак... надо сделать один кальк с 2ух языков програмирования
76K
11 декабря 2011 года
skynex
5 / / 06.12.2011
немного переделал програму. сложение, вычитание, умножение работает, а вот с делением траблы, пишет "operand size mismatch" помогите разобратся пожалуйста. вот исходник:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt3: TEdit;
    btn1: TBitBtn;
    edt4: TEdit;
    edt2: TEdit;
    procedure btn1Click(Sender: TObject);

    private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
 var
    num1,num2,num4:Integer;
    num3:double;
    znak:string[1];
    p:string[10];

begin
  num3:=0;
  p:='fail';
  num1:=strtoint(edt1.Text);
 num2:=strtoint(edt3.Text);
 znak:=edt2.Text;
 if num1>9999 then
 ShowMessage(p)
 else
 if num2>9999 then
 ShowMessage(p)
 else
 begin
 if znak='+'  then

 asm
 mov eax,num1
 mov edx,num2
 add eax,edx
 mov num4,eax
 end;
 edt4.text:=inttostr(num4);

 if znak='-'  then
 asm
 mov eax,num1
 mov edx,num2
 sub eax,edx
 mov num4,eax
 end;
 edt4.text:=INTtostr(num4);

 if znak='*'  then
 asm
 mov eax,num1
 mov edx,num2
 mul edx
 mov num4,eax
 end;
 edt4.text:=INTtostr(num4);


 if znak='/'  then
 asm
 mov eax,num1
 mov edx,num2
 div edx
 mov num3,eax
 end;
 edt4.text:=FloatToStr(num3);




end;

end.
14
12 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
посмотрите в учебнике/инете как работает div e?x - сразу разберетесь
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог