2015-05-04 7 views
2

Я пишу простую программу часов с NASM. Я использую Ubuntu 14.10 Vagrant box под OSX через iTerm. Терминал - xterm, поэтому он должен быть совместим с VT-100.Команды VT-100 работают странно

Мне нужно удалить одну строку. Например, я ожидаю, что следующее поведение:

Hello, this is clock program 
13:01:25 UTC+4 

следующий момент:

Hello, this is clock program 
13:01:26 UTC+4 

Я написал следующие функции. Для печати:

func_print: 
    mov eax, sys_write 
    mov ebx, stdout 
    int 0x80 
    ret 

Для ясно:

clr   db 0x1b, "[K" 
clr_len  equ $-clr 
... 
func_clear: 
    mov ecx, clr 
    mov edx, clr_len 
    call func_print 

Для сохранения и восстановления позиций я использую VT-100 и его команды: [7 и [8 соответственно:

csave db  0x1b, "[7" 
csave_len equ $-csave 

crestore  db 0x1b, "[8" 
crestore_len equ $-crestore 

Мой код:

global _start 
    _start: 
    mov ecx, welcome 
    mov edx, welcome_len 
    call func_print 

    call func_print 
    call func_save_cursor_pos 

    mov dword [tv_sec], 2 
    mov dword [tv_usec], 0 

    call func_sleep 
    call func_clear 

    call func_restore_cursor_pos 
    mov ecx, welcome 
    mov edx, welcome_len 
    call func_print 

    jmp func_exit 

Однако результат:

[email protected]:~$ ./run.sh 
Hello, this is the clock program 
Hello, this is the clock program 
Hello, this is the clock program 
[email protected]:~$ 

Если изменить clr путем добавления [1A или [1B это, кажется, удаление строки в гораздо выше, чем это необходимо или ниже:

[email protected]:~$ ./run.sh 
Hello, this is the clock program 
Hello, this is the clock program 








Hello, this is the clock program 
[email protected]:~$ 

Как я могу исправить это ? Каков правильный код?

+0

Поскольку вы обновляете только одну строку, считаете ли вы использование '\ r' вместо этого? –

+0

Это всего лишь пример, я хотел бы обновить любое количество строк, на самом деле – ka2m

ответ

1

Я подозреваю, что ваша проблема связана с новой линией, подразумеваемой в welcome db "Hello, this is the clock program", 10. Я не могу точно сказать, потому что вы не опубликовали эту часть своего кода.

Я думаю, что это вызывает проблему, потому что новая строка заставляет прокручивать терминал - когда я удалил новую строку из моей версии, она работала правильно. Если вам нужно только обновить одну строку, она работает, чтобы просто не иметь новую строку.

Я подозреваю, что операции сохранения и восстановления работают с буквальными физическими местоположениями на экране - не логическими местоположениями, которые прокручиваются символами новой строки.

В целом, однако, я рекомендую использовать маскирование манипуляции курсором вместо:

  • Когда вы будете готовы перекроить свой выход, написать db 0x1b, "[nA" для перемещения вверх п строк. (Вам нужно будет поместить там номер.)
  • Сразу после этого (или после любой новой строки) напишите db 0x1b, "[K", чтобы очистить эту строку. (Вы уже это знали, но я включил его для полноты.)

Я написал пример программы для реализации этого, частично основанного на вашем.Он показывает:

Hello, this is the clock program. 
Line two. 

Затем, через некоторое время

=== TEST === 
More. 

А потом

=== TEST 2 === 
Again. 

Этот метод должен быть обобщенным для любого разумного количества линий.

BITS 32 
section .text 

welcome  db "Hello, this is the clock program", 10, "Line two.", 10 
welcome_len equ $-welcome 

test_str  db 0x1b, "[2A", 0x1b, "[K=== TEST ===", 10, 0x1b, "[KMore.", 10 
test_len  equ $-test_str 

test2_str  db 0x1b, "[2A", 0x1b, "[K=== TEST 2 ===", 10, 0x1b, "[KAgain.", 10 
test2_len  equ $-test2_str 

func_print: 
    mov eax, 4 
    mov ebx, 1 
    int 0x80 
    ret 

pause: ; Note: DON'T EVER USE THIS IN A REAL PROGRAM. This is not how you sleep properly. 
    mov eax, 0 
loop: 
    inc eax 
    cmp eax, 1000000000 
    jl loop 
    ret 

global _start 
_start: 
    mov ecx, welcome 
    mov edx, welcome_len 
    call func_print 

    call pause 

    mov ecx, test_str 
    mov edx, test_len 
    call func_print 

    call pause 

    mov ecx, test2_str 
    mov edx, test2_len 
    call func_print 

    mov eax, 1 
    mov ebx, 0 
    int 0x80 
+0

Спасибо большое! Обе версии работали – ka2m

 Смежные вопросы

  • Нет связанных вопросов^_^