Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.042 c
11-1174595095
ElectriC
2007-03-22 23:24
2007.10.28
размер KOL


10-1139165789
Nadi
2006-02-05 21:56
2007.10.28
Вставка картинок в Word


2-1191764984
alikon1
2007-10-07 17:49
2007.10.28
Изображение в БД


15-1191529240
TwentyTwo
2007-10-05 00:20
2007.10.28
Задать вопрос, который юридически невозможно закрыть даже методом


4-1177599496
ffo_2
2007-04-26 18:58
2007.10.28
Как получить имя этого компонента?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский