Как вывести остаток от деления - Assembler
Формулировка задачи:
Результат деления от -55/4=-13.75
Вывожу -13.
А где храниться остаток 75 и как его вывести.Ума не приложу.Ох если бы эксперт взглянул и ругнулся.
Листинг программы
- ;z=(4*c-d/2+23)/(a*a-1)
- .MODEL small
- .Stack 100h
- Datas segment
- a dw 2
- c dw 2
- d dw 2
- z dw ?
- h dw ?
- znam dw ?
- mess db 'Error! Division by zero.$'
- Datas ends
- Codes segment
- Assume cs:Codes, ds:Datas
- First: mov ax, Datas
- mov ds, ax
- ;a*a
- mov ax, a
- cwd
- imul a
- ;if a == 1 => divide by zero => error
- cmp ax, 1
- je @err
- ;(a*a)-1
- mov h, 1
- sbb ax, h
- mov znam, ax
- ;4*c
- mov h, 4
- mov ax, c
- imul h
- mov z, ax
- ;d/2
- mov h, 2
- mov ax, d
- cwd
- idiv h
- ;(4*c)-(d/2)
- sbb z, ax
- ;(4*c-d/2)+23
- mov ax, z
- mov h, 23
- adc ax, h
- ;(4*c-d/2+23) / (znam)
- cwd
- idiv znam
- mov z, ax
- xor ax, ax
- mov ax, z
- push ax
- cmp ax, 0
- jns @plus ;если знак плюс (знаковый (старший) бит результата равен 0)
- mov dl, '-'
- mov ah, 02h ;вивод
- int 21h
- pop ax
- neg ax
- @plus: xor cx, cx
- mov bx, 10
- @dvsn: xor dx, dx
- div bx
- push dx
- inc cx
- test ax, ax
- jnz short @dvsn ;если нет нуля
- mov ah, 02h
- @vivod: pop dx
- add dl, 30h ; +30
- int 21h
- loop @vivod
- jmp @end
- @err: mov dx, offset mess
- mov ah, 09h
- int 21h
- @end: mov ax, 4c00h
- int 21h
- Codes ends
- end First
Ой не тот код напечатал,вот правильный,как вывести остаток 75
Листинг программы
- ;Z = (-53/a + d - 4*a)/(1+a*b)
- ;a=1 d=2 b=3
- ;X=-53/a=-53
- ;Y=4*a=4*1=4
- ;Z=x+d=-53+2=-51
- ;S=z-y=-51-4=-55/////
- ;X=a*b=1*3=3
- ;Y=x+1=3+1=4///
- ;Z=s/y=-55/4=-18
- .MODEL small
- .Stack 100h
- Datas segment
- a dw 1
- b dw 3
- d dw 2
- x dw ?
- y dw ?
- z dw ?
- s dw ?
- mess db 'Error! Division by zero.$'
- mes db '.$'
- Datas ends
- Codes segment
- Assume cs:Codes, ds:Datas
- First: mov ax, Datas
- mov ds, ax
- xor ax, ax
- cmp a, 0
- je @err
- ;X=a*b=1*3=3
- mov ax,a
- imul b
- add ax,1
- mov y,ax
- ;X=-53/a=-53/1=-53
- mov ax, -53
- cwd
- idiv a
- mov x, ax
- mov ax,-4
- imul a
- add ax,d
- add ax,x
- cwd
- idiv y
- mov z,ax
- @otv: xor ax, ax
- mov ax, z
- push ax
- cmp ax, 0
- jns @plus ;åñëè Г§Г*Г*ГЄ ïëþñ (Г§Г*Г*êîâûé (Г±ГІГ*ðøèé) ГЎГЁГІ ðåçóëüòГ*ГІГ* Г°Г*ГўГҐГ* 0)
- mov dl, '-'
- mov ah, 02h
- int 21h
- pop ax
- neg ax
- @plus: xor cx, cx
- mov bx, 10
- @dvsn: xor dx, dx
- div bx
- push dx
- inc cx
- test ax, ax
- jnz short @dvsn ;åñëè Г*ГҐГІ Г*óëÿ
- mov ah, 02h
- @vivod: pop dx
- add dl, 30h ; +30
- int 21h
- loop @vivod
- jmp @tochka
- @err: mov dx, offset mess
- mov ah, 09h
- int 21h
- @tochka: mov dx, offset mes
- mov ah, 09h
- int 21h
- @end: mov ax, 4c00h
- int 21h
- Codes ends
- end First
Решение задачи: «Как вывести остаток от деления»
textual
Листинг программы
- LOCALS
- .model small, Pascal
- .stack 100h
- .data
- CrLf db 0Dh, 0Ah, '$'
- A dw 1234
- B dw 345
- Accuracy dw 4 ;количество десятичных знаков после запятой
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;деление A на B и получение целой части частного
- mov ax, [A] ;dx:ax = A
- mov dx, 0
- mov bx, [B] ;bx = B
- idiv bx ;ax = A / B, dx = A % B
- call Show_AX
- ;вывод запятой
- push dx
- mov ah, 02h
- mov dl, ','
- int 21h
- pop dx
- ;вывод нескольких десятичных знаков десятичной дроби
- mov si, 10 ;основание счисления
- mov cx, [Accuracy] ;количество знаков после запятой
- @@For:
- mov ax, dx
- mul si
- div bx
- call Show_AX
- loop @@For
- mov ah, 09h
- lea dx, [CrLf]
- int 21h
- mov ax, 4C00h
- int 21h
- main endp
- ; выводит беззнаковое 16-разрядное число из регистра AX на экран
- ; входные данные:
- ; ax - число для отображения
- Show_AX proc
- push ax
- push bx
- push cx
- push dx
- push di
- mov cx, 10
- xor di, di ; di - кол. цифр в числе
- @@Conv:
- xor dx, dx
- div cx ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc di
- push dx ; складываем в стек
- or ax, ax
- jnz @@Conv
- ; выводим из стека на экран
- @@Show:
- pop dx ; dl = очередной выводимый символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- dec di ; повторяем пока di<>0
- jnz @@Show
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Show_AX endp
- end main
Объяснение кода листинга программы
- Объявление локальных переменных.
- Объявление модели small и Pascal.
- Выделение стека размером 100h.
- Объявление данных:
- CrLf =
0Dh, 0Ah, '$'
- последовательность символов для перевода строки. - A = 1234 - переменная типа dw (2 байта) со значением 1234.
- B = 345 - переменная типа dw (2 байта) со значением 345.
- Accuracy = 4 - переменная типа dw (2 байта) со значением 4, указывающая количество десятичных знаков после запятой.
- CrLf =
- Объявление кода:
- Подготовка регистров для работы с данными.
- Деление A на B и получение целой части частного.
- Вызов функции Show_AX для вывода значения ax на экран.
- Вывод запятой на экран.
- Вывод нескольких десятичных знаков десятичной дроби.
- Вывод перевода строки на экран.
- Завершение программы.
- Описание функции Show_AX:
- Подготовка регистров и переменных.
- Деление числа на основание счисления (10).
- Преобразование остатка от деления в символ и добавление его в стек.
- Повторение процесса до тех пор, пока число не равно нулю.
- Вывод символов из стека на экран.
- Восстановление регистров и переменных.
- Завершение функции.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д