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