Программирование на Ассемблере под DOS

         

А вот второй способ немножко


А вот второй способ немножко навороченнее :). Чтобы в нем разобраться, мы сначала познакомимся со следующей группой команд: LODSB, LODSW, LODSD
Их назначение - это загрузка элемента из последовательности (строки, цепочки) в регистр-аккумулятор al/ax/eax.
  Для тех, кто не понял - наша строчка "Hello, World-2$" как раз и является "последовательностью/строкой/цепочкой" из элементов размером в байт.
  Адрес цепочки передается через ds:esi/si, сами "элементы" (фиксированной ширины) возвращаются в al (байт, команда LODSB), ax (слово, команда LODSW) или eax (двойное слово, команда LODSD). В общем, последние буковки команд как раз и указывают на размерность элемента: [B]yte, [W]ord, [D]ouble word. Т. е. размер мы определяем неявно.
  После выполнения одной из этих команд значение регистра si изменяется на величину, равную длине элемента, но... хм...

  Пришло время еще одну большую тайну познать, братья. В справочнике Юрова написано, "знак этой величины зависит от состояния флага df:
  df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
  df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу."
  Обидно, да? Флаги-то мы с вами еще не расколупали... Чего-ж дальше-то делать, а?

  Как что? "Пропивать" стандартную процедуру и колупать ее, колупать, колупать, ногами ее, ногами, и по морде, по морде, по морде... ;-[write_string, v1]------------------------------------- ;печать строки символов на мониторе. ;(Строчка оканчивается символом '$' ;на входе: ds:dx - адрес строки ;на выходе: нихрена ;прерывания: ан нату ;процедуры: write_char ;-------------------------------------------------------- write_string proc push ax push dx push si pushf ;(1) cld ;(2) mov si,dx ;(3) string_loop: lodsb ;(4) cmp al,'$' ;(5) jz end_of_string ;(6) mov dl,al ;(7) call write_char ;(8) jmp string_loop ;(9) end_of_string: popf ;(10) pop si pop dx pop ax ret write_string endp

Содержание раздела