Как отобразить 11.1 после div в сборке? - PullRequest
3 голосов
/ 12 февраля 2011

Как отобразить 11.1 после div?Например, 32/5 = 6.4, я могу отображать только 6, так как же отобразить 6.4?

OUT23:

    MOV BL,CNT  ;CNT is the total number of even number
    DIV BL
    MOV DL,AL
    MOV BH,AL
    MOV AH,09H
    LEA DX,MSG23
    INT 21H
    MOV DL,BH   ;print out the average, only the integer part able to display
    MOV AH,02
    ADD DL,30H
    INT 21H

Ответы [ 3 ]

2 голосов
/ 13 февраля 2011

Как уже говорилось, DIV выполняет целочисленное деление. Поскольку это целочисленное деление, результирующие частное и остаток доступны в отдельных парах регистров, точные регистры зависят от размера делителя.

1 байтный делитель

AX - Dividend
AH - Remainder
AL - Quotient

2-байтный делитель

DX:AX - Dividend
DX - Remainder
AX - Quotient

4-байтный делитель

EDX:EAX - Dividend
EDX - Remainder
EAX - Quotient

Поскольку вы используете 1-байтовый делитель 'BL', остаток будет в регистре AH. В вашем случае 32/5 регистр AL будет содержать значение 6, а регистр AH - значение 2, что означает, что есть остаток от 2/5, который 0.4 дает вам ответ 6.4.

Если вы решите, что используете операции FPU, вам нужно загрузить два значения 32 и 5 в стек FPU, используя инструкцию FLD, один раз для каждого значения, после чего вы вызываете FDIV, что вытолкните два значения из стека FPU, разделите их и поместите результат в стек FPU.

Затем результат можно перенести из стека в адрес памяти, используя инструкцию FSTP. Как только вы получите результат, вам нужно будет преобразовать его из двоичного представления с плавающей точкой IEEE в строковое представление, которое может отображаться на экране.

2 голосов
/ 07 сентября 2013

Если вы хотите разделить два целых числа и вывести дробный результат , тогда делайте это, как если бы вы делили вручную в начальной школе.Первоначальное деление даст вам целую часть результата, затем просто несколько раз умножьте оставшуюся часть на 10 и разделите на делитель до нуля или пока вы не достигнете желаемой точности, чтобы получить дробь

. Взять пример32/5 выше

  • Целая часть:

    32/5 = 6 → Print out "6."
    
  • Дробная часть:

    Remainder: 2, multiply it by 10 → 2*10 = 20
    20/5 = 4 → Print out "4"
    Remainder: 0, stop here
    

Более сложные деления могут быть выполнены, как описано выше, просто умножьте остаток на 10 после каждого шага.Если результат бесконечен, остановитесь, когда получите достаточную точность.

Другой пример: 25/11 = 2.27272727 ...

  25/11 = 2 R 3 → 2.
3*10/11 = 2 R 8 → 2
8*10/11 = 7 R 3 → 7
3*10/11 = 2 R 8 → 2
8*10/11 = 7 R 3 → 7
and so on...

Если вы используете значения с плавающей точкой и выполняете плавающуюделение точки с помощью FDIV, тогда есть множество способов преобразовать число с плавающей точкой в ​​строку, но получить правильно округленный результат чрезвычайно сложно, поэтому лучше просто использовать библиотеки, созданные для этой цели.

Однако для очень простая демонстрация , затем снова можно использовать вышеуказанный метод:

  • Разбить целую часть результата и вывести ее, затем .
  • Умножитьцелая часть на 10, целая часть будет следующей дробной цифрой
  • Удалите целую часть и повторяйте вышеуказанный шаг, пока не достигнете желаемой точности

Грубый примерэто, игнорируя ошибки из-за двоичных свойств с плавающей точкой

11.157
Int part: 11    → print 11.
Fractional part:
0.157*10 = 1.57 → print 1
 0.57*10 = 5.7  → print 5
  0.7*10 = 7    → print 7

Более подробную информацию можно найти в Превратить float в строку

2 голосов
/ 12 февраля 2011

DIV - инструкция деления целых чисел. Если вам нужно деление с плавающей запятой, вам нужно посмотреть на FDIV.

...