Глюк в трансляторе masm 6.11?

Тема в разделе "WASM.BEGINNERS", создана пользователем krokodil, 18 мар 2011.

  1. krokodil

    krokodil New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2011
    Сообщения:
    2
    Код (Text):
    1. .model small
    2. .stack 100h
    3.  
    4. .data
    5.  
    6. .code
    7. .386
    8. start:
    9.     mov ax,@data
    10.     mov ds,ax
    11.     pushad
    12.     and [bx],edx
    13.  
    14. end start
    Откомпилировано, запущено в дебаггере cv. Что случается при выполнении команды and и почему?
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    А ты что хочешь чтоб случилось?
    У тебя мусор в bx и edx, так что случиться может что угодно.
    А вообще процессор сложит по И 32 бита в памяти по адрему bx с edx и результат назад запишет.
     
  3. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    В начале обычно bx и edx равны нулю. Выходит and [bx],edx обнуляет первые 4 байта сегмента @data.
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.624
    Адрес:
    Russia
    krokodil
    дайте себе труд написать хелоу мир с начала до конца и его уж отлаживайте
    прежде чем что то пробовать прочитайте что это значит
    прочитайте в чем разница между отсутствием и наличием скобок
     
  5. krokodil

    krokodil New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2011
    Сообщения:
    2
    Это бессмысленный кусок другого кода. Я пытался уловить баг, поэтому оставил эти огрызки. В данном случае я ожидал именного того, что при отладке программы bx и edx в начале будут равны нулю, поэтому and [bx],edx обнулит первые 4 байта сегмента данных. Это и происходило, но ds совпадал с cs и поэтому портился сам код, и сначала было непонятно.

    Но проблема осталась. Вот полный оригинальный код:

    Скрины из отладчика:
    [​IMG]

    [​IMG]

    Сами видите, меняется код. Если не использовать директивы упрощённой сегментации или после вызова функции вписать простейший код вывода строки mes (int 21h - 09h), то этого не происходит.

    add: работает на dosbox-е
     
  6. skomarov

    skomarov New Member

    Публикаций:
    0
    Регистрация:
    14 май 2008
    Сообщения:
    389
    krokodil
    Директива .data по умолчанию определяет, что сегмент данных будет выравнен на границу слова. Поэтому данные добавляются выравненные на границу слова, а регистру ds присваивается значение кратное границе сегмента. А если добавить команды mov ah,09h / int 21h, то это будут те недостающие четыре байта B409CD21, которые дополняют код и выравнивают данные на границу сегмента. Для устранения ошибки надо описать сегмент данных с помощью директивы .fardata или указать выравнивание с помощью директивы para. Думаю, что Вы сами могли бы увидеть ошибку, если бы обратили внимание на расхождение между адресом вычисленным с помощью значения регистра ds и действительным адресом начала данных.