Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 262

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Пишу контрольную на BASM при делении сталкиваюсь с ошибкой переполнения подскажите кто знает или где почитать

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Memo1: TMemo;
  12. Edit1: TEdit;
  13. Edit2: TEdit;
  14. Edit3: TEdit;
  15. Edit4: TEdit;
  16. Edit5: TEdit;
  17. Edit6: TEdit;
  18. Edit7: TEdit;
  19. Edit8: TEdit;
  20. Edit9: TEdit;
  21. Edit10: TEdit;
  22. Edit11: TEdit;
  23. Edit12: TEdit;
  24. Edit13: TEdit;
  25. Edit14: TEdit;
  26. Edit15: TEdit;
  27. Edit16: TEdit;
  28. Button1: TButton;
  29. Edit17: TEdit;
  30. Label1: TLabel;
  31. Edit18: TEdit;
  32. procedure Button1Click(Sender: TObject);
  33. private
  34. { Private declarations }
  35. public
  36. { Public declarations }
  37. end;
  38.  
  39. var
  40. Form1: TForm1;
  41. i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18:integer;
  42. res1,res2,res3,res4,res5,res6,res7,res8,res9,res10,res11,res12,
  43. res13,res14,res15:integer;
  44. res:real;
  45. implementation
  46.  
  47. {$R *.dfm}
  48.  
  49.  
  50. procedure TForm1.Button1Click(Sender: TObject);
  51. begin
  52. i1:=strtoint(edit1.Text);
  53. i2:=strtoint(edit2.Text);
  54. i3:=strtoint(edit3.Text);
  55. i4:=strtoint(edit4.Text);
  56. i5:=strtoint(edit5.Text);
  57. i6:=strtoint(edit6.Text);
  58. i7:=strtoint(edit7.Text);
  59. i8:=strtoint(edit8.Text);
  60. i9:=strtoint(edit9.Text);
  61. i10:=strtoint(edit10.Text);
  62. i11:=strtoint(edit11.Text);
  63. i12:=strtoint(edit12.Text);
  64. i13:=strtoint(edit13.Text);
  65. i14:=strtoint(edit14.Text);
  66. i15:=strtoint(edit15.Text);
  67. i16:=strtoint(edit16.Text);
  68. i17:=strtoint(edit18.Text);
  69.  
  70. asm
  71. mov eax,dword ptr i1
  72. add eax,dword ptr i2
  73. mov dword ptr res1,eax;
  74. mov eax,dword ptr res1
  75. add eax,dword ptr i3
  76. mov dword ptr res2,eax;
  77. mov eax,dword ptr res2
  78. add eax,dword ptr i4
  79. mov dword ptr res3,eax;
  80. mov eax,dword ptr res3
  81. add eax,dword ptr i5
  82. mov dword ptr res4,eax;
  83. mov eax,dword ptr res4
  84. add eax,dword ptr i6
  85. mov dword ptr res5,eax;
  86. mov eax,dword ptr res5
  87. add eax,dword ptr i7
  88. mov dword ptr res6,eax;
  89. mov eax,dword ptr res6
  90. add eax,dword ptr i8
  91. mov dword ptr res7,eax;
  92. mov eax,dword ptr res7
  93. add eax,dword ptr i9
  94. mov dword ptr res8,eax;
  95. mov eax,dword ptr res8
  96. add eax,dword ptr i10
  97. mov dword ptr res9,eax;
  98. mov eax,dword ptr res9
  99. add eax,dword ptr i11
  100. mov dword ptr res10,eax;
  101. mov eax,dword ptr res10
  102. add eax,dword ptr i12
  103. mov dword ptr res11,eax;
  104. mov eax,dword ptr res11
  105. add eax,dword ptr i13
  106. mov dword ptr res12,eax;
  107. mov eax,dword ptr res12
  108. add eax,dword ptr i14
  109. mov dword ptr res13,eax;
  110. mov eax,dword ptr res13
  111. add eax,dword ptr i15
  112. mov dword ptr res14,eax;
  113. mov eax,dword ptr res14
  114. add eax,dword ptr i16
  115. mov dword ptr res15,eax;
  116. //delenie na 16
  117.  
  118. mov eax,DWORD PTR RES15
  119. mov edx,dword ptr i17
  120. div i17
  121. mov DWORD PTR i18,EAX
  122.  
  123.  
  124. end;
  125. //i18:=res15-i17;
  126. edit17.Text:=inttostr(i18);
  127. end;
  128.  
  129. end.
  130.  


Drozdov D.V. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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. Модифицированный код в приложении.

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15,
  4. i16, i17, i18: integer;
  5. res1, res2, res3, res4, res5, res6, res7, res8, res9, res10, res11,
  6. res12, res13, res14, res15: integer;
  7. res: real;
  8. begin
  9. i1 := StrToInt(edit1.Text);
  10. i2 := StrToInt(edit2.Text);
  11. i3 := StrToInt(edit3.Text);
  12. i4 := StrToInt(edit4.Text);
  13. i5 := StrToInt(edit5.Text);
  14. i6 := StrToInt(edit6.Text);
  15. i7 := StrToInt(edit7.Text);
  16. i8 := StrToInt(edit8.Text);
  17. i9 := StrToInt(edit9.Text);
  18. i10 := StrToInt(edit10.Text);
  19. i11 := StrToInt(edit11.Text);
  20. i12 := StrToInt(edit12.Text);
  21. i13 := StrToInt(edit13.Text);
  22. i14 := StrToInt(edit14.Text);
  23. i15 := StrToInt(edit15.Text);
  24. i16 := StrToInt(edit16.Text);
  25. i17 := StrToInt(edit18.Text);
  26.  
  27. asm
  28. MOV EAX, i1
  29. ADD EAX, i2
  30. MOV res1,EAX;
  31. ADD EAX, i3
  32. MOV res2,EAX;
  33. ADD EAX, i4
  34. MOV res3,EAX;
  35. ADD EAX, i5
  36. MOV res4,EAX;
  37. ADD EAX, i6
  38. MOV res5,EAX;
  39. ADD EAX, i7
  40. MOV res6,EAX;
  41. ADD EAX, i8
  42. MOV res7,EAX;
  43. ADD EAX, i9
  44. MOV res8,EAX;
  45. ADD EAX, i10
  46. MOV res9,EAX;
  47. ADD EAX, i11
  48. MOV res10,EAX;
  49. ADD EAX, i12
  50. MOV res11,EAX;
  51. ADD EAX, i13
  52. MOV res12,EAX;
  53. ADD EAX, i14
  54. MOV res13,EAX;
  55. ADD EAX, i15
  56. MOV res14,EAX;
  57. ADD EAX, i16
  58. MOV res15,EAX;
  59. //delenie na 16
  60.  
  61. MOV EAX, RES15
  62. MOV EDX, 0
  63. div i17
  64. MOV i18,EAX
  65. end;
  66. //i18:=res15-i17;
  67. edit17.Text := IntToStr(i18);
  68. end;


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 января 2008, 22:41
Оценка за ответ: 5


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 27 июня 2017, 15:11
Выполнено за 0.06 сек.
Рейтинг@Mail.ru