Guest User

printint

a guest
Jan 10th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. .section .text
  2. .globl _start
  3.  
  4. #------------------------------------------------------------------------------
  5.  
  6. # Imprime un entier positif dans la sortie standard
  7. # input: %eax
  8. # Modified: none
  9. printint:
  10. call save_registers
  11. # Digit counter
  12. movl $0, %ebx
  13. movl $10, %ecx
  14. # Store each digit on stack
  15. while_1:
  16. movl $0, %edx
  17. divl %ecx
  18. pushl %edx
  19. # %eax récupère le quotient
  20. incl %ebx
  21. # Break as soon as %eax = 0
  22. cmpl $0, %eax
  23. je break_while_1
  24. jmp while_1
  25. break_while_1:
  26. # Print each digit
  27. for_1:
  28. # Break as soon as %ebx is null
  29. cmpl $0, %ebx
  30. je break_for_1
  31. popl %eax
  32. call printdigit
  33. decl %ebx
  34. jmp for_1
  35. break_for_1:
  36. call restaure_registers
  37. ret
  38.  
  39.  
  40. # Imprime un chiffre dans la sortie standard
  41. # input: %eax
  42. # Modified: none
  43. printdigit:
  44. call save_registers
  45. # Convert to ASCII code
  46. addl $48, %eax
  47. # Use stack as storage
  48. pushl %eax
  49. # Print digit
  50. movl $4, %eax
  51. movl $1, %ebx
  52. movl %esp, %ecx # storage address
  53. movl $1, %edx # length
  54. int $0x80
  55. # Restaure
  56. addl $4, %esp # remove %eax from stack
  57. call restaure_registers
  58. ret
  59.  
  60. #------------------------------------------------------------------------------
  61. exit:
  62. movl %eax, %ebx # recuperation parametre = code retour
  63. movl $1, %eax # appel a la fonction 1 du noyau
  64. int $0x80 # terminer programme
  65.  
  66. # Save %eax, %ebx, %ecx, %edx, %esi
  67. save_registers:
  68. # Move return address
  69. pushl %eax
  70. pushl %ebx
  71. pushl %ecx
  72. pushl %edx
  73. # Save return address
  74. movl 16(%esp), %eax
  75. # Swap return address with last saved value
  76. movl %esi, 16(%esp)
  77. pushl %eax # Restaure return address
  78. # Restaure %eax
  79. movl 16(%esp), %eax
  80. ret
  81.  
  82. restaure_registers:
  83. # Restaure %esi
  84. movl 20(%esp), %esi
  85. # Move return address
  86. movl (%esp), %eax
  87. movl %eax, 20(%esp)
  88. addl $4, %esp
  89. # Restaure other registers
  90. popl %edx
  91. popl %ecx
  92. popl %ebx
  93. popl %eax
  94. ret
  95.  
  96.  
  97. # Calcule la longueur d'une chaine de caractère
  98. # %esi: input, adresse de la chaine, modified
  99. # %eax: output, length of the string
  100. # Modified: %esi
  101. length:
  102. # Save registers
  103. pushl %ebx
  104. # Calcule length
  105. movl $0, %eax
  106. do_1:
  107. movb (%esi), %bl
  108. cmpb $0, %bl
  109. je break_do_1
  110. incl %eax
  111. incl %esi
  112. jmp do_1
  113. break_do_1:
  114. # Restaure registers
  115. popl %ebx
  116. ret
  117.  
  118. # Write "+" in stdout
  119. # Modified: none
  120. output:
  121. call save_registers
  122. leal debug, %esi
  123. movl %esi, %ecx
  124. call length
  125. movl %eax, %edx
  126. movl $4, %eax
  127. movl $1, %ebx
  128. int $0x80
  129.  
  130. call restaure_registers
  131. ret
  132.  
  133. _start:
  134. movl $45, %eax
  135. call printint
  136. movl $0, %eax
  137. call exit
  138.  
  139. #------------------------------------------------------------------------------
  140. .section .rodata
  141. debug: .string "+"
Advertisement
Add Comment
Please, Sign In to add comment