Ответьте пожалуйста на вопрос Код (Text): Вам необходимо вычислить абсолютный адрес в памяти, заданный регистрами DS и BX. Какую последовательность команд следует использовать для решения поставленной задачи? 1) mov dx, 0 mov ax, ds add ax, bx adc dx, 0 2) mov dx, 0 mov ax, ds add bx, bx adc dx, 0 add bx, bx adc dx, 0 add bx, bx adc dx, 0 add bx, bx adc dx, 0 add bx, ax adc dx, 0 3) mov dx, 0 mov ax, ds shl ax, 4 rcl dx, 4 add ax, bx rcl dx, 1 4) mov dx, 0 mov ax, ds add ax, ax adc dx, 0 add ax, ax adc dx, 0 add ax, bx adc dx, 0 5) mov dx, 0 mov ax, ds add ax, ax adc dx, 0 add ax, ax adc dx, 0 add ax, ax adc dx, 0 add ax, ax adc dx, 0 add ax, bx adc dx, 0 Заранее спасибо.
Asis Не помню как в досе ds:bx но попробую предположить на примере cs:ip (cs * 16 + ip) shl ds,4 add ds,bx
EvilsInterrupt, все правильно, НО! требуется определить правильный вариант из предложенных. Ах, да - нет таких комманд shl ds - сегментные регистры нельзя сдвигать, и add ds - не учавствуют в арифметических операциях. rmn Позволю себе с тобой не согласиться mov dx, 0 ; mov ax, ds ; shl ax, 4 ;3 старших бита ax безвозвратно потеряны, 4-й сидит в CF rcl dx, 4 ;4-й бит AX (до сдвига AX см выше) станет 3-м (76543210) dx add ax, bx ; rcl dx, 1 ;следовало бы adc, если бы предыдущий код был правильным. P.S. И впредь, пожалуйста, более внимательно отнеситесь к данному вопросу, спасибо.
Хм. На форуме по асму, и никто не знает ответа на такой простой вопрос? Или, может быть, это непростой вопрос? Наверное стоило бы его задать не в разделе "BEGINNERS"
Asis Все правильно rmn сказал. Биты потеряются -- ничего не поделаешь. Если бы можно было умещать весь адрес, то сегментные регистры не понадобились бы . 'rcl dx, 4' и на что не влияет, т.к. в вычислении адреса не участвует. Когда код выполнится в ax будет лежать абсолютный адрес ds:bx.
2Mika0x65 ответ должен быть в dx:ax, как я понял. Только не в виде сегмент:смещение, а как линейный адрес
rmn, Ну вот, наконец то Там действительно нет правильных вариантов. Мне необходимо было чтобы ктонибудь еще это увидел. Mika0x65, а dx:ax должен быть абсолютный (20-битный физический, тот что передается непосредственно по шине при обращении к памяти) адрес. Ustus Этого варианта нет в списке предложеных А кроме того он не выполнится на 8086, потому что этот процессор может сдвигать только на один бит за раз, если второй операнд представляет собой непосредственное значение. При трансляции такой программы без указания типа процессора, по умолчанию считается именно 8086, и поэтому, инструкция shl ax, 4 будет оттранслирована в четыре инструкции shl ax, 1 На 8126 и старших моделях все будет Ок. А еще можно выйти из положения так: mov cl, 4 shl ax, cl Такой код 8086 воспримет без проблем.
Asis тогда лучше Код (Text): mov ax, ds mov dx, ax shl ax, 1 rcl dx,1 shl ax, 1 rcl dx,1 shl ax, 1 rcl dx,1 shl ax, 1 rcl dx,1 add ax, bx adc dx, 0 это не было оговорено как же тогда вариант 3) ? И на 8086 если не ошибаюсь не было mov ax, ds кстати вариант 5) - похоже правильный, только я его сразу не заметил.
Ustus, mov ax,ds насколько я помню было, как же тогда mov ax, @data mov ds,ax в начале почти каждой exe-программы под ДОС? 5 вариант, как и 3 - неверны. Попробуй скомпилить и убедишься. А если тебе нужна теория то боюсь я уже запарился ее объяснять( Просто попытайся сам более дотошно разобрать эти варианты - см "P.S. И впредь, пожалуйста, более внимательно отнеситесь к данному вопросу, спасибо.". Код (Text): mov ax, ds mov dx, ax ; <<<<< здесь у тебя ошибка: нужно обнулить dx shl ax, 1 rcl dx,1 shl ax, 1 rcl dx,1 shl ax, 1 rcl dx,1 shl ax, 1 rcl dx,1 add ax, bx adc dx, 0