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

Applications development, KoOS API questions
  • Mario
    у SII все верно,
    Little-endian означает что в двойное слово самый младший (по адресу) байт запишется в конец: 0x00030201
  • Мля... у меня окончательно заклинило мозг.
  • in code we trust
  • Замечательно! Тогда объясните мне вот такой пример:
    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
  • Отладчик, похоже, глючный: посмотрите на адреса 36-37 в области данных (там байты AA BB) и в области кода (там нули).
  • Не вижу никаких проблем, всё отображается правильно. У нас с вами ведь LE, не так ли?

    Code: Select all

                    +-- highest
                    | +-- high
                    | | +-- low
                    | | | +-- lowest
                   /|/|/|/|
    mov     eax, 0xddccbbaa
    Соответственно, в памяти байты лежат, начитая с lowest и заканчивая highest. В случае с BE было бы наоборот.
    in code we trust
  • Для исключения неточностей вот второй вариант программа сохраняющая свой дамп, после записи значения.
    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.
  • Все я разобрался! Противоречий между моими и 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
  • Mario wrote:Все я разобрался! Противоречий между моими и SII утверждениями нет, просто он запутанно изложил материал
    Я отвечал конкретному человеку (Gluk) на конкретный его пост, где был приведён вызывавший у него вопросы код. Так что это не я запутанно излагаю, а некто не посмотрел, к чему вообще моё сообщение относилось. Пытаться ж понять без контекста... В общем, нельзя так бурно праздновать :-P
  • Mario wrote:З.Ы. Отладчик правильный! Ведь его писал САМ! :lol: Он конечно тоже человек, но все же.
    Не знаю, что такое САМ, однако разночтения в отображении памяти кода и памяти данных на скриншоте налицо. Так что очень похоже, что отладчик всё-таки неправильный.
  • SII wrote:В общем, нельзя так бурно праздновать :-P
    Веришь или нет, но не пил! Совсем не пил! Видимо хреново выспался. Зато теперь любой, у кого возникнут вопрос и непонимание, может наглядно посмотреть. Раз уж даже такой болван как я разобрался. :lol:
    SII wrote:Не знаю, что такое САМ, однако разночтения в отображении памяти кода и памяти данных на скриншоте налицо. Так что очень похоже, что отладчик всё-таки неправильный.
    Пока не вижу неправильностей, можешь подробнее описать. Если что код начинается с 0x00000024, до этого идут данные заголовка.
  • Mario wrote:Раз уж даже такой болван как я разобрался
    Не такой уж болван, если на ассемблере писать способен что-то сложней хелловорлда...
    Пока не вижу неправильностей, можешь подробнее описать.
    Обратите внимание на скриншот отладчика. В верхней части, где отображаются данные, по адресам 36-37 лежат байты AA BB, записанные туда MOVом, как и предполагалось (они красным обведены вместе со следующими за ними CC DD). А вот в нижней части, где дизассемблированный код, видно, что по адресам 36-37 лежат нули. Судя по всему, этот отладчик дизассемблирует код только один раз и не учитывает, что он может измениться. Изначально там действительно лежали нули, MOV записал новое значение, ну а отладчик не удосужился провести повторное дизассемблирование, поэтому там до сих пор видим 00 00.
  • SII wrote:Обратите внимание на скриншот отладчика. В верхней части, где отображаются данные, по адресам 36-37 лежат байты AA BB, записанные туда MOVом, как и предполагалось (они красным обведены вместе со следующими за ними CC DD). А вот в нижней части, где дизассемблированный код, видно, что по адресам 36-37 лежат нули. Судя по всему, этот отладчик дизассемблирует код только один раз и не учитывает, что он может измениться. Изначально там действительно лежали нули, MOV записал новое значение, ну а отладчик не удосужился провести повторное дизассемблирование, поэтому там до сих пор видим 00 00.
    Вот ты про что, ну я так думаю это не существенно. Реальное положение всегда отображается в верхней панели.
  • Mario wrote:Вот ты про что, ну я так думаю это не существенно. Реальное положение всегда отображается в верхней панели.
    Точней, это не существенно для подавляющего большинства случаев. Но исправить вообще-то стоило бы. Вдруг придётся отлаживать самомодифицирующийся код?
  • Who is online

    Users browsing this forum: No registered users and 0 guests