Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Borland Delphi 6 + asm   Найти похожие ветки 

 
Windows ©   (2007-10-04 20:34) [0]

Здравствуйте. Никак не могу понять, как записать значение в память
mov ax, 0b800h
mov es, ax - вылетает... Хотя не должно.
так же
mov ax, 0b800h
mov bx, 10h
mov [ax], bx - вылетает.

Объясните пожалуйста, как нада правильно писать в память)


 
palva ©   (2007-10-04 20:47) [1]

Я понял так, что вы пытаетесь писать в видеопамять. Под Windows это не получится. Перезагружайтесь в DOS и там пишите на здоровье.


 
Windows ©   (2007-10-04 21:26) [2]

Я даже не знаю, что такое писать в видиопамять и как из этого кода, вы решили, что я пишу именно туда...


 
DVM ©   (2007-10-04 21:28) [3]


> Я даже не знаю, что такое писать в видиопамять

а вы, извиняюсь, вообще знаете, что делаете в написанном?


 
Anatoly Podgoretsky ©   (2007-10-04 21:28) [4]

А раз ты не знаешь, что в этом коде делается, то нафига тебе он?


 
Windows ©   (2007-10-04 21:32) [5]

Вообще, я не имею ввиду конкретно любой адрес памяти. Это я привел для примера. В моем случаи там указывается адрес переменной.


 
Anatoly Podgoretsky ©   (2007-10-04 21:39) [6]

> Windows  (04.10.2007 21:32:05)  [5]

В таком случае ты не знаешь, что на пользовательском уровне физическая память недоступна и она не используется явно пользовательскими программами.


 
Windows ©   (2007-10-04 21:40) [7]

А как тогда записать значение в переменную?


 
Anatoly Podgoretsky ©   (2007-10-04 21:42) [8]

> Windows  (04.10.2007 21:40:07)  [7]

В переменную просто

var := Value;


 
engine ©   (2007-10-04 21:42) [9]

> [7] Windows ©   (04.10.07 21:40)

Переменная := Значение;


 
Windows ©   (2007-10-04 21:46) [10]

asm
   jmp @start
   @data_:
   @perem: dw 2
   @start:

 end;
Как записать данные в @perem... Вот, что меня интересует. Спасибо.


 
Anatoly Podgoretsky ©   (2007-10-04 21:47) [11]

> Windows  (04.10.2007 21:46:10)  [10]

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


 
palva ©   (2007-10-04 21:50) [12]

Регистр ax не допускает косвенную адресацию. Ее можно делать для bx,bp,si,di и их четырехбайтных аналогов ebx,ebp,esi,edi
Вот такой код работает:

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 i := 64;
 asm
lea ebx, i
mov eax, 777
mov [ebx], eax
 end;
 Form1.Caption := IntToStr(i)
end;


 
Anatoly Podgoretsky ©   (2007-10-04 21:53) [13]

> palva  (04.10.2007 21:50:12)  [12]

Работает? Тогда ты в рубашке родился.


 
palva ©   (2007-10-04 21:55) [14]

Anatoly Podgoretsky ©   (04.10.07 21:53) [13]
Ну конечно, надо бы ebx восстановить. Но такого вопроса в сабже не было.


 
Windows ©   (2007-10-04 21:56) [15]


> Anatoly Podgoretsky ©   (04.10.07 21:53) [13]
>
> > palva  (04.10.2007 21:50:12)  [12]
>
> Работает? Тогда ты в рубашке родился.

А нельзя тогда объяснить, почему вы так считаете?


 
Anatoly Podgoretsky ©   (2007-10-04 21:57) [16]

> Windows  (04.10.2007 21:56:15)  [15]

В справке написано, про ассемблерные вставки.


 
Anatoly Podgoretsky ©   (2007-10-04 21:58) [17]

> palva  (04.10.2007 21:55:14)  [14]

Ну такой, заведомо неверный код не стоило бы приводить, не красит, тем более, что знаешь как писать, а вот возьмет Виндоус и использует его?


 
palva ©   (2007-10-04 22:02) [18]

Anatoly Podgoretsky ©   (04.10.07 21:58) [17]
Ну это я потом сообразил, что ebp держит фрейм локальных переменных. Я хотел ему проиллюстрировать, что ebp именно такой регистр, который допускает квадратные скобки. Тем более, что код у меня сработал, как ни странно.


 
Windows ©   (2007-10-04 22:03) [19]

Дак я так понял, что конкретно в моем случаи данные по адресу @perem изменить нельзя?


 
palva ©   (2007-10-04 22:15) [20]

Windows ©   (04.10.07 22:03) [19]
Наверно, как-то можно исхитриться. Но для обычных пользователей OC не разрешает программе модифицировать свой код.


 
Сергей М. ©   (2007-10-05 10:03) [21]


> данные по адресу @perem изменить нельзя?


Можно.
Но зачем ?


 
Windows ©   (2007-10-05 12:41) [22]


> Можно.
> Но зачем ?

Пожалуйста, если знаете, поделитесь информацией.


 
TSNamir@mail.ru   (2007-10-05 12:41) [23]

Для


 
Сергей М. ©   (2007-10-05 12:48) [24]

Сначала объясни, зачем тебе это потребовалось ?


 
TSNamir@mail.ru   (2007-10-05 13:00) [25]

function Adr : PDWORD;
asm
  jmp @@start
  @@perem:
  dw 2
  @@start:
  mov eax, offset @@perem
end;

procedure Do;
var FAdr : PDWORD;
 
 procedure DoWrite(Addr : PDWORD);
 asm
  mov [eax], 25
 end;

begin
 FAdr:= Adr;
VirtualProtect(FAdr, SizeOf(DWORD), PAGE_READWRITE, @OldProtection);
DoWrite(FAdr);
VirtualProtect(FAdr, SizeOf(DWORD), OldProtection, @OldProtection);

end;


 
Windows ©   (2007-10-05 16:44) [26]

Мне не нужно изменять в самом исполняемом, мне нужно изменить это в Оперативной памяти, т.е что бы можно было считывать и изменять значение.

> Сергей М. ©   (05.10.07 12:48) [24]
> Сначала объясни, зачем тебе это потребовалось ?

собсно, мне это и не нужно.
Я наверное просто не правильно выражаюсь...


 
Сергей М. ©   (2007-10-05 16:50) [27]


> мне нужно изменить это в Оперативной памяти


Ну и меняй себе на здоровье)

см. [8], [9]

Мне непонятно, зачем это делать на asm, да еще и размещать при этом переменные в секции кода ?

Чем не угодил Паскаль и секция данных ?


 
Windows ©   (2007-10-05 17:07) [28]

Что-то я весь запутался... попробую еще раз, так как я понимаю, но чувствую, что я не правильно понимаю...
перед запускам программа ложится в Оперативную память и от туда исполняется... дак вот в ней нужно найти данные из секции кода(@perem) и изменить... т.е изменить программу только на время исполнения... Если не ошибаюсь некоторые переменные в том же паскале работают таким же способом-хранятся в памяти, а сами по себе являются ссылками на место в памяти.

А пункт 8 и 9. это конкретно про переменные паскаля.


> Мне непонятно, зачем это делать на asm, да еще и размещать
> при этом переменные в секции кода ?
> Чем не угодил Паскаль и секция данных ?

Смысла тут искать не нужно. Просто выбрал такой способ для небольшого познания асма...))


 
Германн ©   (2007-10-05 17:13) [29]


> перед запускам программа ложится в Оперативную память и
> от туда исполняется

Твои познания соответствуют временам "Очакова и покоренья Крыма" (ДОСа то бишь).


 
Сергей М. ©   (2007-10-05 17:15) [30]


> перед запускам программа ложится в Оперативную память и
> от туда исполняется


Неверно.

Программа ложится в виртуальную память, прямого доступа к оперативной (физической ) памяти программа не имеет.


> нужно найти данные из секции кода(@perem) и изменить


см. [25]


 
Windows ©   (2007-10-05 17:23) [31]

[25] изменяет в самой программе?


 
Dimaxx ©   (2007-10-05 18:41) [32]

Я чет не пойму - зачем тебе вся эта байда?? Переменных мало? Массивов?


 
Германн ©   (2007-10-06 00:33) [33]


> Dimaxx ©   (05.10.07 18:41) [32]

Имхо хочет изменить значения некоторых переменных в работающей программе. Только пока ещё не признался, что в чужой программе. Поэтому пока ещё и не знает какой облом его ждет на самом деле. :-)



Страницы: 1 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
15-1190892322
Ega23
2007-09-27 15:25
2007.10.28
Что в редакторе кода означает


3-1181823543
GhosTer
2007-06-14 16:19
2007.10.28
Как подключиться к базе данных Active Directory!


11-1175014534
ElectriC
2007-03-27 20:55
2007.10.28
Application.Title


2-1191533338
Альберт
2007-10-05 01:28
2007.10.28
потоки


2-1191492500
031178
2007-10-04 14:08
2007.10.28
Как подцепить базу ACCESS в DELPHI.