Протестировать - Assembler
Формулировка задачи:
протестируйте программу плз и замечания
Текст программы:Написать программу ввода вывода двух двухразрядных десятичных чисел чисел,умножить их ,применяя арифметику над числами с фиксированной точкой , и вывести результат в виде символьного десятичного числа.
mov ax,cs mov ds,ax mov es,ax mov ah,9 mov dx,msg0 int 21h call InputInt mov bx,ax mov ah,9 mov dx,CR int 21h mov ah,9 mov dx,msg1 int 21h call InputInt mul bx push ax mov ah,9 mov dx,CR int 21h mov ah,9 mov dx,msg2 int 21h pop ax call OutInt mov ah,0 int 16h mov ax,4c00h int 21h msg0 db "a=$" msg1 db "b=$" msg2 db "a*b=$" CR db 13,10,"$" OutInt: pusha xor cx, cx mov bx, 10 ; основание сс. 10 для десятеричной и т.п. oi2: xor dx,dx div bx ; Делим число на основание сс. В остатке получается последняя цифра. ; Сразу выводить её нельзя, поэтому сохраним её в стэке. push dx inc cx ; А с частным повторяем то же самое, отделяя от него очередную ; цифру справа, пока не останется ноль, что значит, что дальше ; слева только нули. test ax, ax jnz oi2 ; Теперь приступим к выводу. mov ah, 02h oi3: pop dx ; Извлекаем очередную цифру, переводим её в символ и выводим. ;; раскоментировать если основание сс > 10, т.е. для вывода требуются буквы ; cmp dl,9 ; jbe oi4 ; add dl,7 ;oi4: add dl, '0' int 21h ; Повторим ровно столько раз, сколько цифр насчитали. loop oi3 popa ret InputInt: push bx push cx push di push si push dx mov ah,0ah xor di,di mov dx,buff ; аддрес буфера int 21h ; принимаем строку mov dl,0ah mov ah,02 int 21h ; выводим перевода строки ; обрабатываем содержимое буфера mov si,buff+2 ; берем аддрес начала строки cmp byte [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, error mov ah,09 int 21h int 20h ; все символы из буфера обработаны число находится в ax endin: cmp di,1 ; если установлен флаг, то jnz ii3 neg ax ; делаем число отрицательным ii3: pop dx pop si pop di pop cx pop bx ret error db "incorrect number$" buff db 3,7 Dup(?)
Решение задачи: «Протестировать»
textual
Листинг программы
; fasm dos exe # format MZ mov ax,cs mov ds,ax mov es,ax mov ah,9 mov dx,msg0 int 21h call InputInt mov [a],ax mov al,0Ah int 29h mov ah,9 mov dx,msg2+2 int 21h call InputInt imul [a] push ax mov al,0Ah int 29h mov ah,9 mov dx,msg2 int 21h pop ax test ax,ax jns @f push ax mov al,'-' int 29h pop ax neg ax @@: call OutInt mov ah,0 int 16h mov ah,4Ch int 21h msg0 db "a=$" msg2 db "a*b=$" OutInt: xor cx, cx mov bx, 10 ; основание сс. 10 для десятеричной и т.п. @@: xor dx,dx div bx ; Делим число на основание сс. В остатке получается последняя цифра. ; Сразу выводить её нельзя, поэтому сохраним её в стэке. add dl,'0' push dx inc cx ; А с частным повторяем то же самое, отделяя от него очередную ; цифру справа, пока не останется ноль, что значит, что дальше ; слева только нули. test ax,ax jnz @b ; Теперь приступим к выводу. @@: pop ax int 29h ; Повторим ровно столько раз, сколько цифр насчитали. loop @b ret InputInt: mov ah,0Ah xor di,di mov dx,buff ; адрес буфера int 21h ; принимаем строку mov al,0Ah int 29h ; выводим перевод строки ; обрабатываем содержимое буфера mov si,buff+2 ; берем аддрес начала строки cmp byte [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, error mov ah,09 int 21h int 20h ; все символы из буфера обработаны число находится в ax endin: cmp di,1 ; если установлен флаг, то jnz ii3 neg ax ; делаем число отрицательным ii3: ret error db "incorrect number$" buff db 6,9 Dup(?) a dw ?
Объяснение кода листинга программы
- Сохранение кода в формате MZ - это необходимо для работы с файлом в DOS.
- Переменная
a
- используется для хранения числового значения. - Переменная
buff
- используется для хранения введенного пользователем числа. - Функция
InputInt
- отвечает за ввод числа с клавиатуры. - Функция
OutInt
- отвечает за вывод числа на экран. - Переменная
bx
- используется как счетчик для разделения числа на разряды. - Переменная
cx
- используется как счетчик для цикла вывода числа. - Переменная
dx
- используется для хранения остатка от деления в функцииOutInt
. - Переменная
si
- используется как указатель на текущий символ в буфереbuff
. - Переменная
di
- используется как флаг для определения, является ли введенное число отрицательным. - Переменная
error
- используется для хранения сообщения об ошибке. - Переменная
buff
- используется для хранения символов, которые были введены пользователем. - Переменная
a
- используется для хранения результата вычисления. - Функция
ii1
- отвечает за проверку первого символа введенного числа. - Функция
ii2
- отвечает за обработку каждого символа введенного числа. - Функция
er
- отвечает за обработку ошибки при вводе числа. - Функция
endin
- отвечает за завершение обработки введенного числа. - Функция
ii3
- отвечает за преобразование положительного числа в отрицательное. - Функция
OutInt
- отвечает за вывод числа на экран. - Функция
InputInt
- отвечает за ввод числа с клавиатуры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д