Guest User

Untitled

a guest
Aug 20th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. How to calculate division reminder in SPARC Assembly?
  2. for i = 1 to num_of_bits do
  3. (HR LR) << 1
  4. if (HR >= 0) then
  5. HR = HR - DIVISOR
  6. else
  7. HR = HR + DIVISOR
  8. endif
  9. if (HR > 0) then LR(lsb) = 1 endif
  10. endfor
  11.  
  12. #include <stdio.h>
  13.  
  14. typedef unsigned char uint8;
  15. typedef unsigned int uint;
  16.  
  17. int u8div(uint8* dividendh, uint8* dividendl, uint8 divisor)
  18. {
  19. int i;
  20.  
  21. if (*dividendh >= divisor)
  22. return 0; // overflow
  23.  
  24. for (i = 0; i < 8; i++)
  25. {
  26. if (*dividendh >= 0x80)
  27. {
  28. *dividendh = (*dividendh << 1) | (*dividendl >> (8 - 1));
  29. *dividendl <<= 1;
  30.  
  31. *dividendh -= divisor;
  32. *dividendl |= 1;
  33. }
  34. else
  35. {
  36. *dividendh = (*dividendh << 1) | (*dividendl >> (8 - 1));
  37. *dividendl <<= 1;
  38.  
  39. if (*dividendh >= divisor)
  40. {
  41. *dividendh -= divisor;
  42. *dividendl |= 1;
  43. }
  44. }
  45. }
  46.  
  47. return 1;
  48. }
  49.  
  50. int u8div2(uint8* dividendh, uint8* dividendl, uint8 divisor)
  51. {
  52. uint dividend = (*dividendh << 8) | *dividendl;
  53.  
  54. if (*dividendh >= divisor)
  55. return 0; // overflow
  56.  
  57. *dividendl = dividend / divisor;
  58. *dividendh = dividend % divisor;
  59.  
  60. return 1;
  61. }
  62.  
  63. int main(void)
  64. {
  65. uint dividendh, dividendl, divisor;
  66.  
  67. for (dividendh = 0; dividendh <= 0xFF; dividendh++)
  68. for (dividendl = 0; dividendl <= 0xFF; dividendl++)
  69. for (divisor = 0; divisor <= 0xFF; divisor++)
  70. {
  71. uint8 divh = dividendh, divl = dividendl, divr = divisor;
  72. uint8 divh2 = dividendh, divl2 = dividendl;
  73.  
  74. printf("0x%04X/0x%02X=", (divh << 8) | divl, divr);
  75.  
  76. if (u8div(&divh, &divl, divr))
  77. printf("0x%02X.0x%02X", divl, divh);
  78. else
  79. printf("ovf");
  80.  
  81. printf(" ");
  82.  
  83. if (u8div2(&divh2, &divl2, divr))
  84. printf("0x%02X.0x%02X", divl2, divh2);
  85. else
  86. printf("ovf");
  87.  
  88. if ((divl != divl2) || (divh != divh2))
  89. printf(" err"); // "err" will be printed if u8div() computes incorrect result
  90.  
  91. printf("n");
  92. }
  93.  
  94. return 0;
  95. }
Add Comment
Please, Sign In to add comment