Консультация № 140985
29.07.2008, 15:52
0.00 руб.
0 6 1
Здравствуйте, Уважаемые эксперты!!!:-)
Объясните, пожалуйста, как работает эта программа, а именно что происходит с 8-15 строки. Что в данном случае обозначают квадратные скобки, я не вижу в отладчике что происходит когда в [di] заносится ah (11 строка).
И еще, подскажите, пожалуйста, где в инете найти на конкретных примерах способы адресации на ассемблере.
Заранее СПАСИБО!!!


Приложение:
; программа считывает строку символов в буфер, затем отображает на экране.
;Функция DOS 0Ah - Считать строку символов из STDIN в буфер
1. .model tiny
2. .code
3. org 100h
4. start:
5. mov ah,0ah
6. mov dx,offset buffer
7. int 21h
;======================================
8. inc dx
9. mov di,dx
10. mov bl,[di]
11. mov [di],ah
12. xor bh,bh ;Можно и без этого, но! лучше так.
13. inc di
14. mov byte ptr [di+bx],'$'
15. dec ah
;======================================
16. int 21h
17. ret
buffer db 10 ; максимальная длина ввода строки
dlina db 0 ; фактическая длина ввода
text db 10 dup() ; фактически ввод размещается здесь

end start

Обсуждение

Неизвестный
29.07.2008, 16:46
общий
это ответ
; программа считывает строку символов в буфер, затем отображает на экране.
;Функция DOS 0Ah - Считать строку символов из STDIN в буфер
1. .model tiny
2. .code
3. org 100h
4. start:
5. mov ah,0ah; процедура ввод строки
6. mov dx,offset buffer
7. int 21h
;======================================
8. inc dx; адрес буффера ввода +1, теперь dx указывает на dlina - кол-во введенных символов
9. mov di,dx; di=dx адрес переменной dlina
10. mov bl,[di]; записать значение байта по адресу находящемуся в di в bl, кол-во введенных символов, bl=dlina
11. mov [di],ah; записать ah по адресу находящемуся в di, dlina=ah
12. xor bh,bh ;Можно и без этого, но! лучше так.
13. inc di ;di=di+1 теперь di содержит адрес начала строки text
14. mov byte ptr [di+bx],'$' ; записать в конец строки знак доллар, адрес начала строки+кол-во символов в строке
15. dec ah; ah=0Ah-1=09h функция вывод строки
;======================================
16. int 21h
17. ret
buffer db 10 ; максимальная длина ввода строки
dlina db 0 ; фактическая длина ввода
text db 10 dup() ; фактически ввод размещается здесь

end start
давно
Старший Модератор
31795
6196
29.07.2008, 17:43
общий
Что в данном случае обозначают квадратные скобки, я не вижу в отладчике что происходит когда в [ di ] заносится ah (11 строка).


В своём примере Вы уже использовали несколько видов адресации.
1) Регистровая адресация : mov di,dx - записать в регистр DI значение которое хранится в регистре ВХ.
2) Непосредственная адресация : mov ah,0ah - записать в регистр непросредственное значение 0Аh.
3) Прямая адресация : mov dx,offset buffer - записать в регистр адрес ячейки памяти.
4) Косвенная адресация : mov [ di ],ah - значение регистра записать по адресу в который хранится в регистре DI.
5) Адресация по базе с индексированием : mov byte ptr [ di+bx ],'$' - байт записать по адресу полученному из суммы регистров DI и ВХ.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.07.2008, 18:17
общий
Спасибо всем кто ответил!:-)
Если вы все-таки знаете сайты, где есть ПОДРОБНЕЙШЕЕ описанее о способах адресации, да еще и с примерами, то ПОЖАЛУЙСТА, подскажите!
давно
Старший Модератор
31795
6196
29.07.2008, 18:40
общий
Почитайте эту книгу С.В. Зубков: Ассемблер для DOS, Windows и Unix, ещё А.Б. Крупник(на второй странице: Дэвид Брэдли, Питер Абель, Виктор Юров, В.Ю. Пирогов, на третей: С.В. Зубков: Assembler. Язык неограниченных возможностей).
Лично я начинал с книг С.В. Зубкова.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
29.07.2008, 18:47
общий
В книге С.В. Зубков: Ассемблер для DOS, Windows и Unix, я нашел строение команд ассемблера. Адресация любой команды задается в самой команде. Советую купить т.к. в электронной версии нет полного описания ОП-кодов всех команд.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
29.07.2008, 22:23
общий
Спасибо, Константин Николаевич!:-)
Форма ответа