Консультация № 160273
12.02.2009, 10:43
0.00 руб.
0 4 1
Программирую на С и Паскале. А тут попросили программку сессионную написать на Ассемблере. Ничего не выходит. Суть в следующем: "Пользователь вводит с клавиатуры начальное и конечное значения диапазона десятичных беззнаковых двухбайтных чисел. Программа выводит на экран последовательность всех чисел этого диапазона. Если начальное значение больше конечного, и если вводятся неправильные символы, то программа должна выдать ошибку.". Кое-как разобрался с вводом с клавиатуры и выводом на экран, но до завершенности еще очень далеко. Привожу код, который у меня получился. Укажите пожалуйста ошибки и помогите правильно организовать цикл для вывода.

Приложение:
.MODEL SMALL
.DATA ; здесь описывается сегмент данных
;text DB 'This is string$',0
;str DB 'Press any key for continue$',0
n1 DB 8 DUP(?)
n2 DB 8 DUP(?)

.STACK 256; здесь описывается сегмент стека

.CODE
MAIN PROC
LEA DX,n1
CALL INPUT

LEA DX,n2
CALL INPUT ;второе число почему-то пишется на экран при вводе поверх первого.

INPUT PROC
MOV BX,DX
MOV AL,6
MOV [BX],AL
MOV AH,0AH
INT 21H
MOV AH,[BX]+1
RET
INPUT ENDP

MOV AH,09H ; выводим число на экран, получается криво. если при вводе не завершить строку символом '$'
INT 21H

MOV AX, 4C00H ; корректный выход и программы
INT 21H
END MAIN

Обсуждение

давно
Старший Модератор
31795
6196
12.02.2009, 11:22
общий
Костин Александр Владимирович:


А зачем Вы вводите строку, если можно вводит число и потом работать сним как с числом:
CALL INPUT ;второе число почему-то пишется на экран при вводе поверх первого.
Тут должен быть вывод и завершение работы, т.к. Вы зацикливаете программу
INPUT PROC
MOV BX,DX

по заданию:
т.е. если Вы вводите к примеру 10 и 20, то должно быть 10 11 12 ..... 19 20
да?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
12.02.2009, 11:23
общий
Я ввожу строку, чтобы разобраться со всем этим.
Да при вводе 10 и 20 должен быть именно такой вывод.
Неизвестный
12.02.2009, 11:25
общий
И, кстати, как с этим справиться?
MOV AH,09H ; выводим число на экран, получается криво. если при вводе не завершить строку символом '$'
INT 21H
Есть какая-либо возможность прибавлять символ '$' к строке автоматически? Еще мусор присутствует перед выводимой строкой.
давно
Старший Модератор
31795
6196
12.02.2009, 12:11
общий
это ответ
Здравствуйте, Костин Александр Владимирович!

Программа в приложении.
Ваша основная ошибка, это не настроенные сегментные регистры.
;настраиваем сегмент данных
mov ax,@data
mov ds,ax

При запуске программы сегментные регистры DS и ES указывают на префикс программы, а не на сегмент данных.
Для функций ввода/вывода строки нужно:
Цитата: int 21
AH = 09h
DS:DX -> '$'-terminated string

Удачи!

Приложение:
model small
.data
dbErrorNumber db 10,13,'wrong number$'
dbEnter db 10,13,'Enter number '
dbSimbol db 'A :$'
.stack 256
.code
.186
;текстовый режим
begin: mov ax,3
int 10h
;настраиваем сегмент данных
mov ax,@data
mov ds,ax
;вводим первое число
call inputNumber
push di
;вводим второе число
call inputNumber
;переводим строку
mov al,13
int 29h
mov al,10
int 29h
;проверяем число
pop ax
cmp ax,di
jb noError
;ошибка
isError: mov dx,offset dbErrorNumber
mov ah,9
int 21h
jmp doStop
;нет ошибки работаем
noError: call outputNumber
inc ax
cmp ax,di
jbe noError
;
;выход
doStop: xor ax,ax
int 16h
mov ax,4c00h
int 21h
;
;
;
;п\п-мма ввода числа
inputNumber: mov ah,9
mov dx,offset dbEnter
int 21h
;сбрасываем в число
xor di,di
;система счисления
mov si,10
;вводим без эхо
inputChar: xor ax,ax
int 16h
;клавиша ввод
cmp al,13
jz isStop
;диапозон цифровых клавиш
cmp al,'0'
jb inputChar
cmp al,'9'
ja inputChar
;да - выводим
int 29h
;переводим в число
and ax,0fh
;DI*10 + AX
xchg ax,di
xor dx,dx
mul si
add di,ax
jnc inputChar
pop cx
jmp isError
;меняем букву
isStop: inc byte ptr dbSimbol
ret
;
;
;
;выводим число
outputNumber: pusha
;начальные значения
mov si,10
xor cx,cx
;получаем остаток от деления и запоминаем в стеке
isDiv: xor dx,dx
div si
push dx
inc cx
;пока АХ не 0
or ax,ax
jnz isDiv
;выводим из стека
isout: pop ax
or ax,30h
int 29h
loop isOut
;разделительный пробел
mov al,' '
int 29h
popa
ret
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа