Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 134
1

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

17.06.2015, 14:22. Показов 470. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. В прог. строка 5, imul esi,3 отрабатывает с ошибкой, если esi=1, то после умножения =9, если все это отработать в прог. Если написать отдельно этот участок прог. то все нормально. Заранее благодарю.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2015, 14:22
Ответы с готовыми решениями:

Не отрабатывает дробное число в сопроцессоре. Delphi+Assembler
Здравствуйте. Косвенная адресация с целыми числами получается, не получается с дробными. Заранее...

запрос не отрабатывает в delphi
Запрос находиться в access. В access запрос отрабатывает нормально, при вызове из delphi, запрос не...

Регулярка findstr отрабатывает на одном файле, но не отрабатывает на другом
Приветствую ! Сижу, ругаюсь матом в голос потому, что регулярка срабатывает на одном текстовом...

Почему не отрабатывает компонент ADO/Delphi запущенный под системной учетной записью?
Добрый день! Имеется рабочее приложение написанное на Delphi с компонентами ADO. Приложение берет...

5
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
17.06.2015, 15:57 2
Цитата Сообщение от 1963Victor Посмотреть сообщение
если esi=1, то после умножения =9
а где находится результат? в esi?
Assembler
1
imul esi,3 ; еах := esi*3
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
17.06.2015, 20:54 3
Не а, не так. Я тоже с этими новомодными умножениями путаюсь.
Скомпилировал сейчас .386 imul esi,3 и прогнал в отладчике. Результат в esi, однако.

Добавлено через 1 минуту
Цитата Сообщение от 1963Victor Посмотреть сообщение
imul esi,3 отрабатывает с ошибкой, если esi=1, то после умножения =9
Если esi=1 два раза на 3 умножить, то будет как раз 9. Что ты в цикле
Цитата Сообщение от 1963Victor Посмотреть сообщение
cmp ecx,2{3} // Г±Г°Г*ГўГ*ГЁГўГ*ГҐГ¬ êîëè÷åñòâî ñòîëáöîâ Г± îãðГ*Г*ГЁГ·ГҐГ*ГЁГҐГ¬.
jnz q1
и делаешь.
1
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 134
17.06.2015, 23:31  [ТС] 4
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
     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.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
17.06.2015, 23:39 5
Цитата Сообщение от 1963Victor Посмотреть сообщение
q1: imul esi,3
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
Опять те-же ошибки, на которые я указал. esi на 3 сколько раз умножать собрался ?

Добавлено через 1 минуту
Если у тебя индексы пробегают 0 1 2 , то цикл должен завершаться когда индекс стал 3
Если тебе надо всю матрицу оббежать.

Добавлено через 3 минуты
Вывести данные из матрицы (Delphi + Assembler)
1
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 134
18.06.2015, 00:04  [ТС] 6
Спасибо большое, все иправил.а я два дня в экран пялюсь, а от туда фига. Вот так мы ракеты запускаем.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    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 // äëÿ êîíòðîëÿ ýô. àäðåñà.
0
18.06.2015, 00:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2015, 00:04
Помогаю со студенческими работами здесь

Результат запроса отрабатывает в консоли, но не отрабатывает в модуле
Доброго времени суток! Собственно проблема в следующем, есть запрос, который возвращает дату...

Assembler в delphi 7
Выделяет readln и пишет missing operator or semicolon я стремно относился к паскалю и...

Assembler в Delphi
Здравствуйте не могу понять почему не показывает ответ по ListBox, заранее благодарю. procedure...

Delphi и Assembler
Здравствуйте. Как мне использовать Assembler в Delphi, есть литература об этом, заранее благодарю.

Assembler в Delphi
Вот пример кода моей DLL - library Project2; uses SysUtils, Classes; {$R *.res} ...

Assembler в Delphi
Мне нужно занести в регистр(любой) значение указателя. А потом из регистра в обычную переменную ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru