Неправильно работает программа (операции над числами) - Assembler

Узнай цену своей работы

Формулировка задачи:

.model small
.stack 100h
.data
    msg1    db 'enter first number: $'
    msg2    db 0dh, 0ah,'enter second number: $'  
    msg3    db 0dh, 0ah,'enter third number : $'
    msg4    db 0dh, 0ah , 'result is : $' 
    msg5    db 0dh, 0ah ,'press any key... ', 0Dh, 0Ah, '$'
    msg6    db "wrong symbol!", 0Dh, 0Ah, '$'
.code 
 
inint   proc    near
        push    cx
        push    dx
        push    bx
        push    si
        xor     si, si
        xor     bx, bx
        xor     cx, cx
        mov     ah, 01h
        int     21h
        cmp     al, '-'
        jne     short @ii1
        inc     si
@ii0:   mov     ah, 01h
        int     21h
@ii1:   cmp     al, 39h
        ja      short @ii2
        sub     al, 30h
        jb      short @ii2
        shl     bx, 1
        mov     ax, bx
        shl     ax, 2
        add     bx, ax
        add     bx, cx
        jmp     short @ii0
@ii2:   test    si, si
        jz      short @ii3
        neg     bx
@ii3:   mov     ah, 02h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     ax, bx
        pop     si
        pop     bx
        pop     dx
        pop     cx
        ret
inint   endp
 
outint  proc    near
        push    cx
        push    dx
        push    bx
        push    ax
        test    ax, ax
        jns     short @oi1
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop     ax
        push    ax
        neg     ax
@oi1:   xor     cx, cx
        mov     bx, 10
@oi2:   xor     dx, dx
        div     bx
        push    dx
        inc     cx
        test    ax, ax
        jnz     short @oi2
        mov     ah, 02h
@oi3:   pop     dx
        add     dl, 30h
        int     21h
        loop    @oi3
        pop     ax
        pop     bx
        pop     dx
        pop     cx
        ret
outint  endp
 
main proc   
    mov dx, @data             
    lea dx, msg1
    mov ah, 9  
        int 21h
    call    inint
    imul    ax
    mov bx, ax
    lea dx, msg2
    mov ah, 9  
        int 21h
    call    inint
    imul    ax
    add bx, ax
    lea dx, msg3
    mov ah, 9  
        int 21h
    call    inint
    add ax, bx
    call    outint     
        mov ah, 4ch
    int 21h
main endp
end main
Пользователь должен ввести 3 числа, а вывод - результат A*A+B*B+C. A, B и С числа введенные пользователем. Я новичок и не умею пользоваться дебагом, времени разбираться в нем нету. Спасибо за помощь.
Сам разобрался )

Решение задачи: «Неправильно работает программа (операции над числами)»

textual
Листинг программы
.model small
.stack 100h
.data
    msg1    db 'enter first number: $'
    msg2    db 0dh, 0ah,'enter second number: $'  
    msg3    db 0dh, 0ah,'enter third number : $'
    msg4    db 0dh, 0ah , 'result is : $' 
    msg5    db 0dh, 0ah ,'press any key... ', 0Dh, 0Ah, '$'
    msg6    db "wrong symbol!", 0Dh, 0Ah, '$'
.code 
 
inint   proc    near
        push    cx
        push    dx
        push    bx
        push    si
        xor     si, si
        xor     bx, bx
        xor     cx, cx
        mov     ah, 01h
        int     21h
        cmp     al, '-'
        jne     short @ii1
        inc     si
@ii0:   mov     ah, 01h
        int     21h
@ii1:   cmp     al, 39h
        ja      short @ii2
        sub     al, 30h
        jb      short @ii2
    mov     cl, al
        shl     bx, 1
        mov     ax, bx
        shl     ax, 2
        add     bx, ax
        add     bx, cx
        jmp     short @ii0
@ii2:   test    si, si
        jz      short @ii3
        neg     bx
@ii3:   mov     ah, 02h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     ax, bx
        pop     si
        pop     bx
        pop     dx
        pop     cx
        ret
inint   endp
 
outint  proc    near
        push    cx
        push    dx
        push    bx
        push    ax
        test    ax, ax
        jns     short @oi1
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop     ax
        push    ax
        neg     ax
@oi1:   xor     cx, cx
        mov     bx, 10
@oi2:   xor     dx, dx
        div     bx
        push    dx
        inc     cx
        test    ax, ax
        jnz     short @oi2
        mov     ah, 02h
@oi3:   pop     dx
        add     dl, 30h
        int     21h
        loop    @oi3
        pop     ax
        pop     bx
        pop     dx
        pop     cx
        ret
outint  endp
 
main proc   
    mov ax, @data
    mov ds, ax             
    lea dx, msg1
    mov ah, 9  
        int 21h
    call    inint
    imul    ax
    mov bx, ax
    lea dx, msg2
    mov ah, 9  
        int 21h
    call    inint
    imul    ax
    add bx, ax
    lea dx, msg3
    mov ah, 9  
        int 21h
    call    inint
    sub ax, bx
    neg ax
    call    outint     
        mov ah, 4ch
    int 21h
main endp
end main

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

  1. Код написан на ассемблере.
  2. Задача программы - выполнение операций над числами.
  3. Переменные:
    • msg1, msg2, msg3, msg4, msg5, msg6 - строки с сообщениями для ввода и вывода.
    • si, bx, cx, dx - регистры общего назначения, используемые в вычислениях.
    • ax - регистр общего назначения, используемый для хранения результата вычислений.
    • data - сегмент данных, в котором хранятся строки с сообщениями.
  4. Ввод чисел происходит с помощью функции int 21h, которая выводит сообщения msg1, msg2, msg3 и msg4 и считывает значения трех чисел.
  5. После ввода чисел вызывается функция inint, которая выполняет операции сложения и умножения над этими числами и сохраняет результат в регистре ax.
  6. Если введенные числа некорректны (меньше нуля или больше 39), вызывается функция outint, которая выводит сообщение об ошибке.
  7. Функция outint выполняет операции вычитания и деления над числами и сохраняет результат в регистре ax.
  8. Если результат вычислений отрицательный, вызывается функция outint, которая выводит сообщение об ошибке.
  9. После выполнения всех операций вызывается функция outint, которая выводит результат вычислений.
  10. Результат вычислений выводится на экран с помощью функции int 21h.
  11. В конце программы вызывается функция int 21h с аргументом 4ch, которая завершает выполнение программы.

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


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

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

12   голосов , оценка 3.917 из 5
Похожие ответы