Azatique

Project Euler. Problem 1. x86 assembly language

Jan 6th, 2012
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.                   ;Flat assembler
  2. org 100h
  3. Begin:
  4.  
  5. call FPU_init
  6.  
  7. fild [Number]      ;сложение
  8. fidiv [Number2]    ;деление
  9. frndint            ;округление (в сторону нуля-
  10. call Ar_prog       ;т. к. регистр RC установлен в 11)
  11. fimul [Number2]
  12.  
  13. fild [Number]
  14. fisub [Number10]
  15. fidiv [Number3]
  16. frndint
  17. call Ar_prog
  18. fimul [Number3]
  19.  
  20. fild [Number]
  21. fidiv [Number4]
  22. frndint
  23. call Ar_prog
  24. fimul [Number4]
  25.  
  26. fincstp
  27. fincstp
  28. fadd st0, st2
  29. fsub st0, st6
  30.  
  31. fist [Number9]
  32. call FPU_init
  33. fild [Number5]
  34. xor cx,cx
  35.  
  36. Out1:
  37. fild [Number9]     ;помещаем значение, полученное после вычитания
  38. inc cx             ;увеличиваем cx
  39. fcom st1           ;сравниваем значение с 10
  40. fstsw [Number14]
  41. mov ax, [Number14]
  42. sahf
  43. jb Out2            ;если меньше 10, перейти к Out2
  44. fdiv st0,st1       ;делим на 10
  45. frndint            ;округляем
  46. fistp [Number12]   ;результат - в Number12
  47. fild [Number9]     ;снова загружаем
  48. fprem              ;остаток от деления на 10
  49. fiadd [Number15]   ;прибавляем 30h
  50. fistp [Number13]   ;выгружаем в память
  51. push [Number13]    ;толкаем в стек
  52. fild [Number12]    ;результат деления - в Number9
  53. fistp [Number9]
  54. jmp Out1           ;цикл
  55.  
  56. Out2:
  57. mov di, String     ;записываем смещение строки
  58. fiadd [Number15]
  59. fist [Number13]
  60. push [Number13]
  61.  
  62.  
  63. Out3:
  64. pop dx             ;выталкиваем коды цифр, начиная с конца
  65. mov [di],dl        ;записываем их в строку
  66. inc di             ;увеличиваем смещение
  67. loop Out3          ;повторяем это
  68.  
  69. mov [di], byte 24h ;записываем код конца строки для вывода
  70. mov dx, String     ;записываем смещение строки в
  71. mov ah, 09h        ;вызываем прерывание
  72. int 21h
  73.  
  74. int 20h
  75.  
  76. Ar_prog:
  77. fist [Number9]
  78. fimul [Number9]
  79. fild [Number9]
  80. fadd st0,st1
  81. fidiv [Number8]
  82. frndint
  83. ret
  84.  
  85. FPU_init:
  86. finit              ;инициализация сопроцессора
  87. fstcw [Number6]    ;получение контрольного слова
  88. mov ax, [Number7]  ;установка десятого и одиннадцатого
  89. or [Number6], ax   ;битов слова в 11 (можно две команды bts:
  90.                    ;bts [Number6],10d
  91.                    ;bts [Number6],11d  )
  92. fldcw [Number6]    ;загрузка контрольного слова в FPU
  93. ret
  94.  
  95. Number dw 1000d
  96. Number2 dd 3d
  97. Number3 dw 5d
  98. Number4 dw 15d
  99. Number5 dw 10d
  100. Number6 dw ?
  101. Number7 dw 0c00h
  102. Number8 dw 2d
  103. Number9 dd ?
  104. Number10 dw 1d
  105. Number11 db 30h
  106. Number12 dd ?
  107. Number13 dw ?
  108. Number14 dw ?
  109. Number15 dd 0030h
  110. String db ?
Advertisement
Add Comment
Please, Sign In to add comment