Не-то заносится в SI, DI

Тема в разделе "WASM.ASSEMBLER", создана пользователем tosha, 14 сен 2005.

  1. tosha

    tosha New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    7
    Постил топик в бегиннерз, но никто не откликнулся... мож здесь помогут. Кароче:

    Есть ламерский код, но он глючит:

    .286

    CSEG segment

    assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG

    org 100h



    BEGIN:

    push 0BF00h

    pop es

    mov di,offset Begin

    mov si,di

    mov cx,offset Finish-100h

    rep movsb



    mov bx,offset Prog_end

    push cs

    push bx



    mov bx,offset Prog_jmp

    push 0BF00h

    push bx

    retf



    Prog_jmp:

    ;Начало глюка

    ;В первый раз или в SI, или в DI заносится че-то не то

    mov di,100h

    mov si,offset File_first6

    ;А вот во второй раз все нормуль

    mov di,100h

    mov si,offset File_first6

    ;Конец глюка

    retf

    Prog_end:

    ret





    File_first6 db ?

    Finish equ $



    CSEG ends

    end BEGIN



    На моем проце(Pentium M 730) он глючит в выделенном фрагменте. Даже просто через DOS пробовал грузить. На остальных процах все нормуль. Мож у кого есть такой же проц и он проверит...
     
  2. Leshij

    Leshij New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2003
    Сообщения:
    15
    Sorry for translit...



    Vo pervih posle BEGIN: ja bi sdelal push cs/pop ds. Na vsjakij...



    Poprobuj posle Prog_jmp postavit' NOP.
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Дизассемблером проверь, во что у тебя это превращается.
     
  4. tosha

    tosha New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    7
    push cs/pop ds ни на что неповлияет, как и nop. Во че получается через дизассемблер:



    mov di,0100 ;di=100

    mov si,012A ;si=FBFB ???

    mov di,0100 ;di=100

    mov si,012A ;si=012A !!!



    То есть в первый раз какая-то лажа заносится, а во второй все ок... Такой глюк и под простым Досом!!! и только на моем компе... =(

    И вот что еще заметил, если заменить si другим регистром, то в первый раз все-равно не-то заносится: к примеру:

    mov ax,012A ;ax=FF42 а не FBFB



    Попробую поискать такой же проц...
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    tosha

    Какой-то стабильный глюк. Если бы проц себя так на самом деле вел, ты бы и DOS загрузить не смог. Лучше дай машинные коды всего этого безобразия, похоже что у тебя здесь на деле получается mov si, [12Ah], а не mov si, 12Ah
     
  6. tosha

    tosha New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    7
    По [12Ah] значения, которые и близко не похожи на те, которые заносятся в SI.Вот этот долбанный файл и исходник с листингом от TASM... достал он мня уже. Суть в том что я уже на 3 разных процах порверял(и AMD и Intel...) - там все без глюков. Вот до такого же проца, как у мня руки тока завтра дойдут.

    Кстати просто так значения в SI(без кода который выше операции mov si,12Ah) заносятся правильно. Но с наличием кода(после того как перепрыгиваешь в другую область) все глючит.

    Значения туда кстати ваще разные значения каждый раз заносится. И вот еще один лол: если под виндой окно эмуляции Dos не разварачивать на весь экран - то все нормально, а если после этого развернууууууть - опять глюк. Че это ваще такое?????



    [​IMG] 2109912856__1.rar
     
  7. Leshij

    Leshij New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2003
    Сообщения:
    15
    Попробуй так:



    ...

    mov di, 100h

    db 0B8h, 1, 2Ah

    ...



    Заодно попробуй другой компилятор.



    Ежли не пойдёт - выкинь проц:)
     
  8. Leshij

    Leshij New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2003
    Сообщения:
    15
    А кто напомнит, что за сегмент 0BF00h? Кажися 8 страница text mode... Ну там от Винды что угодно можно ожидать, попробуй под чистым досом (не command prompt only)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    tosha

    > "после того как перепрыгиваешь в другую область) все глючит"

    > "туда кстати ваще разные значения каждый раз заносится"

    Дык возможно скопированные данные просто не успевают попасть в L1 кэш инструкций ?

    У тебя глючная инструкция разбивается 32-байтной границей линейки кэша (0020). Конечно маловероятно, что проц пытается грузить код из неполностью загруженной линейки кэша, но кто его знает.. Если эта фигня связана с write-allocation (загрузкой данных из ОЗУ при записи в несуществующую линейку кэша), то может помочь вставка mov ax,es:[si+20h] перед копированием кода и выравнивание Prog_jmp на 32 байта (0020).

    И потом возможно отладчик тут как-то вмешивается. По идее проц даже если и может схватить неверный код, то должен сделать откат и выполнить заново, когда все будет готово. Лучше не доверять отладчику и добавить в прогу вывод значения в регистре на экран
     
  10. tosha

    tosha New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    7
    Leshij

    Во-первых, наверное правильнее db 0B8h,2Ah,1

    Другой компилятор не помогает, так как генерит точно такой же машинный код, и ваще этот код же правильно дизассемблируется. То есть косяк не в компиляторе.



    Во -вторых, под чистым досом я попробовал уже давно, о чем писал. И ваще если 0BF00h заменить на другое(например offset Finish) - ниче не изменится.
     
  11. tosha

    tosha New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    7
    leo

    Если выравнять, как ты сказал, то не-то заносится в DI, но уже во второй раз. Пробовал выводить на экран без отладчика - все равно не-то в SI... Иногда младший байт тот, а старший не тот, а иногда и оба не-те... SI, DI запарили они мня уже... Попробую на другом таком же проце - если там все нормально, то выкину свой... Впрочем, если там тоже глючит, все равно придется выкинуть =)
     
  12. tosha

    tosha New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    7
  13. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    tosha

    Я как то целый час выяснял, почему у меня в программе не работает ror eax,8. Оказалось TD ставил в середину этой инструкции int3, а мне этот CC не показывал. Если отлаживаешь при помощи TD - удали файл где он настройки хранит.
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    прошу прощения,

    для Black_mirror будьте так добры, напишите че нить на in20 @@ yandex.ru мне бы хотелось с вами по общаться