Деление чисел - Assembler (223561)

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

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

Надо найти результат деления двух целых пятизначных чисел, которые представлены в десятичном формате. Числа ввести с клавиатуры, результат вывести в виде Z = XXX . XXX (целая часть.дробная часть). Написал ввод с клавиатуры и некое подобие вывода на экран, а вот с делением пятизначных не очень понимаю, ведь у нас число может быть до 65535, а если пользователь введет 99999? В общем, помогите, пожалуйста.
Листинг программы
  1. .model small
  2. .stack 16h
  3. .data
  4. msgA db 'Enter A = ', '$ '
  5. msgB db 13,10,'Enter B = ', '$ '
  6. msg label byte ;массив для ввода символов
  7. maxnum db 6 ;длина массива
  8. reallen db ?
  9. numfld db 5 dup(30h)
  10. mult10 dw 0
  11. ascval db 10 dup(30h),13,10,'$' ;массив символов для вывода*
  12. x dw ? ;результат
  13. a dw 0 ;коэффициенты
  14. b dw 0
  15. z dw 0
  16. .code
  17. start: mov ax, @data
  18. mov ds, ax
  19. mov ah,9
  20. lea dx, msgA
  21. int 21H; просим ввести A
  22. mov ah,0AH
  23. lea dx,msg
  24. int 21H
  25. call asbin
  26. mov ax,z
  27. mov a,ax ; вводим A
  28. mov ah,9
  29. lea dx, msgB
  30. int 21H; просим ввести И
  31. mov ah,0AH
  32. lea dx,msg
  33. int 21H
  34. call asbin
  35. mov ax,z
  36. mov b,ax ; вводим B
  37.  
  38. ;здесь должны быть вычисления
  39.  
  40. call outp ; вывод результата на экран
  41. mov ah, 4ch
  42. int 21h
  43. asbin proc ; запись с клавиатуры
  44. mov mult10,0001
  45. mov z,0
  46. mov cx,10
  47. lea si,numfld-1
  48. mov bl,reallen
  49. sub bh,bh
  50. b20:
  51. mov al,[si+bx]
  52. and ax,000fh
  53. mul mult10
  54. add z,ax
  55. mov ax,mult10
  56. mul cx
  57. mov mult10,ax
  58. dec bx
  59. jnz b20
  60. ret
  61. asbin endp
  62. outp proc ; Начало тела процедуры "вывод"
  63. mov cx,10 ; система счисления
  64. lea si, ascval+9 ; Установка указателя на конец массива ascval
  65. mov ax, x ; Результат х занести в ax
  66. c20: cmp ax,10 ; Сравнить результат с числом 10
  67. jb c30 ; Если меньше то преобразовывать не надо
  68. xor dx,dx ; Очистка регистра dx для команды деления
  69. div cx ; Делим на 10
  70. or dl, 30h ; Преобразование остатка к ASCII коду
  71. mov [si], dl ; Занесение остатка от деления в массив ascval
  72. dec si ; Перемещение указателя массива на 1 байт влево
  73. jmp c20 ; Переход на начало для преобразования след. цифры
  74. c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран
  75. mov [si], al ; дисплея командами (см. ниже)
  76. lea dx, ascval ; Загрузка адреса массива
  77. mov ah, 9 ; Вызов 9-ой функции MS-DOS
  78. int 21h
  79. ret ; Возврат в головную программу из п/программы
  80. outp endp ; Конец процедуры
  81. end start
Вот уже даже с делением, но больше 32000 он не принимает
Листинг программы
  1. .model small
  2. .stack 16h
  3. .data
  4. msgA db 'Enter A = ', '$ '
  5. msgB db 13,10,'Enter B = ', '$ '
  6. msg5 db 13,10,'Result X = ', '$ '
  7. msg label byte ;массив для ввода символов
  8. maxnum db 6 ;длина массива
  9. reallen db ?
  10. numfld db 5 dup(30h)
  11. mult10 dw 0
  12. ascval db 10 dup(30h),13,10,'$' ;массив символов для вывода*
  13. x dw ? ;результат
  14. a dw 0 ;коэффициенты
  15. b dw 0
  16. z dw 0
  17. .code
  18. start: mov ax, @data
  19. mov ds, ax
  20. mov ah,9
  21. lea dx, msgA
  22. int 21H;
  23. mov ah,0AH
  24. lea dx,msg
  25. int 21H
  26. call asbin
  27. mov ax,z
  28. mov a,ax
  29. mov ah,9
  30. lea dx, msgB
  31. int 21H;
  32. mov ah,0AH
  33. lea dx,msg
  34. int 21H
  35. call asbin
  36. mov ax,z
  37. mov b,ax
  38.  
  39. mov ah,9
  40. lea dx, msg5
  41. int 21H;
  42.  
  43. mov bx, dx
  44. mov cx, ax
  45. mov ax, a
  46. mov dx,0
  47. idiv b
  48. mov x, ax
  49. call outp ; вывод результата на экран
  50. mov ah, 4ch
  51. int 21h
  52. asbin proc
  53. mov mult10,0001
  54. mov z,0
  55. mov cx,10
  56. lea si,numfld-1
  57. mov bl,reallen
  58. sub bh,bh
  59. b20:
  60. mov al,[si+bx]
  61. and ax,000fh
  62. mul mult10
  63. add z,ax
  64. mov ax,mult10
  65. mul cx
  66. mov mult10,ax
  67. dec bx
  68. jnz b20
  69. ret
  70. asbin endp
  71. outp proc ; Начало тела процедуры "вывод"
  72. mov cx,10 ; система счисления
  73. lea si, ascval+9 ; Установка указателя на конец массива ascval
  74. mov ax, x ; Результат х занести в ax
  75. c20: cmp ax,10 ; Сравнить результат с числом 10
  76. jb c30 ; Если меньше то преобразовывать не надо
  77. xor dx,dx ; Очистка регистра dx для команды деления
  78. div cx ; Делим на 10
  79. or dl, 30h ; Преобразование остатка к ASCII коду
  80. mov [si], dl ; Занесение остатка от деления в массив ascval
  81. dec si ; Перемещение указателя массива на 1 байт влево
  82. jmp c20 ; Переход на начало для преобразования след. цифры
  83. c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран
  84. mov [si], al ; дисплея командами (см. ниже)
  85. lea dx, ascval ; Загрузка адреса массива
  86. mov ah, 9 ; Вызов 9-ой функции MS-DOS
  87. int 21h
  88. ret ; Возврат в головную программу из п/программы
  89. outp endp ; Конец процедуры
  90. end start
Теперь до 65000
Листинг программы
  1. .model small
  2. .stack 16h
  3. .data
  4. msgA db 'Enter A = ', '$ '
  5. msgB db 13,10,'Enter B = ', '$ '
  6. msg5 db 13,10,'Result X = ', '$ '
  7. msg label byte ;массив для ввода символов
  8. maxnum db 6 ;длина массива
  9. reallen db ?
  10. numfld db 5 dup(30h)
  11. mult10 dw 0
  12. ascval db 10 dup(30h),13,10,'$' ;массив символов для вывода*
  13. x dw ? ;результат
  14. a dw 0 ;коэффициенты
  15. b dw 0
  16. c dw 1000
  17. z dw 0
  18. u dw 0
  19. .code
  20. start: mov ax, @data
  21. mov ds, ax
  22. mov ah,9
  23. lea dx, msgA
  24. int 21H;
  25. mov ah,0AH
  26. lea dx,msg
  27. int 21H
  28. call asbin
  29. mov ax,z
  30. mov a,ax
  31. mov ah,9
  32. lea dx, msgB
  33. int 21H;
  34. mov ah,0AH
  35. lea dx,msg
  36. int 21H
  37. call asbin
  38. mov ax,z
  39. mov b,ax
  40.  
  41. mov ah,9
  42. lea dx, msg5
  43. int 21H;
  44.  
  45. mov bx, dx
  46. mov cx, ax
  47. xor dx,dx
  48. mov ax, a
  49. idiv b
  50. mov x, ax
  51. ;mov ax,dx
  52. ;imul c
  53. ;idiv x
  54. ;mov u,ax
  55. call outp ; вывод результата на экран
  56. mov ah, 4ch
  57. int 21h
  58. asbin proc
  59. mov mult10,0001
  60. mov z,0
  61. mov cx,10
  62. lea si,numfld-1
  63. mov bl,reallen
  64. sub bh,bh
  65. b20:
  66. mov al,[si+bx]
  67. and ax,000fh
  68. mul mult10
  69. add z,ax
  70. mov ax,mult10
  71. mul cx
  72. mov mult10,ax
  73. dec bx
  74. jnz b20
  75. ret
  76. asbin endp
  77. outp proc ; Начало тела процедуры "вывод"
  78. mov cx,10 ; система счисления
  79. lea si, ascval+9 ; Установка указателя на конец массива ascval
  80. mov ax, x ; Результат х занести в ax
  81. c20: cmp ax,10 ; Сравнить результат с числом 10
  82. jb c30 ; Если меньше то преобразовывать не надо
  83. xor dx,dx ; Очистка регистра dx для команды деления
  84. div cx ; Делим на 10
  85. or dl, 30h ; Преобразование остатка к ASCII коду
  86. mov [si], dl ; Занесение остатка от деления в массив ascval
  87. dec si ; Перемещение указателя массива на 1 байт влево
  88. jmp c20 ; Переход на начало для преобразования след. цифры
  89. c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран
  90. mov [si], al ; дисплея командами (см. ниже)
  91. lea dx, ascval ; Загрузка адреса массива
  92. mov ah, 9 ; Вызов 9-ой функции MS-DOS
  93. int 21h
  94. ret ; Возврат в головную программу из п/программы
  95. outp endp ; Конец процедуры
  96. end start

Решение задачи: «Деление чисел»

textual
Листинг программы
  1. asbin proc ; Процедура ввода с клавиатуры
  2.        mov mult10,0001
  3.        mov z,0
  4.        mov cx,10
  5.        lea si,numfld-1
  6.        mov bl,reallen
  7.        sub bh,bh
  8. b20:
  9.        mov al,[si+bx]
  10.        and ax,000fh    
  11.        mul mult10
  12.        cmp ax,'-'   ;если минус, то
  13.        jne b30
  14.        mov dh,1     ;устанавливаем признак минуса
  15.        sub ax,'-'
  16.        jmp b20
  17. b30:   add z,ax
  18.        mov ax,mult10
  19.        mul cx
  20.        mov mult10,ax
  21.        dec bx
  22.        jnz b20
  23.        test dh,dh   ;если установлен признак отрицательного числа
  24.        jne b40
  25.        neg z        ;то меняем знак
  26. b40:   ret
  27. asbin  endp

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

  1. Процедура ввода с клавиатуры.
  2. Переменная mult10 содержит значение 10.
  3. Переменная z содержит результат деления.
  4. Переменная cx содержит количество разрядов числа.
  5. Переменная si содержит адрес поля ввода числа.
  6. Переменная bl содержит значение реального числа.
  7. Переменная bh содержит знак реального числа.
  8. Переменная ax содержит результат операции.
  9. Переменная dh содержит признак отрицательного числа.
  10. Переменная numfld содержит адрес поля ввода числа.
  11. При выходе из процедуры ввода, значение переменной z обновляется.
  12. Если введенное число отрицательное, то устанавливается признак отрицательного числа.
  13. Результат деления сохраняется в переменной z.
  14. Если введенное число не является числом, то процедура продолжается до тех пор, пока не будет введено число.
  15. Результат умножения числа на 10 сохраняется в переменной ax.
  16. Переменная mult10 обновляется значением ax.
  17. Уменьшается значение переменной bx на единицу.
  18. Если значение переменной bx больше нуля, то процедура продолжается до тех пор, пока не будет введено число.
  19. Если введенное число является отрицательным, то результат деления изменяется на противоположный.
  20. Конец процедуры ввода с клавиатуры.

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


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

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

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

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

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

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