Код (Text): .model small .stack 100h .data .code .386 start: mov ax,@data mov ds,ax pushad and [bx],edx end start Откомпилировано, запущено в дебаггере cv. Что случается при выполнении команды and и почему?
А ты что хочешь чтоб случилось? У тебя мусор в bx и edx, так что случиться может что угодно. А вообще процессор сложит по И 32 бита в памяти по адрему bx с edx и результат назад запишет.
krokodil дайте себе труд написать хелоу мир с начала до конца и его уж отлаживайте прежде чем что то пробовать прочитайте что это значит прочитайте в чем разница между отсутствием и наличием скобок
Это бессмысленный кусок другого кода. Я пытался уловить баг, поэтому оставил эти огрызки. В данном случае я ожидал именного того, что при отладке программы bx и edx в начале будут равны нулю, поэтому and [bx],edx обнулит первые 4 байта сегмента данных. Это и происходило, но ds совпадал с cs и поэтому портился сам код, и сначала было непонятно. Но проблема осталась. Вот полный оригинальный код: Скрины из отладчика: Сами видите, меняется код. Если не использовать директивы упрощённой сегментации или после вызова функции вписать простейший код вывода строки mes (int 21h - 09h), то этого не происходит. add: работает на dosbox-е
krokodil Директива .data по умолчанию определяет, что сегмент данных будет выравнен на границу слова. Поэтому данные добавляются выравненные на границу слова, а регистру ds присваивается значение кратное границе сегмента. А если добавить команды mov ah,09h / int 21h, то это будут те недостающие четыре байта B409CD21, которые дополняют код и выравнивают данные на границу сегмента. Для устранения ошибки надо описать сегмент данных с помощью директивы .fardata или указать выравнивание с помощью директивы para. Думаю, что Вы сами могли бы увидеть ошибку, если бы обратили внимание на расхождение между адресом вычисленным с помощью значения регистра ds и действительным адресом начала данных.