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.
Чего чего?
В 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
З.Ы. Отладчик правильный! Ведь его писал САМ!

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

Re: Помогите новичку
Posted: Tue Sep 13, 2011 1:32 pm
by SII
Mario wrote:З.Ы. Отладчик правильный! Ведь его писал САМ!

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

Веришь или нет, но не пил! Совсем не пил! Видимо хреново выспался. Зато теперь любой, у кого возникнут вопрос и непонимание, может наглядно посмотреть. Раз уж даже такой болван как я разобрался.
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:Вот ты про что, ну я так думаю это не существенно. Реальное положение всегда отображается в верхней панели.
Точней, это не существенно для подавляющего большинства случаев. Но исправить вообще-то стоило бы. Вдруг придётся отлаживать самомодифицирующийся код?