delphi+assembler
Есть уже готовая програма-калькулятор написаная на делфи.
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;
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;
он делает всё что написано выше, но я никак не могу вставить его нормально в делфи.Много книг перечитал по объединению ассемблера и делфи, но ничего не получается. Помогите если кто знает как... Спасибо
Ваш исходник для DOS, а Delphi для Windows. Сначала нужно перевести код из DOS в Windows
как я понимаю заменить только прерывания или ещо чтото?
разрядность неплохо бы заменить, сегментирование убрать
изменил первый пост, насчёт работы "int 16" не очень понял, как с ним работать, поэтому пока не изменил... может будут какие советы? и как насчёт edit1? я правельно вставил код? извините за глупые вопросы, просто делфи учил давно, а ассемблер только щас начал, поэтому что есть то есть...
А зачем такое извращение?
задание на курсак... надо сделать один кальк с 2ух языков програмирования
Код:
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.
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.
посмотрите в учебнике/инете как работает div e?x - сразу разберетесь