.model small .stack 100h DIGITS_AFTER_POINT = 5 .data buf db 5 dup (0) result db 20 dup (0) digits db '.',DIGITS_AFTER_POINT dup (0) .code Decimals proc near ;перевод остатка от деления в дробную часть ;на входе: ; ax - остаток ; bx - делитель ; push di push si ;обнуление выходного массива символов lea di,digits inc di push ax mov al,'0' mov cx,DIGITS_AFTER_POINT rep stosb pop ax ;вычисление дробной части lea di,digits inc di mov si,10 mov cx,DIGITS_AFTER_POINT @@1_1: mul si div bx add al,'0' stosb mov ax,dx or ax,ax loopnz @@1_1 pop si pop di ret Decimals endp ; Divide proc near ;знаковое деление с занесением результата в строку ;на входе: ; ax - делимое ; bx - делитель ; push di push si lea di,result cld cwd idiv bx test ax,8000h jz @@2_1 ;Результат отрицательный - записываем '-' в строку и переводим его в положительный push ax mov al,'-' stosb pop ax neg ax neg dx @@2_1: push dx push bx ; push di ;Перевод целой части результата в строку lea di,buf xor cx,cx mov bx,10 @@2_2: xor dx,dx div bx push ax mov ax,dx add al,'0' stosb inc cx pop ax or ax,ax jnz @@2_2 mov si,di dec si pop di @@2_3: mov al,[si] dec si stosb loop @@2_3 ; pop bx pop ax ;получение дробной части результата call Decimals ;дописывание дробной части в результирующую строку lea si,digits mov cx,DIGITS_AFTER_POINT+1 rep movsb mov al,0Dh stosb mov al,0Ah stosb mov al,'$' stosb ; pop si pop di retn Divide endp START: mov ax,@data mov ds,ax mov es,ax mov ax,-12345 ;делимое mov bx,33 ;делитель call Divide lea dx,result mov ah,9 int 21h mov ax,4C00h int 21h end START |