• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Вопрос по асму

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
1 Янв 2024
Сообщения
12
Реакции
1
Только начал изучать масм
Допустим у нас есть два случая, предварительно в секции data лежит DWORD, который хранит адрес 0x00403004 назовём ее var1

1) mov dword ptr[var1], dword ptr[1337h]

2) mov eax, dword ptr[var1]
mov dword ptr[eax], dword ptr[1337h]

В обоих случаях, по идее, в адрес, находящейся в переменной var1 должен был записаться dword со значением 0x1337
Но на деле всё корректно работает только во втором случае, в первом 0x1337 записывается не по адресу 0x00403004, а по адресу переменной var1 (0x00403000).

Так вот возникает вопрос, это масм таким образом компилирует мой код, что переменные из секции data напрямую нельзя вот так разыменовать для адреса, а нужно сначала положить их в регистр и уже разыменовывать регистр, или я чего то не понимаю?
 
прошлый пример был хуевый
вот лучше так объяснить
C++:
Expand Collapse Copy
int a = 0; // 0x00403004

int* var1 = &a // var1

var1 = *reinterpret_cast<int**>(0x1337); // mov dword ptr[var1], dword ptr[0x1337]

*var1 = *reinterpret_cast<int*>(0x1337);
/*
mov eax, dword ptr[var1]
mov dword ptr[eax], dword ptr[0x1337];
*/
// operator '=' == mov dword ptr, val
// operator '*' разыменования == mov r32, dword ptr
 
Последнее редактирование:
прошлый пример был хуевый
вот лучше так объяснить
C++:
Expand Collapse Copy
int a = 0; // 0x00403004

int* var1 = &a // var1

var1 = *reinterpret_cast<int**>(0x1337); // mov dword ptr[var1], dword ptr[0x1337]

*var1 = *reinterpret_cast<int*>(0x1337);
/*
mov eax, dword ptr[var1]
mov dowrd ptr[eax], dword ptr[0x1337];
*/
// operator '=' == mov dword ptr, val
// operator '*' разыменования == mov r32, dword ptr
чёт все равно не особо догнал, я просто за плюсовые касты не шарю. Мне интересно почему если dword ptr[var1] находится справа, то он разыменовывается нормально, если посмотреть в дебагере то mov eax, dword ptr[var1] - после этой инструкции в eax находится как раз таки нужный адрес, но если dword ptr[var1] находится слева, то почему то такое правило тут не работает. Может я что то не знаю о конструкциях 'тип ptr[]' в асме?
 
чёт все равно не особо догнал, я просто за плюсовые касты не шарю. Мне интересно почему если dword ptr[var1] находится справа, то он разыменовывается нормально, если посмотреть в дебагере то mov eax, dword ptr[var1] - после этой инструкции в eax находится как раз таки нужный адрес, но если dword ptr[var1] находится слева, то почему то такое правило тут не работает. Может я что то не знаю о конструкциях 'тип ptr[]' в асме?
потому что это type ptr[] это каст к поинтеру, процессор обращается к lvalue, в этому случае у нас значение под ссылкой var1, mov в свою очередь, принимает либо регистр, либо указатель, в таком случае первый аргумент должен быть lvalue - место куда можно положить, а второй любым rvalue значением.
процессор не разыменовывает первый аргумент, а работает с указателем на хранящее значение, второй он может разыменовывать при необходимости
 
mov dword ptr[var1], 1337h всё делает правильно, записывает 1337 в var1.
Если var1 содержит адрес (т.е значение var1 - это адрес), как в твоём случае, то тебе нужно сначала прочитать адрес из var1 и потом записать по нему, что и делает второй пример.

По идее ты хочешь в одну инструцию записать что-то вроде mov dword ptr[[var1]], 1337h, но такого у mov нет (не знаю насчёт остальных)
Значение var1 лежит по адресу 0x00403000, и по этому адресу записано 0x00403004

var1 = 0x00403000 (var1 address)
[var1] = 0x00403004 (var1 value)
mov eax, dword ptr[var1]
eax = 0x00403004
mov dword ptr[eax], 1337h
[0x00403004] = 1337h

Писать dword ptr[1337h] кстати неправильно, это будет считаться как чтение/запись по адресу 1337h, хотя у тебя это просто значение

Мне интересно почему если dword ptr[var1] находится справа, то он разыменовывается нормально, если посмотреть в дебагере то mov eax, dword ptr[var1] - после этой инструкции в eax находится как раз таки нужный адрес, но если dword ptr[var1] находится слева, то почему то такое правило тут не работает.
Всё так же работает, [var1] - чтение/запись по адресу var1, при чтении по var1 мы получаем значение (адрес что лежит по var1), а при записи записываем по адресу var1. Мы получаем доступ к тем же данным в var1, что так, что так.
Аналог "неправильного" разыменовывания будет mov eax, var1 и тогда мы получим адрес var1 в eax
 
Последнее редактирование:
Назад
Сверху Снизу