В общем у Абеля такой кусок кода накопал(сканирование строки на символ и замена его на пробел): Код (Text): STRLEN EQU 15 ;Длина поля STRING STRING DB 'The time&is now' ... CLD MOV AL,'&' ;Искомый символ MOV CX,STRLEN ;Длина поля STRING LEA DI,STRING ;Адрес поля STRING REPNE SCASB ;Сканировать JNZ K20 ;Символ найден? DEC DI ;Да - уменьшить адрес MOV BYTE PTR[DI],20H ;Подставить пробел K20: RET Собсно сабж. Не могу понять зачем там ставить byte ptr. Почему бы не mov [di],20h?
а откуда компилятор узнает размер непосредственного операнда(20h), который ты хочешь положить по адресу [DI]? Это же с тем же успехом может быть слово(0020h) или двойное слово(00000020h).
Т.е. как я понял, всегда когда мы пишем в память непосредственное значение, нужно предварять все это дело ptr'ом с указанием размера?
lcrowl Не всегда. Ещё есть вариант с assume и структурами, но это сугубо масмовский способ извратить исходный код. Код (Text): ASSUME di:PTR BYTE mov [di],20h
lcrowl Код (Text): ASSUME di:PTR BYTE mov [di],20h в кодах это всё тот же Код (Text): MOV BYTE PTR[DI],20H
Нужно явно указать размер, если в инструкции нет сведений о размере. Если же ты запихиваешь AL или CH куда-то в память, очевидно, что размер равен 1 байту. А если ты запихиваешь непосредственное значение, то компилятор не может знать, записываешь ты 20, 0020 или же 00000020. Так что указать надо явно Я подробно объяснил?