|
Вопрос # 1 262/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Пишу контрольную на BASM при делении сталкиваюсь с ошибкой переполнения подскажите кто знает или где почитать
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Memo1: TMemo;
- Edit1: TEdit;
- Edit2: TEdit;
- Edit3: TEdit;
- Edit4: TEdit;
- Edit5: TEdit;
- Edit6: TEdit;
- Edit7: TEdit;
- Edit8: TEdit;
- Edit9: TEdit;
- Edit10: TEdit;
- Edit11: TEdit;
- Edit12: TEdit;
- Edit13: TEdit;
- Edit14: TEdit;
- Edit15: TEdit;
- Edit16: TEdit;
- Button1: TButton;
- Edit17: TEdit;
- Label1: TLabel;
- Edit18: TEdit;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18:integer;
- res1,res2,res3,res4,res5,res6,res7,res8,res9,res10,res11,res12,
- res13,res14,res15:integer;
- res:real;
- implementation
-
- {$R *.dfm}
-
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- i1:=strtoint(edit1.Text);
- i2:=strtoint(edit2.Text);
- i3:=strtoint(edit3.Text);
- i4:=strtoint(edit4.Text);
- i5:=strtoint(edit5.Text);
- i6:=strtoint(edit6.Text);
- i7:=strtoint(edit7.Text);
- i8:=strtoint(edit8.Text);
- i9:=strtoint(edit9.Text);
- i10:=strtoint(edit10.Text);
- i11:=strtoint(edit11.Text);
- i12:=strtoint(edit12.Text);
- i13:=strtoint(edit13.Text);
- i14:=strtoint(edit14.Text);
- i15:=strtoint(edit15.Text);
- i16:=strtoint(edit16.Text);
- i17:=strtoint(edit18.Text);
-
- asm
- mov eax,dword ptr i1
- add eax,dword ptr i2
- mov dword ptr res1,eax;
- mov eax,dword ptr res1
- add eax,dword ptr i3
- mov dword ptr res2,eax;
- mov eax,dword ptr res2
- add eax,dword ptr i4
- mov dword ptr res3,eax;
- mov eax,dword ptr res3
- add eax,dword ptr i5
- mov dword ptr res4,eax;
- mov eax,dword ptr res4
- add eax,dword ptr i6
- mov dword ptr res5,eax;
- mov eax,dword ptr res5
- add eax,dword ptr i7
- mov dword ptr res6,eax;
- mov eax,dword ptr res6
- add eax,dword ptr i8
- mov dword ptr res7,eax;
- mov eax,dword ptr res7
- add eax,dword ptr i9
- mov dword ptr res8,eax;
- mov eax,dword ptr res8
- add eax,dword ptr i10
- mov dword ptr res9,eax;
- mov eax,dword ptr res9
- add eax,dword ptr i11
- mov dword ptr res10,eax;
- mov eax,dword ptr res10
- add eax,dword ptr i12
- mov dword ptr res11,eax;
- mov eax,dword ptr res11
- add eax,dword ptr i13
- mov dword ptr res12,eax;
- mov eax,dword ptr res12
- add eax,dword ptr i14
- mov dword ptr res13,eax;
- mov eax,dword ptr res13
- add eax,dword ptr i15
- mov dword ptr res14,eax;
- mov eax,dword ptr res14
- add eax,dword ptr i16
- mov dword ptr res15,eax;
- //delenie na 16
-
- mov eax,DWORD PTR RES15
- mov edx,dword ptr i17
- div i17
- mov DWORD PTR i18,EAX
-
-
- end;
- //i18:=res15-i17;
- edit17.Text:=inttostr(i18);
- end;
-
- end.
-
 |
Вопрос задал: Drozdov D.V. (статус: 4-ый класс)
Вопрос отправлен: 11 января 2008, 14:25
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Drozdov D.V.!
Начинаем разбор полётов. Для начала скажу, что код написан отвратительно и неграмотно. Возьмём только наличие глобальных переменных вида i1-i18, а не локального массива, кучу едитов (может лучше StringGrid?) и неформатированный код.
Теперь дальше. рассмотрим следующий код.
mov dword ptr res1,eax;
mov eax,dword ptr res1
mov не перемещает, а копирует! после первой инструции содержимое eax и res1 идентично. поэтому вторую строку можно удалить. а всего таких строк около 16.
дальше. вместо dword ptr res1 можно писать просто res1. Делфовский компилятор хорошо понимает такое.
А теперь к ошибке. Давайте вспомним как работает div.
Цитата:
Если аргумент двойное слово - делимое edx:eax, частное eax, остаток edx
что же у вас происходит? у вас в edx сумма чисел. Что в eax - не важно, но можно легко увидеть, что результат деления не влезет в 4 байта, тоесть его нельзя вместить в регистре. Что и происходит. вывод - занулить регистр edx. Модифицированный код в приложении.
Приложение: Переключить в обычный режим- procedure TForm1.Button1Click(Sender: TObject);
- var
- i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15,
- i16, i17, i18: integer;
- res1, res2, res3, res4, res5, res6, res7, res8, res9, res10, res11,
- res12, res13, res14, res15: integer;
- res: real;
- begin
- i1 := StrToInt(edit1.Text);
- i2 := StrToInt(edit2.Text);
- i3 := StrToInt(edit3.Text);
- i4 := StrToInt(edit4.Text);
- i5 := StrToInt(edit5.Text);
- i6 := StrToInt(edit6.Text);
- i7 := StrToInt(edit7.Text);
- i8 := StrToInt(edit8.Text);
- i9 := StrToInt(edit9.Text);
- i10 := StrToInt(edit10.Text);
- i11 := StrToInt(edit11.Text);
- i12 := StrToInt(edit12.Text);
- i13 := StrToInt(edit13.Text);
- i14 := StrToInt(edit14.Text);
- i15 := StrToInt(edit15.Text);
- i16 := StrToInt(edit16.Text);
- i17 := StrToInt(edit18.Text);
-
- asm
- MOV EAX, i1
- ADD EAX, i2
- MOV res1,EAX;
- ADD EAX, i3
- MOV res2,EAX;
- ADD EAX, i4
- MOV res3,EAX;
- ADD EAX, i5
- MOV res4,EAX;
- ADD EAX, i6
- MOV res5,EAX;
- ADD EAX, i7
- MOV res6,EAX;
- ADD EAX, i8
- MOV res7,EAX;
- ADD EAX, i9
- MOV res8,EAX;
- ADD EAX, i10
- MOV res9,EAX;
- ADD EAX, i11
- MOV res10,EAX;
- ADD EAX, i12
- MOV res11,EAX;
- ADD EAX, i13
- MOV res12,EAX;
- ADD EAX, i14
- MOV res13,EAX;
- ADD EAX, i15
- MOV res14,EAX;
- ADD EAX, i16
- MOV res15,EAX;
- //delenie na 16
-
- MOV EAX, RES15
- MOV EDX, 0
- div i17
- MOV i18,EAX
- end;
- //i18:=res15-i17;
- edit17.Text := IntToStr(i18);
- end;
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 января 2008, 22:41
Оценка за ответ: 5
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|