Протестировать - 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 ?

Объяснение кода листинга программы

  1. Сохранение кода в формате MZ - это необходимо для работы с файлом в DOS.
  2. Переменная a - используется для хранения числового значения.
  3. Переменная buff - используется для хранения введенного пользователем числа.
  4. Функция InputInt - отвечает за ввод числа с клавиатуры.
  5. Функция OutInt - отвечает за вывод числа на экран.
  6. Переменная bx - используется как счетчик для разделения числа на разряды.
  7. Переменная cx - используется как счетчик для цикла вывода числа.
  8. Переменная dx - используется для хранения остатка от деления в функции OutInt.
  9. Переменная si - используется как указатель на текущий символ в буфере buff.
  10. Переменная di - используется как флаг для определения, является ли введенное число отрицательным.
  11. Переменная error - используется для хранения сообщения об ошибке.
  12. Переменная buff - используется для хранения символов, которые были введены пользователем.
  13. Переменная a - используется для хранения результата вычисления.
  14. Функция ii1 - отвечает за проверку первого символа введенного числа.
  15. Функция ii2 - отвечает за обработку каждого символа введенного числа.
  16. Функция er - отвечает за обработку ошибки при вводе числа.
  17. Функция endin - отвечает за завершение обработки введенного числа.
  18. Функция ii3 - отвечает за преобразование положительного числа в отрицательное.
  19. Функция OutInt - отвечает за вывод числа на экран.
  20. Функция InputInt - отвечает за ввод числа с клавиатуры.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5