Как вывести остаток от деления - 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).
- Преобразование остатка от деления в символ и добавление его в стек.
- Повторение процесса до тех пор, пока число не равно нулю.
- Вывод символов из стека на экран.
- Восстановление регистров и переменных.
- Завершение функции.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д