ASM печатает поверх уже напечатанных значений

У меня есть скрипт ASM, который отображает дату (день, месяц, год) и время (часы, минуты, секунды).

Это печатает текущую дату и время в окне DOS. Дело в том, что он статичен. Что я хочу сделать, так это сделать его динамическим, то есть я должен записать новое значение точно в том месте, где на экране стоит текущее значение. Как это сделать в ASM?

Я вообще ничего не понимаю, и Google не был моим другом в этом.


person Vordreller    schedule 07.01.2009    source источник
comment
Итак, вы хотите разместить где-нибудь на экране резидентные часы, которые будут работать в фоновом режиме и показывать текущее время?   -  person Vladimir Panteleev    schedule 07.01.2009
comment
Что-то вроде. Я использую редактор WinASM, создал новый проект DOS и сделал код ASM для отображения времени, как описано, теперь я хочу видеть, как секунды тикают, минуты идут за следующими, то же самое для часов и так далее, все должно быть правильно и динамично.   -  person Vordreller    schedule 07.01.2009


Ответы (3)


Используйте код ASM, чтобы расположить курсор перед печатью строки. Например:

        MOV     DX,1629H                ; (LINE 16H, COL 29H)
        MOV     AH,2                    ; Move cursor to DH,DL
        INT     10H
        ; now print your string
person BoltBait    schedule 07.01.2009
comment
Не забудьте загрузить номер страницы (почти всегда 0) в BH. - person P Daddy; 07.01.2009

Если ваш DOS-сервер называется COMMAND.COM или CMD.EXE до Windows 2000 (более новый CMD.EXE не поддерживает ANSI), то он будет поддерживать управляющие последовательности ANSI. Вы можете использовать различные команды курсора для позиционирования курсора в начале ваших часов перед отображением нового времени.

person Sparr    schedule 07.01.2009

На самом деле это не проблема, связанная с языком, а скорее проблема, связанная с платформой. Вы сказали, что работаете в системе DOS, поэтому можете использовать одно из следующего:

  1. Если вы используете процедуру печати DOS (например, INT 21h с AH=9), вы можете напечатать символ возврата каретки (ASCII 13) без последующего символа новой строки (ASCII 10), чтобы вернуть курсор в начало текущей строки. Точно так же, если это на самом деле консольное приложение для Windows и вы используете WriteConsole, вы должны добиться того же эффекта.
  2. Если вы действительно используете DOS, вы можете использовать BIOS для обновления текущей позиции курсора с помощью INT 10h, AH=2.
  3. Как упоминал Спарр, вы можете отправлять escape-последовательности «ANSI» (если загружен ansi.sys) для управления курсором, а также другими вещами, такими как цвет. Эти escape-последовательности будут напечатаны (например, INT 21h, AH=9), как и ваш текст.

Если вы собираетесь много программировать на ассемблере в DOS, я бы оставил закладку на один из несколько прерывание ссылки.

person P Daddy    schedule 07.01.2009