Отрабатывает 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 // äëÿ ГЄГ®Г*òðîëÿ ГЅГґ. Г*äðåñГ*.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д