Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Разработка программы ввода последовательности символов и определения в ней доли символов «пробел» на assembler

SomeOne . Ученик (96), открыт 2 дня назад
Исходные данные для проектирования
Устройство ввода данных – клавиатура. Устройство вывода данных - экран
монитора. Число вводимых символов – 29. Язык программирования - ассемблер
для процессоров семейства x86. Ввод данных выполнить с использованием
функции 0 прерывания 16h. Вывод данных выполнить на экран монитора,
функционирующем в текстовом режиме. Управление курсором реализовать при
помощи функции 2 прерывания 10h. Полученный результат вывести в 10 строке
экрана. Вывод информации на экран реализовать с помощью прямого доступа к
видеопамяти. Дополнительно вывести в левом нижнем углу экрана текущую дату.
при выводе колличества пробелов выводит:
apases: 0%
вот мой нерабочий код. Не пойму в чем дело
ideal
p386n
model small
dataseg
attr db 0dh
addres dw 0b800h
s db 29 dup (0)
x db 0
y db 0
spaceCount dw 0 ; Количество символов пробел
inputLen db 0 ; Длина введенной строки
spaceMsg db 'Spaces: $'
codeseg
proc mproc
mov al,160
mul [y]
mov di, ax
sub ax, ax
mov al, [x]
shl ax, 1
add di, ax
ret
endp
proc input
lea si, [s]
@@i:mov ah, 2
mov dh, [y]
mov dl, [x]
sub bh, bh
int 10h
@@i1:xor ax, ax
int 16h
cmp al, 13
je @@i5
cmp al, 32
jne @@i2
inc [spaceCount] ; Увеличиваем счетчик пробелов
@@i2:mov ah, [attr]
stosw
mov [si], al
inc si
inc [x]
cmp [x],80
jb @@i
mov [x],0
inc [y]
jmp @@i
@@i5:mov [byte ptr si],0
mov [word ptr inputLen], si
sub [inputLen], offset s
ret
endp
proc printRatio
push ax
push bx
push cx
push dx

; Вывод "Spaces: "
mov ah, 9
mov dx, offset spaceMsg
int 21h

; Вычисление доли пробелов
mov ax, [spaceCount]
mov bl, [inputLen]
xor dx, dx
div bl
mov bl, 100
mul bl
mov cl, al

@@print:
; Вывод целой части
mov ah, 2
mov dl, cl
add dl, '0'
int 21h

mov dl, '%'
int 21h

pop dx
pop cx
pop bx
pop ax
ret

@@zero:
mov dl, '0'
int 21h
mov dl, '%'
int 21h
ret
endp

start:
mov ax, @data
mov ds, ax
mov es, [addres]
mov ax, 500h
int 10h
call mproc
call input
call printRatio ; Вывод доли пробелов
; Ждем нажатия Enter
mov ah, 0
int 16h
mov ah, 4Ch
int 21h
stack 200
end start
1 ответ
GGG Просветленный (25994) 2 дня назад
 ideal 
p386
model small

dataseg
attr db 0dh
addres dw 0b800h
s db 29 dup (0)
x db 0
y db 0
spaceCount dw 0
inputLen dw 0
spacePercent dw 0
spaceMsg db 'Spaces: ', 0

codeseg
proc mproc
mov al, 160
mul [y]
mov di, ax
sub ax, ax
mov al, [x]
shl ax, 1
add di, ax
ret
endp

proc input
lea si, [s]
@@i:
mov ah, 2
mov dh, [y]
mov dl, [x]
sub bh, bh
int 10h
@@i1:
xor ax, ax
int 16h
cmp al, 13
je @@i5
cmp al, 32
jne @@i2
inc [spaceCount]
@@i2:
mov ah, [attr]
stosw
mov [si], al
inc si
inc [x]
inc [inputLen]
cmp [x], 80
jb @@i
mov [x], 0
inc [y]
jmp @@i
@@i5:
mov [byte ptr si], 0
ret
endp

proc calculatePercent
mov ax, [spaceCount]
mov bx, 100
mul bx
mov bx, [inputLen]
div bx
mov [spacePercent], ax
ret
endp

proc printRatio
push ax
push bx
push cx
push dx

; Вывод "Spaces: "
mov ah, 9
mov dx, offset spaceMsg
int 21h

; Вывод процента
mov ax, [spacePercent]
mov bx, 10
xor cx, cx
@@divide:
xor dx, dx
div bx
push dx
inc cx
test ax, ax
jnz @@divide

@@print:
pop dx
add dl, '0'
mov ah, 2
int 21h
loop @@print

; Вывод символа %
mov dl, '%'
int 21h

pop dx
pop cx
pop bx
pop ax
ret
endp

start:
mov ax, @data
mov ds, ax
mov es, [addres]

mov ax, 500h
int 10h

call mproc
call input
call calculatePercent
call printRatio

; Ждем нажатия Enter
mov ah, 0
int 16h

mov ah, 4Ch
int 21h

stack 200h
end start
Похожие вопросы