Форум: "Начинающим";
Текущий архив: 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