Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/32: Рейтинг темы: голосов - 32, средняя оценка - 4.75
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
1

Инфо о координатах текстового курсора дисплея в правый верхний угол экрана

05.03.2012, 17:01. Показов 6544. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно: выводить информацию о текущих координатах курсора в правый верхний угол экрана. Как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2012, 17:01
Ответы с готовыми решениями:

Дрожит правый верхний угол экрана
Всем привет. на мониторе asus vw246h (24 дюйма), дрожит правый верхний угол. Кусочек этот в форме...

Ввод строки и запись ее в правый верхний угол экрана
Мне нужно ввести строку и записать ее право верхний угол.У меня были примеры и я смог написать ввод...

Изобразить шарик двигающийся из левого верхнего угла экрана в правый верхний угол
1.изобразить шарик двигающийся из левого верхнего угла экрана в правый верхний угол; 2.Изобразить...

Заполнить нулями верхний правый угол матрицы
Люди, помогите пожалуйста с таким вопросом. Как сделать, что бы так же выводило и обнуляемые...

23
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
06.03.2012, 04:18 2
Цитата Сообщение от keetotko Посмотреть сообщение
Как?
keetotko, отвечаю на вопрос - вопросом: "В чем?" В DOS'e? В OS/2'e? В Windows'e? В Linux'e? Везде по разному, и собственно, чтобы было о чем говорить предметно: где твои наработки?
0
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
06.03.2012, 10:44  [ТС] 3
Mikl___, каюсь.
Вот информация.
В DOS. Наработок нет. Я думал функцию 08h прерывания 21h использовать для ожидания ввода символа. И при нажатии клавиши перенаправлять программу в то место, где и будет реализовываться вывод обновленных координат курсора.
Я хз как в верхний правый угол вывести. И какая функция получает координаты.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
06.03.2012, 11:10 4
keetotko, вот наводки, ищи, читай,
1) всё связанное с мышью в ДОСе идет через 33h прерывание,
2) функция 08h прерывания 21h вообще не при делах, для выхода из программы используй 0 функцию 16h прерывания,
3) для вывода координат в правый верхний угол экрана -- используй прямой вывод в видеопамять
0
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
06.03.2012, 11:27  [ТС] 5
Mikl___, при чем тут мышь? имеются в виду координаты текстового курсора консоли.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
06.03.2012, 11:34 6
keetotko, а как его перемещать? Стрелками? Enter'oм? Дел и Бэкспейсами?
0
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
06.03.2012, 11:41  [ТС] 7
Mikl___, именно так. Для этого я в сторону 08h и смотрел.
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
06.03.2012, 11:56 8
Писать TSR. Перехватывать int 10h/ah=02, координаты выводить директом в видеопамять. Для неумаления общности придётся пользовать BIOS data:
MEM 0040h:004Ah - VIDEO - COLUMNS ON SCREEN Size: WORD
MEM 0040h:004Eh - VIDEO - CURRENT PAGE START ADDRESS IN REGEN BUFFER Size: WORD
MEM 0040h:0050h - VIDEO - CURSOR POSITIONS Size: 8 WORDs
Desc: contains row and column position for the cursors on each of eight
video pages
MEM 0040h:0062h - VIDEO - CURRENT PAGE NUMBER Size: BYTE
0
238 / 235 / 43
Регистрация: 16.03.2011
Сообщений: 750
06.03.2012, 12:01 9
Если я правильно понял и нужны положение курсора в консоли:
Assembler
1
2
mov ah,03h
int 10h
INT 10h / AH = 03h - get cursor position and size.
input:
BH = page number.
return:
DH = row.
DL = column.
CH = cursor start line.
CL = cursor bottom line.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
06.03.2012, 14:00 10
Проще нужно быть: есть 2 функция 10h прерывания
Assembler
1
2
3
4
5
    mov ah,2     ;Запрос на установку курсора
    mov bh,0     ;Экран 0
        mov dh,string     ;номер строки
        mov dl,stolb     ;номер столбца
        int 10h      ;Передача управления в BIOS
устанавливает курсор в нужную позицию
Представь экран в виде двумерного пространства с адресуемыми позициями, в любую из которых может быть установлен курсор. Обычный текстовый видережим (=3), имеет 25 строк (нумеруемых от 0 до 24) и 80 столбцов (нумеруемых от 0 до 79).
Нажатие на клавиши обрабатываешь через 0 функцию 16h прерывания
клавиша содержимое AH действие
esc ah=1 выход из программы
Энтер ah=1Ch перемещаешься на одну строку вниз в столбец с номером = 0
<- ah=4Bуменьшить значение столбца на 1, если номер столбца был=0, тогда сделать столбец равным 79
-> ah=4Dувеличить значение столбца на 1, если номер столбца был=79, тогда сделать столбец равным нулю
стрелка вверх ah=48hуменьшить значение строки на 1, если номер строки был=0, тогда сделать сроку равной 24
стрелка вниз ah=50hувеличить значение строки на 1, если номер строки был=24, тогда сделать сроку равной нулю
и т.д.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
; masm dos com #
.model tiny
.286
.code
org 100h
start:  mov ax,3;стереть с экрана
    int 10h
a0:     mov ah,0
        int 16h
    cmp ah,1
    jz exit
    cmp ah,1Ch
    jnz a2
        mov stolb,0
    inc string
    jmp movecur
a2: cmp ah,4Dh
    jnz a3
    inc stolb
    jmp movecur
a3: ;. . . здесь работаешь с другими стрелками
    jmp a0   
movecur: mov ah,2     ;Запрос на установку курсора
    mov bh,0     ;Экран 0
        mov dh,string     ;Строка
        mov dl,stolb     ;Столбец
        int 10h      ;Передача управления в BIOS
    jmp a0
exit:   retn; выход в DOS
string db 0
stolb db 0
end start
Добавлено через 19 минут
а зная значения столбца и строки не сложно будет их выводить
координаты курсора в правый верхний угол экрана
0
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
07.03.2012, 04:33  [ТС] 11
Mikl___, каюсь еще раз. ввод с клавиатуры средствами DOS
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
07.03.2012, 06:01 12
keetotko, через DOS, так через DOS -- читай описание функций (1, 6, 7, 8), найди подходящую, чтобы можно было обрабатывать коды стрелок, или используй пару функций, посоветуйся с преподавателем, вообщем, смысл ясен?
0
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
07.03.2012, 13:30  [ТС] 13
Mikl___, в общем, так. Я решил сделать с мышью, уговорил препода. Написал следующее
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.MODEL Tiny
.CODE
ORG 100h
 
start:
        ; Обратный порядок записи - для конвертирования чисел в строки
        std                     
seek:       
                
        ; Отслеживаем координату X
        mov ax, 03h
        int 33h
 
        ; Конвертируем X в строку
        lea di, x_end - 1
        mov ax, cx          
        call conversion 
        
        ; Выводим X
        mov ah, 09h
        lea dx, x      
        int 21h   
        
        ; Выводим разделитель
        mov ah, 09h
        lea dx, divider
        int 21h
        
        ; Отслеживаем координату Y
        mov ax, 03h
        int 33h
        ; Конвертируем Y в строку
        lea di, y_end -1
        mov ax, dx
        call conversion 
 
        ; Выводим Y      
        mov ah, 09h
        lea dx, y      
        int 21h
        
        ; Выходим из программы
        int 20h                 
        
; Преобразование числа в строку
conversion proc
        mov cx,10               
cycle:
        xor dx,dx               
        div cx                  
                                
        xchg ax,dx              
        add al, '0'             
        stosb                   
        xchg ax, dx             
        or ax,ax                
        jne cycle               
        ret
conversion endp
 
x           db  '000$' 
x_end       =   $-1    
divider     db  ':$' 
y           db  '000$'
y_end       =   $-1       
 
end start
Выводит координаты исправно. Но как сделать, чтоб они выводились непрерывно? В одну и ту же строку. С выводом в правый верхний угол уже сам разобрался почти. Остался непрерывный вывод.
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
07.03.2012, 13:53 14
https://www.cyberforum.ru/post2012422.html
1
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
07.03.2012, 17:19  [ТС] 15
Почти готово. На данный момент проблема в следующем участке кода
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        ; Вывод в видеопамять
        mov cx, 6
        mov ax, 0B800h
        mov es, ax
        mov di, 0090h               ; смещение
        mov al, '0'
        mov ah, 11100000B
        mov es:[di], al
        
display:        
        add di, 2
        inc al
        mov es:[di], al
        loop display
Этот код выводит в правый верхний угол консоли строку "0123456". К тому моменту, как вызывается этот код, у меня в переменных x и y уже лежат текущие координаты курсора мыши.
В памяти последовательно идут переменные x, divider и y. Где x - 3 знака координата x, divider - двоеточие, y - 3 знака координата y. Итого 7 знаков. Можно сделать так, чтобы в цикле в al последовательно клались символы с начала переменной x?
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
07.03.2012, 17:56 16
Assembler
1
2
3
4
5
6
7
8
9
10
; подразумевается, что в AH - аттрибут символа
; если будет разноцветная хренотень, раскомментарь оба xchg
    mov cx,7
    mov si, offset x
display: 
        lodsb
;   xchg    ah,al
        stosw
;   xchg    ah,al
        loop    display
1
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
07.03.2012, 20:09  [ТС] 17
Charles Kludge, все работает, спасибо. Только числа до 10 выводятся нормально. А после 10 начинается ерунда. Посмотрите сами.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
.MODEL Tiny
.CODE
ORG 100h
 
start:
    mov ah, 9
    lea dx, x
    int 21h
    ; Обратный порядок записи - для конвертирования чисел в строки
    std    
    
    ; Инициализация графического режима
    mov ax, 2
    int 10h
    
    ; Инициализация мыши
    mov ax, 0
    int 33h 
    
    ; Показать курсор
    mov ax, 1
    int 33h
    
    ; Обработка перемещения
    mov ax, 000Ch
    mov cx, 0001h
    lea dx, seek
    int 33h
    
    ; Ожидание ввода символа
    mov ah, 0
    int 16h
    
    ; Отменить обработичк
    mov ax, 000Ch
    mov cx, 000Ch
    int 33h
    
    ; Выходим из программы
    int 20h    
    
seek:   
    ; Обнуляем координаты
    mov cx, 3
    lea si, nullz
    lea di, x
    
zeroing_x:      
    lodsb
    stosb
    loop zeroing_x
    
    mov cx, 3
    lea si, nullz
    lea di, y
    
zeroing_y:      
    lodsb
    stosb
    loop zeroing_y
    
    
    ; Отслеживаем координату X
    mov ax, 3
    int 33h
 
    ; Конвертируем X в строку
    lea di, x_end
    mov ax, cx          
    call conversion 
            
    ; Отслеживаем координату Y
    mov ax, 3
    int 33h
    
    ; Конвертируем Y в строку
    lea di, y_end
    mov ax, dx
    call conversion 
 
    ; Вывод в видеопамять
    mov cx, 7
    mov ax, 0B800h
    mov es, ax
    mov di, 0092h               ; смещение      
    mov ah, 00000011B
    lea si, x
        
disp:               
    lodsb       
    stosw   
    loop disp
 
    retf                    
    
; Преобразование числа в строку
conversion proc
    mov cx, 10                  
cycle:
    xor dx, dx                  
    div cx                                
    xchg ax, dx             
    add al, '0'             
    stosb                   
    xchg ax, dx             
    or ax,ax                
    jne cycle               
    ret
conversion endp
 
x           db  '000' 
x_end       =   $-1    
divider     db  ':' 
y           db  '000'
y_end       =   $-1   
nullz       db '000'    
 
end start
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
07.03.2012, 22:29 18
keetotko, вот рабочая процедура.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
push 0b800h
pop es
mov bp,cx
mov si,2
mov ax,dx
xor di,di
xor cx,cx
mov bx,10
 
@3:
cmp ax,100
jnc @1
mov word ptr es:[3],0
@1:
xor dx,dx
div bx
inc cx
push dx
test ax,ax
jne @1
 
@2:
pop ax
or al,30h
mov ah,0ch
stosw
loop @2
 
dec si
je @f
 
xor cx,cx
mov ax,bp
mov di,8
cmp ax,100
jnc @1
mov word ptr es:[11],0
jmp @1
 
@@:
retf
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
07.03.2012, 23:53 19
keetotko, вобщем, вотЪ:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    .286
    .MODEL  Tiny
    .CODE
    ORG 100h
 
start:
        ; Инициализация 
    mov ax, 3
    int 10h
 
        ; Инициализация мыши
    mov ax, 0
    int 33h
 
        ; Обработка перемещени
    mov ax, 000Ch
    mov cx, 0001h
    lea dx, seek
    int 33h
 
        ; Показать курсор
    mov ax, 1
    int 33h
 
    call    far ptr seek
        ; Ожидание ввода символа
    mov ah, 0
    int 16h
 
        ; Отменить обработичк
    mov ax, 000Ch
    mov cx, 000Ch
    int 33h
 
        ; Выходим из программы
    int 20h
 
seek:
    push    ds
    push    es
    push    cs
    pop es
    lea di, y_end
; чтобы выводить в знакоместах, CX и DX надо делить на 8 -> shr dx, 3
    push    cx
    mov ax,dx
    std
    mov bx, 10
    call    cnv
    dec di
    pop ax
    call    cnv
    cld
    push    cs
    pop ds
        ; Вывод в видеопамять
    mov cx, 7
    mov ax, 0B800h
    mov es, ax
    mov di, 0092h       ; смещение
    mov ah, 00000011B
    lea si, x
 
disp:
    lodsb
    stosw
    loop    disp
    pop es
    pop ds
    retf
 
; Преобразование числа в строку
;   es:di - endbuf
cnv:    call    @@1
    call    @@1
@@1:    div bl
    xchg    ah, al
    add al, 30h
    stosb
    shr ax, 8
    ret
x   db '000:000'
y_end   = $-1
    end start
1
11 / 11 / 2
Регистрация: 12.02.2011
Сообщений: 88
08.03.2012, 01:38  [ТС] 20
Charles Kludge, спасибо. А для чего нужен следующий код?
Assembler
1
2
3
4
5
seek:
        push    ds
        push    es
        push    cs
        pop     es
Добавлено через 6 минут
Эээ, и я что-то не понял, в каком месте происходит определение координат курсора.
0
08.03.2012, 01:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2012, 01:38
Помогаю со студенческими работами здесь

Как переместить кнопки управления окном в правый верхний угол?
Всем привет! Подскажите пожалуйста как переместить кнопки управления окном(закрыть, свернуть...) в...

Как поставить форму авторизации на верхний правый угол, используя стили
Ребята,помогите, 1)как поставить форму авторизации на верхний правый угол , используя стили? На...

Движение по шахматной доске коня (с левого нижнего угла в верхний правый угол)
Шахматная фигура «конь» перемещается на 1 клетку по горизонтали и на 2 клетки по вертикали или на...

Найти в матрице самый большой элемент и перенести его в верхний правый угол
Всем привет. Не могу ни как понять как найти в матрице самый большой элемент и перенести его в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru