Как вывести остаток от деления - 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

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

  1. Объявление локальных переменных.
  2. Объявление модели small и Pascal.
  3. Выделение стека размером 100h.
  4. Объявление данных:
    • CrLf = 0Dh, 0Ah, '$' - последовательность символов для перевода строки.
    • A = 1234 - переменная типа dw (2 байта) со значением 1234.
    • B = 345 - переменная типа dw (2 байта) со значением 345.
    • Accuracy = 4 - переменная типа dw (2 байта) со значением 4, указывающая количество десятичных знаков после запятой.
  5. Объявление кода:
    • Подготовка регистров для работы с данными.
    • Деление A на B и получение целой части частного.
    • Вызов функции Show_AX для вывода значения ax на экран.
    • Вывод запятой на экран.
    • Вывод нескольких десятичных знаков десятичной дроби.
    • Вывод перевода строки на экран.
    • Завершение программы.
  6. Описание функции Show_AX:
    • Подготовка регистров и переменных.
    • Деление числа на основание счисления (10).
    • Преобразование остатка от деления в символ и добавление его в стек.
    • Повторение процесса до тех пор, пока число не равно нулю.
    • Вывод символов из стека на экран.
    • Восстановление регистров и переменных.
    • Завершение функции.
  7. Завершение программы.

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


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

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

12   голосов , оценка 4.167 из 5