Только начал изучать программирование на асме, по книге "Ассемблер: это просто" (Калашникова), и столкнулся с некоторыми неясностями в синтаксисе, на которых по моему мнению в это книге не делается большого акцента. Прошу вас, разъяснить мне эти тонкости более подробно и доходчиво. Проблема такая: (в книге приведен код): Код (Text): mov ax, 0B900h mov es, ax mov di, 0 ... mov es:[di],ax Автор пишет что [] указывает что значение загружается по адресу, который содержится в di. Вопрос1: почему тогда не указываются [] скобки таким образом: [es]:[di]? или это вызвано Код (Text): mov ax, 0B900h mov es, ax ? (промежуточный регистр), а при mov di,0 промежуточный регистр не использовался. Можно ли тогда написать вместо этого так: mov es, [0B900h] ? Ведь в тоже время регистры cs:ip указываются без [] В одном источнике нашел запись такого вида: mov [es:di], ax (на мой взгляд полное соответствие словам автора), но увы. Меня вводит это в заблуждение, разъясните пожалуйста
kostyas311 es это сегмент. Насколько я понимаю это дос. Я в нём не силён, но помню, что доступ к памяти там через сегменты. Значения в сегменты загружаются специальными командами насколько я помню. Возможно, то, что написано здесь прояснит немного ситуацию для вас http://docstore.mik.ua/bcpp/r77_1.htm
вроде все ясно, но вопрос в другом, ведь в di будет 0. Почему тогда так и не написать что "mov es:di, ax" ? или "mov [es]:[di], ax". впрочем, работаю пока без отладчика, просто читаю, ибо нет возможности пока. Но это что особенность такая? подругому не сработает?
kostyas311 суть нотации mov приёмник, источник если приемник не имя регистра то это адрес если приёмник сегментный регистр то источник только другой регистр (грузить в сегментные регистры непосредственные значения запрещено) если приёмник адрес то его указать можно двояко - непосредствено ds:[0123] или через регистр ds:[di] в масме метка соответствует числу в скобках то есть можно писать mov ds:label,ax вместо mov ds:[0123],ax ds: - это префикс и заключать его в скобки нет необходимости - роль скобок играет двоеточие, хотя можете написать и [es:di] суть не измениться различие между mov di,ax и mov [di],ax - фундаментально - первая инструкция пишет в регистр, а вторая в память
kostyas311 Скорее всего, чтобы всё было однообразно. Ведь вот это и это Валидные инструкции. выбивается из общего ряда.
Z3N Код (Text): mov es:di, ax и это тоже валидная инструкция - только инструкции делятся на те что чувствуют префиксы и на те что нет
kostyas311 mov [es:di],ax -- это синтаксис ассемблера tasm в режиме ideal или для ассемблера fasm, а для masm такая инструкция невалидная, должно быть только mov es:[di],ax, если учесть, что di=0 можно написать mov es:[0],ax но далее по тексту программы значение в регистре di скорее всего изменяется, поэтому написано mov es:[di],ax и у тебя ошибка -- скорее всего mov ax, 0B800h mov es, ax, где 0B800h -- это начало текстового видеобуфера, к сожалению написать сразу mov 0B800h:0,ax ни masm, ни tasm, ни fasm не позволят Z3N mov di,ax (код 8BF8) и mov [di],ax (8905) -- это совершенно разные инструкции, первая запись в регистр и ей префиксы ни к чему, вторая -- запись в память, по умолчанию сегментный регистр DS, либо сегмент определяется префиксом