Консультация № 158563
23.01.2009, 20:02
0.00 руб.
0 1 1
здравствуйте.

у меня не получается ввести многозначные числа (процедура ввода элементов) пробовал по всякому, понимаю примерно в каком направлении надо копать, но по неопытности у меня получается очень громоздкий код в котором я начинаю путаться. по этому прошу помочь мне написать процедуру ввода. Нужно вводить байты положительные числа.

Заранее всем благодарен.

Приложение:
masm
model small
.386
.stack 512h
.data
mes0 db 10,13,"Dlya udobstva vvoda Vvedite razmernost nxm do 9x9$"
mes1 db 10,13,"Vvedite kol-vo strok $"
mes1_1 db 10,13,"Vvedite kol-vo stolbcev $"
mes2 db 10,13,"Vvedite elementi matrici (bayti polojitelnie chisla): $"
mes3 db 10,13,"matrica $"
mes4 db 10,13,"preobrazovannaya matrica $"
ent db 10,13,"$"
probel db " $"
mas db 9 dup (9 dup (?))

max db 0
ndx db 2 dup (?)
buf db 0
m db ? ; строки
n db 0 ; столбцы
nn db 0
i db ?
j db ?

.code
main:
mov ax,@data
mov ds,ax

mov ax,03
int 10h ; очистка экрана

call vvod_raz ; процедура ввода размерности
call vvod_elem ; процедура ввода элементов
call vivod_safe ; процедура вывода матрицы
call preobrazovanie ; процедура преобразования матрицы
call vivod_safe ;
; *********************************************
;----------------------------------------------
mov ax,4c00h
int 21h ;выход из программы
;----------------------------------------------
; *********************************************


; ***********************************************
; --- процедуры -----------
; ***********************************************

preobrazovanie proc

mov ax,0
mov dx,0
mov al,m
mov dl,n
mul dx
mov cx,ax ; количество циклов

cikle123:
push cx ; сохраняем для внутреннего цикла

mov ax,0 ; очищаем ax
mov al,n ; n->al
mov cx,ax ; сx:=al | cx - это количество циклов

mov bx,0 ; начинаем с НУЛЕВОГО элемента массива
mov si,0

mov buf,0 ; максимальный элемент равен 0
cikl:
xor ax,ax
xor dx,dx
mov al,buf
mov dl,mas[si][bx]
cmp dx,ax
jb perebor_end ;если mas[si][bx] < buf прыгаем в конец
xor ax,ax
mov al,mas[si][bx]
mov buf,al
call ndx_save ; сохраняем координаты max элемента
perebor_end:

mov si,2
mov ax,si
mov dl,0
mov dl,m
cmp ax,dx ; если m<si выходим из цикла
jb finish_pre

loop cikl

finish_pre:
call max_nul ; обнуляем max элементы
mov bx,2 ; переход на чётные элементы начиная с нуля
pop cx
loop cikle123

ret
preobrazovanie endp


; ************
; ************

max_nul proc ; процедура обнуления max элемента НАЧАЛО
push ax
push bx
push cx
push si
push dx
mov ax,0
mov bx,0
mov cx,0
mov dx,0
mov si,0

mov al,ndx[bx]
mov bx,1
mov dl,ndx[bx]
mov si,ax
mov bx,dx
mov mas[si][bx],0

pop dx
pop si
pop cx
pop bx
pop ax

ret
max_nul endp ; процедура обнуления max элемента КОНЕЦ

; ************
; ************

ndx_save proc ; процедура сохранения индексов max элеметов НАЧАЛО

push ax
push dx
xor ax,ax
xor dx,dx

mov ax,si
mov dx,bx
push bx
mov bx,0
sub al,30h
mov ndx[bx],al
mov bx,1
sub dl,30h
mov ndx[bx],dl
pop bx
pop dx
pop ax

ret
ndx_save endp ; процедура сохранения индексов max элементов КОНЕЦ

; ************
; ************

vvod_elem proc ; процедура ввода элементов НАЧАЛО

mov ah,09h
mov dx,offset mes2
int 21h

mov al,m
mul n ; proizvedenie v AX
mov cx,ax ; kolich-vo ciklov -> CX

mov di,0 ; nachinaem s 0

ml:
;********
push dx
xor dx,dx

mov ah,01h
int 21h ; otpravlaet v AL
mov dx,10
mul dl
mov dl,al

xor ax,ax
mov ah,01h
int 21h
add dl,al
mov al,10
mul dl
mov dx,ax

xor ax,ax
mov ah,01h
int 21h
add dl,al


pop dx
mov mas[di],al ; vvod elementa
add di,2 ; переход к следующему элементу
;********

mov ah,09h
mov dx,offset probel
int 21h
loop ml

mov ah,09h
mov dx,offset ent
int 21h
mov ah,09h
mov dx,offset ent
int 21h

ret
vvod_elem endp ; процедура ввода элементов КОНЕЦ

; ************
; ************

vivod_safe proc ; процедура вывода матрицы НАЧАЛО

mov ax,0 ; очищаем ax
mov al,n ; n->al
mov dl,m ; m->dl
mul dl ; n*m | al*dl->al
mov cx,ax ; сx:=al | cx - это количество циклов
mov bx,0 ; начинаем с НУЛЕВОГО элемента массива

mov dx,0
push dx

ciklex:

mov dl,mas[bx]
mov ah,2
int 21h ; вывод элемента массива

mov dl,9 ; табуляция
int 21h

add bx,2

;****
pop dx
push bx

inc dx
xor ax,ax
mov al,n
mov bx,dx

cmp ax,bx
jne @IfNot

lea dx,ent
mov ah,9
int 21h ; enter

xor dx,dx

@IfNot:

pop bx
push dx

;****
loop ciklex

pop dx

mov ah,09h
mov dx,offset ent
int 21h

ret
vivod_safe endp ; процедура вывода матрицы КОНЕЦ

; ************
; ************

vvod_raz proc ; процедура ввода размерности НАЧАЛО

mov ah,09h
mov dx,offset mes0
int 21h

mov ah,09h
mov dx,offset mes1
int 21h

mov ah,01h
int 21h ; otpravlaet v AL
mov m,al ; stroki
sub m,30h


mov ah,09h
mov dx,offset mes1_1
int 21h


mov ah,01h
int 21h ; otpravlaet v AL
mov n,al ; stolbci
sub n,30h

mov ah,09h
mov dx,offset ent
int 21h

ret
vvod_raz endp ; процедура ввода размерности КОНЕЦ


; ************
; ************

end main

Обсуждение

давно
Старший Модератор
31795
6196
23.01.2009, 21:10
общий
это ответ
Здравствуйте, Shaman_888!

В приложении программа, которая была написана для вопроса №158472 - ввод знакового числа(32-а бита), сохранение его в памяти и последующий его вывод.
Если посмотрите архив рассылки, там очень много таких примеров(и для 16-ть бит и для 32-ух бит)
Удачи!

Приложение:
;команды компилятора
;tasm pr
;tlink pr /t
model tiny
.code
.386
org 100h
;ставим текстовый режим
begin: mov ax,3
int 10h
;выводим сообщение
mov ah,9
mov dx,offset dbEnter
int 21h
;готовимся к вводу данных
xor edi,edi
xor ecx,ecx
mov ebx,10
;вводим пока не нажата клавиша "enter"
InputLoop: xor ax,ax
int 16h
;нажата клавиша "enter"
cmp al,13
jz isStop
;нажата клавиша "миниус"
cmp al,'-'
jz isMinus
;проверяем диапазон цифровых клавиш
cmp al,'0'
jb InputLoop
cmp al,'9'
ja InputLoop
;нажата цифра выводим её и преобразовываем в число
int 29h
and eax,0fh
;меняем местами ранее введенное число и текущее
xchg edi,eax
;ранее введенное число умножаем на 10
xor edx,edx
mul ebx
;суммируем с текущим
add edi,eax
jmp short InputLoop
;введен знак "мимнус"
;проверяем если число больше 0 - игнорируем
isMinus: or edi,edi
jnz InputLoop
;выводим минус
int 29h
mov ecx,-1
jmp short InputLoop
;ввод закончен, проверяем знак
isStop: or ecx,ecx
jz noMinus
;переводим в доп.код
not edi
inc edi
;запоминаем в памяти
noMinus: mov ddNumber,edi
;
;
;выводим сообщение о результате
mov ah,9
mov dx,offset dbResult
int 21h
;загружаем число и проверяем знак
mov eax,ddNumber
or eax,eax
jns noZnak
;выводим знак
mov al,'-'
int 29h
;загружаем число снова, т.к. AL был испорчен
mov eax,ddNumber
;переводим к абсолютному виду
not eax
inc eax
;готовимся к выводу
noZnak: mov edi,10
xor cx,cx
;цикл получения остатка от деления на 10
divLoop: xor edx,edx
div edi
;остаток запоминаем в стеке и считаем их количество цифр
push dx
inc cx
;повторяем пока не достигнем 0
or eax,eax
jnz divLoop
;цикл вывода на экран в нужном порядке всех цифр из стека
outputLoop: pop ax
;переводим с символьный вид
or al,30h
int 29h
loop outputLoop
;ожидаем любую клавишу
xor ax,ax
int 16h
ret
;данные
ddNumber dd ?
dbEnter db 13,10,'Enter number:$'
dbResult db 13,10,'You number:$'
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа