Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; переводит число в двоично-десятичном коде в строку
  2. bcd_to_string macro     str_num, number
  3. local   m1, exit ;ten,num,num2,go,m2,m3,m4,num_one
  4.  
  5. ;jmp     go
  6. ;
  7. ;go:
  8.         SaveReg <cx, ax ,si, bx>
  9.         mov     cx, 10
  10.         mov     bx, str_num
  11.         add     bx, 20 ; смещаемся на 20 символов от начала строки
  12.         mov     byte ptr[bx], '$' ; ставим в конец доллар
  13.         dec     bx
  14.         lea     si, number ; берем адрес числа
  15. m1:
  16.         dec     bx
  17.         mov     al, byte ptr[si] ; в al байт
  18.         inc     si ; переходим на следующий байт
  19.         mov     ah,al
  20.         shr     ah,4 ; в ah старшая часть байта
  21.         add     ah, 30h
  22.         mov     byte ptr [bx], ah ; выводим старшую часть
  23.         inc     bx
  24.  
  25.         mov     ah,al
  26.         shl     ah,4 ; в ah младшие 4 бита байта, но в 4 старших битах
  27.         shr     ah,4 ; поэтому ставим на место
  28.         add     ah, 30h
  29.         mov     byte ptr [bx], ah ; выводим младшую часть
  30.         dec     bx
  31.         dec     bx
  32.  
  33.         loop    m1 ; и так ровно 10 байтов (потому что 10 байт в FPU разрядность)
  34. exit:
  35. ;       dec     bx
  36.         mov     byte ptr [bx], '$'
  37.         LoadReg <bx, si, ax, cx>
  38. endm            
  39.  
  40. float_to_string macro   number, str_number
  41. local   flag,ten,go,exit,m1,m2,m3,m4,m5,c1,c2,c3,max,min, ten2
  42. jmp     go
  43.  
  44. ten     dq      100000000.0 ; 10^8
  45. ten2    dq      10.0
  46. flag    db      0
  47. max     dq      1.0
  48. min     dq      0.1
  49.  
  50. go:
  51.         SaveReg <bx,cx>
  52.  
  53.         ; хитрая проверка на знак: сравниваем байт, в котором знак с 10000000b. Делаем побитовое "и" этого байта и 10000000b. Если 0, значит в знаковом бите был 0.
  54.         lea     si, number
  55.         add     si, 9
  56.         mov     al, byte ptr[si]
  57.         test    al, 80h
  58.         je      m1 ; так вот если был 0, то переходим
  59.         mov     flag, 1 ; иначе ставим флаг
  60. m1:
  61.  
  62.         finit
  63.  
  64.         fld     ten
  65.         fld     number
  66.         fmul
  67.         fbstp   number
  68.        
  69.         lea     bx, str_number
  70.         lea     si, str_number
  71.         bcd_to_string   bx, number
  72.  
  73.         mov     cx, 20
  74.         cmp     flag, 0
  75.         je      m2
  76.         mov     byte ptr[si], '-'
  77.         inc     bx
  78.         inc     si
  79.         dec     cx      
  80. m2:
  81.         cmp     byte ptr[bx],'0'
  82.         jne     m4
  83.         cmp     cx,9
  84.         je      m4
  85.         inc     bx
  86.         loop    m2
  87. m4:
  88.         cmp     cx, 8
  89.         jne     m5
  90.         mov     byte ptr[si], '.'
  91.         inc     si
  92.         dec     cx
  93.         jmp     m4
  94. m5:
  95.         mov     al, byte ptr[bx]
  96.         mov     byte ptr[si], al
  97.         inc     bx
  98.         inc     si
  99.         loop    m4
  100.        
  101.         mov     byte ptr [si], 10
  102.         inc     si
  103.         mov     byte ptr [si], 13
  104.         inc     si
  105.         mov     byte ptr [si], '$'
  106.  
  107. exit:
  108.        
  109.         LoadReg <cx,bx>
  110. endm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement