Арифметические операции - 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
Объяснение кода листинга программы
- Ассемблерный код написан на языке Assembler.
- Задача кода - выполнение арифметических операций над числами, введенными пользователем.
- Постановка задачи: предположительно, пользователю предлагается ввести три числа, после чего выполняются арифметические операции над этими числами и результат выводится на экран.
- Организация кода: код организован в виде функции с названием
start
, которая инициируется при запуске программы. Внутри функцииstart
расположены подфункцииInputInt
иOutInt
, которые выполняют ввод чисел от пользователя и вывод результата соответственно. - Ввод чисел: процесс ввода чисел начинается с вызова функции
InputInt
. Введенные числа сохраняются в переменныхa
,b
иc
. Если введенное число отрицательное, то устанавливается флагdi
. - Выполнение операций: после ввода чисел выполняются арифметические операции. Если первое число отрицательное, то результат операции будет отрицательным.
- Вывод результата: результат операции выводится на экран с помощью функции
OutInt
. - Ошибки ввода: если введено некорректное число (не '0'-'9'), то выводится сообщение об ошибке с помощью функции
OutputInt
. - Необходимые процедуры: для выполнения задачи используются следующие процедуры:
InputInt
- ввод чисел от пользователя,OutInt
- вывод результата на экран. - Список переменных: в коде используются следующие переменные:
a
,b
,c
- для хранения введенных чисел,buff
- буфер для ввода чисел,error
- сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д