Арифметические операции - Assembler (226085)

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

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

Вот условие задачи: if a = 0 then b*c; if a < 0 then c-a; if a > 0 then 0 В моем коде некорректно работает когда a < 0 выводит все время 0. Как это исправить?
    ideal
    model   small
    stack   100h
dataseg
    a   dw  -7
    b   dw  3
    c   dw  2
codeseg
start:
    mov ax,@data
    mov ds,ax
    mov ax,[a]
    mov bx,[b]
    mov cx,[c]
    cmp ax,0
    jz a1
    jb a2
    ja a3
    
    a1:
    mov ax,bx
    mul cx
    jmp a4
    a2:
    sub cx,ax
    mov ax,cx
    jmp a4
    a3:
    mov ax,0
    a4:
    call OutInt
    xor ax,ax
    int 16h
exit:
    mov ax,4c00h
    int 21h
    
proc OutInt 
     
    xor     cx, cx
    mov     bx, 10 
oi2:
    xor     dx,dx
    div     bx
    push    dx
    inc     cx
    test    ax, ax
    jnz     oi2
    mov     ah, 02h
oi3:
    pop     dx
    add     dl, '0'
    int     21h
    loop    oi3
    ret
endp OutInt 
 
end start

Решение задачи: «Арифметические операции»

textual
Листинг программы
 ;ideal
    .model   small
    .stack   100h
.data
    a   dw  ?
    b   dw  ?
    c   dw  ?
.code
start:
    mov ax,@data
    mov ds,ax
    call InputInt
    mov a,ax
    call InputInt
    mov b,ax
    call InputInt
    mov c,ax
    
    mov ax,a
    mov bx,b
    mov cx,c
    
    cmp ax,0
   
    jl a2       
    jg a3       
 
    mov ax,bx
    mul cx
    jmp a4
a2:
    sub cx,ax
    mov ax,cx
    jmp short a4
a3:
    mov ax,0
a4:
    call OutInt
    xor ax,ax
    int 16h
exit:
    mov ax,4c00h
    int 21h
     
OutInt  proc 
     
    xor     cx, cx
    mov     bx, 10 
oi2:
    xor     dx,dx
    div     bx
    push    dx
    inc     cx
    test    ax, ax
    jnz     oi2
    mov     ah, 02h
oi3:
    pop     dx
    add     dl, '0'
    int     21h
    loop    oi3
    ret
OutInt endp 
 
 
InputInt proc 
;сохранить все используемые регистры
    push dx
    push bx
    push cx
    push si
    push di
    push ds
    push cs
    pop ds
;ds на сегмент кода
    mov ah,0ah
    xor di,di
    mov dx, offset buff 
    int 21h         ;ввод строки чисел (в конце введенной строки будет код 13 - возврат каретки)
    mov dl,0ah
    mov ah,02
    int 21h             ;перевод курсора на новую строку
    mov si,offset buff+2 
    cmp byte ptr [si],"-"   ;если первый символ "-" то число отрицательное и di выступает в качестве флага числа
    jnz ii1
    mov di,1  
    inc si    
ii1:
    xor ax,ax           ;в ах будет число
    mov bx,10  
ii2:
    mov cl,[si]         ;берем очередной символ из введенной строки
    cmp cl,0dh          ;если это 13 то конец
    jz enddecin
    
;проверка на диапазон чисел '0'-'9'
    cmp cl,'0'  
    jl er
    cmp cl,'9'  
    ja er
    ;если введено что-то иное, то ошибка
    sub cl,'0'      ;вычитаем код нуля и получаем цифрку
    mul bx              ;сдвиг умножаем на 10, тем самым сдвигаем десятичные разряды
    add ax,cx           ;прибавляем цифру
    inc si    
    jmp ii2             ;повторим
er:  
    mov dx, offset error        ;выводим сообщение об ошибке
    mov ah,09
    int 21h
    int 20h             ;уходим в дос
 
enddecin:
    cmp di,1                ;если di 1, то число отрицательное 
    jnz ii3
    neg ax              ;меняем знак   
ii3:
    pop ds
    pop di
    pop si
    pop cx
    pop bx
    pop dx
    ret
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp 
 
end start

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

  1. Ассемблерный код написан на языке Assembler.
  2. Задача кода - выполнение арифметических операций над числами, введенными пользователем.
  3. Постановка задачи: предположительно, пользователю предлагается ввести три числа, после чего выполняются арифметические операции над этими числами и результат выводится на экран.
  4. Организация кода: код организован в виде функции с названием start, которая инициируется при запуске программы. Внутри функции start расположены подфункции InputInt и OutInt, которые выполняют ввод чисел от пользователя и вывод результата соответственно.
  5. Ввод чисел: процесс ввода чисел начинается с вызова функции InputInt. Введенные числа сохраняются в переменных a, b и c. Если введенное число отрицательное, то устанавливается флаг di.
  6. Выполнение операций: после ввода чисел выполняются арифметические операции. Если первое число отрицательное, то результат операции будет отрицательным.
  7. Вывод результата: результат операции выводится на экран с помощью функции OutInt.
  8. Ошибки ввода: если введено некорректное число (не '0'-'9'), то выводится сообщение об ошибке с помощью функции OutputInt.
  9. Необходимые процедуры: для выполнения задачи используются следующие процедуры: InputInt - ввод чисел от пользователя, OutInt - вывод результата на экран.
  10. Список переменных: в коде используются следующие переменные: a, b, c - для хранения введенных чисел, buff - буфер для ввода чисел, error - сообщение об ошибке.

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


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

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

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