Постил топик в бегиннерз, но никто не откликнулся... мож здесь помогут. Кароче: Есть ламерский код, но он глючит: .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 пробовал грузить. На остальных процах все нормуль. Мож у кого есть такой же проц и он проверит...
Sorry for translit... Vo pervih posle BEGIN: ja bi sdelal push cs/pop ds. Na vsjakij... Poprobuj posle Prog_jmp postavit' NOP.
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 Попробую поискать такой же проц...
tosha Какой-то стабильный глюк. Если бы проц себя так на самом деле вел, ты бы и DOS загрузить не смог. Лучше дай машинные коды всего этого безобразия, похоже что у тебя здесь на деле получается mov si, [12Ah], а не mov si, 12Ah
По [12Ah] значения, которые и близко не похожи на те, которые заносятся в SI.Вот этот долбанный файл и исходник с листингом от TASM... достал он мня уже. Суть в том что я уже на 3 разных процах порверял(и AMD и Intel...) - там все без глюков. Вот до такого же проца, как у мня руки тока завтра дойдут. Кстати просто так значения в SI(без кода который выше операции mov si,12Ah) заносятся правильно. Но с наличием кода(после того как перепрыгиваешь в другую область) все глючит. Значения туда кстати ваще разные значения каждый раз заносится. И вот еще один лол: если под виндой окно эмуляции Dos не разварачивать на весь экран - то все нормально, а если после этого развернууууууть - опять глюк. Че это ваще такое????? 2109912856__1.rar
Попробуй так: ... mov di, 100h db 0B8h, 1, 2Ah ... Заодно попробуй другой компилятор. Ежли не пойдёт - выкинь проц
А кто напомнит, что за сегмент 0BF00h? Кажися 8 страница text mode... Ну там от Винды что угодно можно ожидать, попробуй под чистым досом (не command prompt only)
tosha > "после того как перепрыгиваешь в другую область) все глючит" > "туда кстати ваще разные значения каждый раз заносится" Дык возможно скопированные данные просто не успевают попасть в L1 кэш инструкций ? У тебя глючная инструкция разбивается 32-байтной границей линейки кэша (0020). Конечно маловероятно, что проц пытается грузить код из неполностью загруженной линейки кэша, но кто его знает.. Если эта фигня связана с write-allocation (загрузкой данных из ОЗУ при записи в несуществующую линейку кэша), то может помочь вставка mov ax,es:[si+20h] перед копированием кода и выравнивание Prog_jmp на 32 байта (0020). И потом возможно отладчик тут как-то вмешивается. По идее проц даже если и может схватить неверный код, то должен сделать откат и выполнить заново, когда все будет готово. Лучше не доверять отладчику и добавить в прогу вывод значения в регистре на экран
Leshij Во-первых, наверное правильнее db 0B8h,2Ah,1 Другой компилятор не помогает, так как генерит точно такой же машинный код, и ваще этот код же правильно дизассемблируется. То есть косяк не в компиляторе. Во -вторых, под чистым досом я попробовал уже давно, о чем писал. И ваще если 0BF00h заменить на другое(например offset Finish) - ниче не изменится.
leo Если выравнять, как ты сказал, то не-то заносится в DI, но уже во второй раз. Пробовал выводить на экран без отладчика - все равно не-то в SI... Иногда младший байт тот, а старший не тот, а иногда и оба не-те... SI, DI запарили они мня уже... Попробую на другом таком же проце - если там все нормально, то выкину свой... Впрочем, если там тоже глючит, все равно придется выкинуть =)
tosha Я как то целый час выяснял, почему у меня в программе не работает ror eax,8. Оказалось TD ставил в середину этой инструкции int3, а мне этот CC не показывал. Если отлаживаешь при помощи TD - удали файл где он настройки хранит.
прошу прощения, для Black_mirror будьте так добры, напишите че нить на in20 @@ yandex.ru мне бы хотелось с вами по общаться