Как вывести остаток от деления - Assembler

Узнай цену своей работы

Формулировка задачи:

Результат деления от -55/4=-13.75 Вывожу -13. А где храниться остаток 75 и как его вывести.Ума не приложу.Ох если бы эксперт взглянул и ругнулся.
Листинг программы
  1. ;z=(4*c-d/2+23)/(a*a-1)
  2. .MODEL small
  3. .Stack 100h
  4. Datas segment
  5. a dw 2
  6. c dw 2
  7. d dw 2
  8. z dw ?
  9. h dw ?
  10. znam dw ?
  11. mess db 'Error! Division by zero.$'
  12. Datas ends
  13. Codes segment
  14. Assume cs:Codes, ds:Datas
  15. First: mov ax, Datas
  16. mov ds, ax
  17. ;a*a
  18. mov ax, a
  19. cwd
  20. imul a
  21. ;if a == 1 => divide by zero => error
  22. cmp ax, 1
  23. je @err
  24. ;(a*a)-1
  25. mov h, 1
  26. sbb ax, h
  27. mov znam, ax
  28. ;4*c
  29. mov h, 4
  30. mov ax, c
  31. imul h
  32. mov z, ax
  33. ;d/2
  34. mov h, 2
  35. mov ax, d
  36. cwd
  37. idiv h
  38. ;(4*c)-(d/2)
  39. sbb z, ax
  40. ;(4*c-d/2)+23
  41. mov ax, z
  42. mov h, 23
  43. adc ax, h
  44. ;(4*c-d/2+23) / (znam)
  45. cwd
  46. idiv znam
  47. mov z, ax
  48. xor ax, ax
  49. mov ax, z
  50. push ax
  51. cmp ax, 0
  52. jns @plus ;если знак плюс (знаковый (старший) бит результата равен 0)
  53. mov dl, '-'
  54. mov ah, 02h ;вивод
  55. int 21h
  56. pop ax
  57. neg ax
  58. @plus: xor cx, cx
  59. mov bx, 10
  60. @dvsn: xor dx, dx
  61. div bx
  62. push dx
  63. inc cx
  64. test ax, ax
  65. jnz short @dvsn ;если нет нуля
  66. mov ah, 02h
  67. @vivod: pop dx
  68. add dl, 30h ; +30
  69. int 21h
  70. loop @vivod
  71. jmp @end
  72. @err: mov dx, offset mess
  73. mov ah, 09h
  74. int 21h
  75. @end: mov ax, 4c00h
  76. int 21h
  77. Codes ends
  78. end First
Ой не тот код напечатал,вот правильный,как вывести остаток 75
Листинг программы
  1. ;Z = (-53/a + d - 4*a)/(1+a*b)
  2. ;a=1 d=2 b=3
  3. ;X=-53/a=-53
  4. ;Y=4*a=4*1=4
  5. ;Z=x+d=-53+2=-51
  6. ;S=z-y=-51-4=-55/////
  7. ;X=a*b=1*3=3
  8. ;Y=x+1=3+1=4///
  9. ;Z=s/y=-55/4=-18
  10.  
  11. .MODEL small
  12. .Stack 100h
  13. Datas segment
  14. a dw 1
  15. b dw 3
  16. d dw 2
  17. x dw ?
  18. y dw ?
  19. z dw ?
  20. s dw ?
  21. mess db 'Error! Division by zero.$'
  22. mes db '.$'
  23. Datas ends
  24. Codes segment
  25. Assume cs:Codes, ds:Datas
  26. First: mov ax, Datas
  27. mov ds, ax
  28. xor ax, ax
  29. cmp a, 0
  30. je @err
  31. ;X=a*b=1*3=3
  32. mov ax,a
  33. imul b
  34. add ax,1
  35. mov y,ax
  36. ;X=-53/a=-53/1=-53
  37. mov ax, -53
  38. cwd
  39. idiv a
  40. mov x, ax
  41. mov ax,-4
  42. imul a
  43. add ax,d
  44. add ax,x
  45. cwd
  46. idiv y
  47. mov z,ax
  48.  
  49. @otv: xor ax, ax
  50. mov ax, z
  51. push ax
  52. cmp ax, 0
  53. jns @plus ;åñëè Г§Г*Г*ГЄ ïëþñ (Г§Г*Г*êîâûé (Г±ГІГ*ðøèé) ГЎГЁГІ ðåçóëüòГ*ГІГ* Г°Г*ГўГҐГ* 0)
  54. mov dl, '-'
  55. mov ah, 02h
  56. int 21h
  57. pop ax
  58. neg ax
  59. @plus: xor cx, cx
  60. mov bx, 10
  61. @dvsn: xor dx, dx
  62. div bx
  63. push dx
  64. inc cx
  65. test ax, ax
  66. jnz short @dvsn ;åñëè Г*ГҐГІ Г*óëÿ
  67. mov ah, 02h
  68. @vivod: pop dx
  69. add dl, 30h ; +30
  70. int 21h
  71. loop @vivod
  72. jmp @tochka
  73. @err: mov dx, offset mess
  74. mov ah, 09h
  75. int 21h
  76. @tochka: mov dx, offset mes
  77. mov ah, 09h
  78. int 21h
  79. @end: mov ax, 4c00h
  80. int 21h
  81. Codes ends
  82. end First

Решение задачи: «Как вывести остаток от деления»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small, Pascal
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf            db      0Dh, 0Ah, '$'
  9.  
  10.         A               dw      1234
  11.         B               dw      345
  12.  
  13.         Accuracy        dw      4       ;количество десятичных знаков после запятой
  14.  
  15. .code
  16.  
  17. main    proc
  18.         mov     ax,     @data
  19.         mov     ds,     ax
  20.  
  21.         ;деление A на B и получение целой части частного
  22.         mov     ax,     [A]     ;dx:ax = A
  23.         mov     dx,     0
  24.         mov     bx,     [B]     ;bx = B
  25.  
  26.         idiv    bx              ;ax = A / B, dx = A % B
  27.  
  28.         call    Show_AX
  29.  
  30.         ;вывод запятой
  31.         push    dx
  32.         mov     ah,     02h
  33.         mov     dl,     ','
  34.         int     21h
  35.         pop     dx
  36.         ;вывод нескольких десятичных знаков десятичной дроби
  37.         mov     si,     10      ;основание счисления
  38.         mov     cx,     [Accuracy]      ;количество знаков после запятой
  39. @@For:
  40.         mov     ax,     dx
  41.         mul     si
  42.         div     bx
  43.         call    Show_AX
  44.         loop    @@For
  45.  
  46.         mov     ah,     09h
  47.         lea     dx,     [CrLf]
  48.         int     21h
  49.  
  50.         mov     ax,     4C00h
  51.         int     21h
  52. main    endp
  53.  
  54. ; выводит беззнаковое 16-разрядное число из регистра AX на экран
  55. ; входные данные:
  56. ; ax - число для отображения
  57. Show_AX proc
  58.         push    ax
  59.         push    bx
  60.         push    cx
  61.         push    dx
  62.         push    di
  63.  
  64.         mov     cx,     10
  65.         xor     di,     di      ; di - кол. цифр в числе
  66.  
  67. @@Conv:
  68.         xor     dx,     dx
  69.         div     cx              ; dl = num mod 10
  70.         add     dl,     '0'     ; перевод в символьный формат
  71.         inc     di
  72.         push    dx              ; складываем в стек
  73.         or      ax,     ax
  74.         jnz     @@Conv
  75.         ; выводим из стека на экран
  76. @@Show:
  77.         pop     dx              ; dl = очередной выводимый символ
  78.         mov     ah,     2       ; ah - функция вывода символа на экран
  79.         int     21h
  80.         dec     di              ; повторяем пока di<>0
  81.         jnz     @@Show
  82.  
  83.         pop     di
  84.         pop     dx
  85.         pop     cx
  86.         pop     bx
  87.         pop     ax
  88.         ret
  89. Show_AX endp
  90.  
  91. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут