Отрабатывает imul с ошибкой Delphi+Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. В прог. строка 5, imul esi,3 отрабатывает с ошибкой, если esi=1, то после умножения =9, если все это отработать в прог. Если написать отдельно этот участок прог. то все нормально. Заранее благодарю.
unit Assembler;

interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 Label k1,q1;
 var
  b:array [0..2,0..2] of integer;
  a,c,s,s1,x,y: integer;
begin
 b[0,0]:=1; //    0 1 2  Г¬Г*òðèöГ*
 b[0,1]:=2;
 b[0,2]:=3; // 0  1 2 3
 b[1,0]:=4; // 1  4 5 6
 b[1,1]:=5; // 2  7 8 9
 b[1,2]:=6;
 b[2,0]:=7;
 b[2,1]:=8;
 b[2,2]:=9;
  asm

    mov edi,0 // îáГ*óëÿåì ïåðåìåГ*Г*ГіГѕ äëÿ ñòðîê.
    lea eax,b //Г§Г*ãðóæГ*ГҐГ¬ Г¬Г*òðèöó Гў Г*êêóìóëÿòîð.
    mov ecx,0 // ýòî ñòîëáöû.
    mov esi,0 // ýòî ñòðîêè.
k1: mov esi,edi
     mov s,esi //äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
     mov y,edi // ñòðîêГ* äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
q1: imul esi,3 // 5 ЭТА СТРОКА.
     mov s1,esi // esi1 äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
    add esi,ecx // ïðèáГ*âëÿåì ñòîëáåö äëÿ ГЅГґГґГҐГЄГІГЁГўГ*îãî Г*äðåñГ*.
     mov x,ecx // ñòîëáåö äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
    mov edx,[eax+4*esi]  //ïåðåГ*îñèì Г¤Г*Г*Г*ûå Гў ðåãèñòð ГЁГ§ ГЇГ*ìÿòè.
     {mov s,esi //äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.}
    mov a,edx //âûïîëГ*ГїГҐГІГ±Гї ГЄГ*êîå-ГІГ® äåéñòâèå.
    inc ecx //   óâåëè÷èâГ*ГҐГ¬ êîëè÷åñòâî ñòîëáöîâ.
    cmp ecx,2{3} // Г±Г°Г*ГўГ*ГЁГўГ*ГҐГ¬ êîëè÷åñòâî ñòîëáöîâ Г± îãðГ*Г*ГЁГ·ГҐГ*ГЁГҐГ¬.
    jnz q1
    mov ecx,0 // îáГ*óëÿåì êîëè÷åñòâî ñòîëáöîâ äëÿ ñëåäóþùèé ñòðîêè.
    inc edi // ïåðåõîäèì ê ñëåäóþùèé ñòðîêè.
    cmp edi,2{3} // Г±Г°Г*ГўГ*ГЁГўГ*ГҐГ¬ êîëè÷åñòâî ñòðîê Г± îãðГ*Г*ГЁГ·ГҐГ*ГЁГҐГ¬.
    jnz k1
     imul esi,4 // äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
     mov c,esi // äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.

  end;
  ListBox1.Items.Add(IntToStr(a)+' Ñîäåðæèìîå ÿ÷åéêè ');
  ListBox1.Items.Add(IntToStr(x)+' ecx Ñòîëáåö ');
  ListBox1.Items.Add(IntToStr(y)+' edi ÑòðîêГ* ');
  ListBox1.Items.Add(IntToStr(s)+' esi ');
  ListBox1.Items.Add(IntToStr(s1)+' esi 1 ');
  ListBox1.Items.Add(IntToStr(c)+' Íîìåð Г*äðåñГ* ');
 
end;
 
end.

Решение задачи: «Отрабатывает imul с ошибкой Delphi+Assembler»

textual
Листинг программы
    mov edi,0 // îáГ*óëÿåì ïåðåìåГ*Г*ГіГѕ äëÿ ñòðîê.
    lea eax,b //Г§Г*ãðóæГ*ГҐГ¬ Г¬Г*òðèöó Гў Г*êêóìóëÿòîð.
    mov ecx,0 // ГЅГІГ® ñòîëáöû.
    mov esi,0 // ГЅГІГ® ñòðîêè.
k1:q1: mov esi,edi
     mov s,esi //äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
     mov y,edi // ñòðîêГ* äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
    imul esi,3
     mov s1,esi // esi1 äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
    add esi,ecx // ïðèáГ*âëÿåì ñòîëáåö äëÿ ГЅГґГґГҐГЄГІГЁГўГ*îãî Г*äðåñГ*.
     mov x,ecx // ñòîëáåö äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
    mov edx,[eax+4*esi] {[eax+4*(ecx*3+1)]} //ïåðåГ*îñèì Г¤Г*Г*Г*ûå Гў ðåãèñòð ГЁГ§ ГЇГ*ìÿòè.
     {mov s,esi //äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.}
    mov a,edx //âûïîëГ*ГїГҐГІГ±Гї ГЄГ*êîå-ГІГ® äåéñòâèå.
    inc ecx //   óâåëè÷èâГ*ГҐГ¬ êîëè÷åñòâî ñòîëáöîâ.
    cmp ecx,3 // Г±Г°Г*ГўГ*ГЁГўГ*ГҐГ¬ êîëè÷åñòâî ñòîëáöîâ Г± îãðГ*Г*ГЁГ·ГҐГ*ГЁГҐГ¬.
    jnz q1
    mov ecx,0 // îáГ*óëÿåì êîëè÷åñòâî ñòîëáöîâ äëÿ ñëåäóþùèé ñòðîêè.
    inc edi // ïåðåõîäèì ГЄ ñëåäóþùèé ñòðîêè.
    cmp edi,3 // Г±Г°Г*ГўГ*ГЁГўГ*ГҐГ¬ êîëè÷åñòâî ñòðîê Г± îãðГ*Г*ГЁГ·ГҐГ*ГЁГҐГ¬.
    jnz k1
     imul esi,4 // äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
     mov c,esi // äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5