Page 21 of 77

Re: Помогите новичку

Posted: Tue Sep 13, 2011 11:56 am
by Mario
SII wrote: DW 3 размещает в памяти слово со значением 0003, однако, поскольку на IA-32 принят порядок "младший-старший", сначала в памяти будет лежать байт 03, а за ним -- 00.

MOV загружает двойное слово с адреса Data, а там байты лежат в таком порядке:

01 02 03 00

Соответственно, в EAX они грузятся задом наперёд: 00030201.
Чего чего? :shock:
В IA32 используется little endian
Достаточно открыть в любом HEX редакторе любое распакованное приложение Kolibri и посмотреть порядок следования байт в заголовке например после db 'MENUET01' сразу идет число dd 0x01.

Откуда 01 02 03 00??? Бред! Пить нужно после, а не до!

Re: Помогите новичку

Posted: Tue Sep 13, 2011 12:05 pm
by art_zh
Mario
у SII все верно,
Little-endian означает что в двойное слово самый младший (по адресу) байт запишется в конец: 0x00030201

Re: Помогите новичку

Posted: Tue Sep 13, 2011 12:18 pm
by Mario
Мля... у меня окончательно заклинило мозг.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 12:32 pm
by mike.dld

Re: Помогите новичку

Posted: Tue Sep 13, 2011 12:49 pm
by Mario
Замечательно! Тогда объясните мне вот такой пример:
le_check.7z
Spoiler:

Code: Select all

  use32
  org    0x0

  db     'MENUET01'
  dd     0x01
  dd     START
  dd     I_END
  dd     0x1000
  dd     0x1000
  dd     0x0
  dd     0x0

include 'macros.inc'

START:
	mov	eax,0xddccbbaa
	mov	[variable1],eax
	jmp	START
label1:
	db 'MARKER'
variable1:
	dd 0
I_END:
Запускаю в отладчике:
LE.png

Re: Помогите новичку

Posted: Tue Sep 13, 2011 12:54 pm
by SII
Отладчик, похоже, глючный: посмотрите на адреса 36-37 в области данных (там байты AA BB) и в области кода (там нули).

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:09 pm
by mike.dld
Не вижу никаких проблем, всё отображается правильно. У нас с вами ведь LE, не так ли?

Code: Select all

                +-- highest
                | +-- high
                | | +-- low
                | | | +-- lowest
               /|/|/|/|
mov     eax, 0xddccbbaa
Соответственно, в памяти байты лежат, начитая с lowest и заканчивая highest. В случае с BE было бы наоборот.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:21 pm
by Mario
Для исключения неточностей вот второй вариант программа сохраняющая свой дамп, после записи значения.
le_check_dump.7z
Дамп:
Le_check_dump.7z
Результаты:
heed_le.png
patriotxp_le.png
Теперь ВНИМАНИЕ вопрос!
Откуда взялось:
SII wrote:EAX = 00030201h

Всё очень просто, на самом-то деле. Директивы определения данных (DB и тому подобные) всегда размещают указанные в них данные в порядке их следования, т.е.

DB 1, 2

сначала разместит в памяти байт 1, потом -- байт 2.

DW 3 размещает в памяти слово со значением 0003, однако, поскольку на IA-32 принят порядок "младший-старший", сначала в памяти будет лежать байт 03, а за ним -- 00.

MOV загружает двойное слово с адреса Data, а там байты лежат в таком порядке:

01 02 03 00

Соответственно, в EAX они грузятся задом наперёд: 00030201.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:27 pm
by Mario
Все я разобрался! Противоречий между моими и SII утверждениями нет, просто он запутанно изложил материал.
Я так понимаю подразумевалась последовательная запись:

Code: Select all

mov [Data.1],byte 1
mov [Data.2],byte 2
mov [Data.3],word 3
mov eax,[Data]

Data:
.1 db 0
.2 db 0
.3 dw 0
З.Ы. Отладчик правильный! Ведь его писал САМ! :lol: Он конечно тоже человек, но все же.
З.З.Ы Вот здесь гораздо более толково http://ru.wikipedia.org/wiki/Little-endian

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:31 pm
by SII
Mario wrote:Все я разобрался! Противоречий между моими и SII утверждениями нет, просто он запутанно изложил материал
Я отвечал конкретному человеку (Gluk) на конкретный его пост, где был приведён вызывавший у него вопросы код. Так что это не я запутанно излагаю, а некто не посмотрел, к чему вообще моё сообщение относилось. Пытаться ж понять без контекста... В общем, нельзя так бурно праздновать :-P

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:32 pm
by SII
Mario wrote:З.Ы. Отладчик правильный! Ведь его писал САМ! :lol: Он конечно тоже человек, но все же.
Не знаю, что такое САМ, однако разночтения в отображении памяти кода и памяти данных на скриншоте налицо. Так что очень похоже, что отладчик всё-таки неправильный.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:36 pm
by Mario
SII wrote:В общем, нельзя так бурно праздновать :-P
Веришь или нет, но не пил! Совсем не пил! Видимо хреново выспался. Зато теперь любой, у кого возникнут вопрос и непонимание, может наглядно посмотреть. Раз уж даже такой болван как я разобрался. :lol:
SII wrote:Не знаю, что такое САМ, однако разночтения в отображении памяти кода и памяти данных на скриншоте налицо. Так что очень похоже, что отладчик всё-таки неправильный.
Пока не вижу неправильностей, можешь подробнее описать. Если что код начинается с 0x00000024, до этого идут данные заголовка.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:42 pm
by SII
Mario wrote:Раз уж даже такой болван как я разобрался
Не такой уж болван, если на ассемблере писать способен что-то сложней хелловорлда...
Пока не вижу неправильностей, можешь подробнее описать.
Обратите внимание на скриншот отладчика. В верхней части, где отображаются данные, по адресам 36-37 лежат байты AA BB, записанные туда MOVом, как и предполагалось (они красным обведены вместе со следующими за ними CC DD). А вот в нижней части, где дизассемблированный код, видно, что по адресам 36-37 лежат нули. Судя по всему, этот отладчик дизассемблирует код только один раз и не учитывает, что он может измениться. Изначально там действительно лежали нули, MOV записал новое значение, ну а отладчик не удосужился провести повторное дизассемблирование, поэтому там до сих пор видим 00 00.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:47 pm
by Mario
SII wrote:Обратите внимание на скриншот отладчика. В верхней части, где отображаются данные, по адресам 36-37 лежат байты AA BB, записанные туда MOVом, как и предполагалось (они красным обведены вместе со следующими за ними CC DD). А вот в нижней части, где дизассемблированный код, видно, что по адресам 36-37 лежат нули. Судя по всему, этот отладчик дизассемблирует код только один раз и не учитывает, что он может измениться. Изначально там действительно лежали нули, MOV записал новое значение, ну а отладчик не удосужился провести повторное дизассемблирование, поэтому там до сих пор видим 00 00.
Вот ты про что, ну я так думаю это не существенно. Реальное положение всегда отображается в верхней панели.

Re: Помогите новичку

Posted: Tue Sep 13, 2011 1:55 pm
by SII
Mario wrote:Вот ты про что, ну я так думаю это не существенно. Реальное положение всегда отображается в верхней панели.
Точней, это не существенно для подавляющего большинства случаев. Но исправить вообще-то стоило бы. Вдруг придётся отлаживать самомодифицирующийся код?