Внесение в память содержимого edx (Delphi + Assembler)
Формулировка задачи:
Здравствуйте. Не могу внести в память содержание edx . Заранее благодарю.
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); var a: integer; x,y: smallint; begin x:=6; y:=10; asm mov eax,0 mov ebx,0 mov ecx,4 mov dx,y//Г‡Г*Г*îñèì Гў ìëГ*äøåå ñëîâî ГЄГ*ðäèГ*Г*ГІГі ГЇГ® Y. shl edx,16// ÏåðåГ*îñèì ìëГ*äøåå ñëîâî, ГЄГ*ðäèГ*Г*ГІГ» Y Гў Г±ГІГ*ðøåå ñëîâî. mov dx,x //Г‡Г*Г*îñèì Гў ìëГ*äøåå ñëîâî ГЄГ*ðäèГ*Г*ГІГ» ГЇГ® X. mov a,edx lea eax,a mov [eax+4*ecx],edx // ÏåðåГ*îñèì Гў ГЇГ*ìÿòü, ðåãèñòîð edx Г± ГЄГ*ðäèГ*Г*òîìè òî÷êè. mov ebx,[eax+4*ecx] mov a,ebx end; ListBox1.Items.Add(IntToStr(a)+' S Ñîäåðæèìîå ÿ÷åéêè '); end; end.
Решение задачи: «Внесение в память содержимого edx (Delphi + Assembler)»
textual
Листинг программы
procedure UseAsm; var a: integer; x,y: smallint; begin x:=6; y:=10; WriteLn(y shl 16+x); asm mov eax,0 mov ebx,0 mov ecx,4 mov dx,y shl edx,16 mov dx,x mov a,edx //для чего все остальное черт его знает lea eax,a mov [eax+4*ecx],edx mov ebx,[eax+4*ecx] mov a,ebx end; WriteLn(a); end;
Объяснение кода листинга программы
- Объявлены переменные: a (индекс 1), x (индекс 2), y (индекс 3).
- Задаются значения переменным x и y (индексы 2 и 3).
- Выполняется операция записи в файл (индекс 4) содержимого переменной y, смешанного с основанием 16 переменной x.
- Начинается ассемблерный блок (индекс 5).
- Переменным eax, ebx и ecx присваивается значение 0 (индексы 6, 7 и 8).
- Переменная dx получает значение переменной y (индекс 9).
- Переменная edx сдвигается влево на 16 позиций (индекс 10).
- Переменная dx получает значение переменной x (индекс 11).
- Переменная a получает значение переменной edx (индекс 12).
- Переменная eax задается значением переменной a (индекс 13).
- В память по адресу, рассчитанному как 4-кратное значение переменной ecx, записывается значение переменной edx (индекс 14).
- Переменная ebx получает значение из памяти по адресу, рассчитанному как 4-кратное значение переменной ecx (индекс 15).
- Переменная a получает значение переменной ebx (индекс 16).
- Завершается ассемблерный блок (индекс 17).
- Выполняется операция записи в файл (индекс 18) значения переменной a.
- Завершается процедура (индекс 19).