Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2011, 12:34   #1
Cheater13
Новичок
Джуниор
 
Регистрация: 23.05.2011
Сообщений: 3
По умолчанию Ввод десятичного числа в качестве аргумента для номера строки и столбца курсора

Приветствую вас!
Подскажите как в данном коде осуществить ввод двух десятичных чисел,
которые далее нужно будет использовать в качестве координат для установки курсора...

Код:
stacksg segment stack
db 128 dup(?)
stacksg ends
 
datasg segment
msg1 db 'Input row number 0 - 25',10,13,'$'
msg2 db 'Input string number  0 - 80',10,13,'$'
crlf db 10,13,'$'
 
datasg ends
 
codesg segment
assume ss:stacksg,ds:datasg,cs:codesg
 
start:
 
; Очистка экрана  
MOV  AH,0       ;номер функции установки режима дисплея
MOV  AL,2       ;код режима 80*25 черно-белого
INT  10H        ;очистка экрана
 
mov ax,datasg
mov ds,ax
 
mov ah,9
mov dx,offset msg1
int 21h 

 
; Установка курсора по заданным координатам
;MOV  AH,2      ; номер функции
;MOV  BH,0      ; номер страницы
;MOV  DH,10     ; номер строки 
;MOV  DL,10     ; номер столбца
;INT  10H
 
 
konec:
mov ah,4ch
int 21h
codesg ends
end start
Cheater13 вне форума Ответить с цитированием
Старый 24.05.2011, 14:43   #2
Cheater13
Новичок
Джуниор
 
Регистрация: 23.05.2011
Сообщений: 3
По умолчанию

Подскажите где ошибка:
Код:
stacksg segment stack
db 128 dup(?)
stacksg ends
 
datasg segment
msg1 db 'Input row number 0 - 25',10,13,'$'
msg2 db 'Input string number  0 - 80',10,13,'$'
crlf db 10,13,'$'
 
datasg ends
codesg segment
assume ss:stacksg,ds:datasg,cs:codesg
 
start:
; Очистка экрана  
MOV  AH,0       ;номер функции установки режима дисплея
MOV  AL,2       ;код режима 80*25 черно-белого
INT  10H        ;очистка экрана
 
mov ax,datasg
mov ds,ax
 
mov ah,9
mov dx,offset msg1
int 21h 
 
; Вызов подпрограммы InputInt для ввода номера строки
call InputInt
MOV  DH,AL
; Вызов подпрограммы InputInt для ввода номера столбца
call InputInt
MOV  DL,AL
 
; Установка курсора по заданным координатам
MOV  AH,2
MOV  BH,0
INT  10H
 
 
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset buff ; аддрес буфера
        int 21h ; принимаем строку
        mov dl,0ah
        mov ah,02
        int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset buff+2 ; берем аддрес начала строки
        cmp byte ptr [si],"-" ; если первый символ минус
        jnz ii1
        mov di,1  ; устанавливаем флаг
        inc si    ; и пропускаем его
ii1:
        xor ax,ax
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
        cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
        cmp di,1 ; если установлен флаг, то
        jnz ii3
        neg ax   ; делаем число отрицательным
ii3:
error db "incorrect number$"
buff    db 6,7 Dup(?)
 
        ret
 
 
InputInt endp
 
 
konec:                                          ; метка конца программы
mov ah,4ch                                      ; 4С - функция завершения процесса
int 21h                                         ; вызов функции DOS (в данном случае 4С int 21h)
codesg ends                                     ; конец сегмента кода
end start                                       ; конец программы
Cheater13 вне форума Ответить с цитированием
Старый 24.05.2011, 18:34   #3
Cheater13
Новичок
Джуниор
 
Регистрация: 23.05.2011
Сообщений: 3
По умолчанию

Вот полностью рабочий вариант, ежели кому понадобится:
Код:
stacksg segment stack
db 128 dup(?)
stacksg ends
 
datasg segment
msg1 db 'Input row number 0 - 25',10,13,'$'
msg2 db 'Input string number  0 - 80',10,13,'$'
crlf db 10,13,'$'
error db "incorrect number$"
buff    db 6,7 Dup(?)
 
datasg ends
codesg segment
assume ss:stacksg,ds:datasg,cs:codesg
 
start:
; Очистка экрана  
MOV  AH,0       ;номер функции установки режима дисплея
MOV  AL,2       ;код режима 80*25 черно-белого
INT  10H        ;очистка экрана
 
mov ax,datasg
mov ds,ax
 
mov ah,9
mov dx,offset msg1
int 21h
; Вызов подпрограммы InputInt для ввода номера строки
call InputInt
PUSH AX
mov ah,9

mov dx,offset msg2
int 21h
; Вызов подпрограммы InputInt для ввода номера столбца
call InputInt
MOV  DL,AL

 
; Установка курсора по заданным координатам
POP AX
MOV  DH,AL
MOV  AH,2
MOV  BH,0
INT  10H

; Подпрограмма ввода чисел с клавиатуры и сохранения их в
; буфер для передачи в регистры DH И DL
InputInt proc
 
        mov ah,0ah
        xor di,di
        mov dx,offset buff ; аддрес буфера
        int 21h ; принимаем строку
        mov dl,0ah
        mov ah,02
        int 21h ; выводим перевода строки
 
; обрабатываем содержимое буфера
        mov si,offset buff+2 ; берем аддрес начала строки
;        cmp byte ptr [si],"-" ; если первый символ минус
        jnz ii1
;        mov di,1  ; устанавливаем флаг
;        inc si    ; и пропускаем его
ii1:
        xor ax,ax
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
 
; если символ не последний, то проверяем его на правильность
        cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2    ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
;        cmp di,1 ; если установлен флаг, то
;        jnz ii3
;        neg ax   ; делаем число отрицательным
ii3:
        ret
 
InputInt endp

codesg ends                                     ; конец сегмента кода
end start                                       ; конец программы
Cheater13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имя функции в качестве аргумента Artem_Kokos Помощь студентам 1 25.04.2011 00:20
Как массив передать в качестве аргумента функции Mixim C# (си шарп) 7 10.03.2011 09:53
Передача object в качестве аргумента moknomo Microsoft Office Excel 3 14.12.2010 09:35
Создайте квадратную матрицу, значение каждого элемента равно сумме номера строки и столбца C++ loloverg Помощь студентам 1 26.05.2010 21:28
Определить номера строки и столбца максимального элемента прямоугольной матрицы. GANGSTER21 Паскаль, Turbo Pascal, PascalABC.NET 12 20.04.2010 21:09