FreakSkipper

bin_ia32

Nov 24th, 2020 (edited)
722
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; --------------------
  2. ; Original - translation to x86 as comments
  3. ; --------------------
  4. SECTION TEXT
  5. ; section .text
  6.     INPUT OLD_DATA
  7.     ; push OLD_DATA
  8.     ; call LerInteiro
  9.     LOAD OLD_DATA               ; 6
  10.     ; mov ax, word [OLD_DATA]
  11.  
  12. L1: DIV DOIS                    ; 3 = OLD_DATA / 2
  13. ; L1: cdq
  14.     ; mov ebx, dword [DOIS]
  15.     ; idiv bx
  16.     STORE  NEW_DATA             ; new_data = 3
  17.     ; mov dword [NEW_DATA], eax
  18.     MULT DOIS                   ; 6 = 3 * 2
  19.     ; cdq
  20.     ; mov ebx, dword [DOIS]
  21.     ; imul ebx
  22.     ; jo Overflow
  23.     STORE TMP_DATA              ; TMP_DATA = acc (6)
  24.     ; mov dword [TMP_DATA], eax
  25.     LOAD OLD_DATA               ; acc = OLD_DATA (6)
  26.     ; mov eax, dword [OLD_DATA]
  27.     SUB TMP_DATA                 ; OLD_DATA - TMP_DATA (0)
  28.     ; sub eax, dword [TMP_DATA]
  29.     STORE TMP_DATA              ; TMP_DATA = acc (0)
  30.     ; mov dword [TMP_DATA], eax
  31.     OUTPUT TMP_DATA             ; "0"
  32.     ; push TMP_DATA
  33.     ; call EscreverInteiro
  34.     COPY NEW_DATA, OLD_DATA     ; OLD_DATA = NEW_DATA (3)
  35.     ; mov ebx, dword [NEW_DATA]
  36.     ; mov dword [OLD_DATA], ebx
  37.     LOAD OLD_DATA               ; acc = 3
  38.     ; mov eax, dword [OLD_DATA]
  39.     JMPP L1                     ; if acc > 0
  40.     ; cmp eax, 0
  41.     ; jg L1
  42.     STOP
  43.     ; mov eax, 1
  44.     ; mov ebx, 0
  45.     ; int 80h
  46.  
  47. SECTION DATA
  48. ; section .data
  49.     DOIS: CONST 2      
  50.     ; DOIS dd 2
  51. ; section .bss
  52.     OLD_DATA: SPACE  
  53.     ; OLD_DATA resd 1
  54.     NEW_DATA: SPACE
  55.     ; NEW_DATA resd 1
  56.     TMP_DATA: SPACE
  57.     ; TMP_DATA resd 1
  58.  
  59. ; each address is double word length
  60.  
  61. ; mul: eax*<multiplier> = edx:eax
  62. ; div: eax/<divisor> = quotient -> eax | remainder -> edx
  63.  
  64. ; --------------------
  65. ; IA32 translation
  66. ; --------------------
  67. section .data
  68.     DOIS dd 2
  69.  
  70. section .bss
  71.     OLD_DATA resd 1
  72.     NEW_DATA resd 1
  73.     TMP_DATA resd 1
  74.  
  75. section .text
  76. _start:
  77.     push OLD_DATA
  78.     call LerInteiro
  79.     mov eax, dword [OLD_DATA]
  80.  
  81. L1: cdq
  82.     mov ebx, dword [DOIS]
  83.     idiv ebx
  84.     mov dword [NEW_DATA], eax
  85.     cdq
  86.     mov ebx, dword [DOIS]
  87.     imul ebx
  88.     jo Overflow
  89.     mov dword [TMP_DATA], eax
  90.     mov eax, dword [OLD_DATA]
  91.     sub eax, dword [TMP_DATA]
  92.     mov dword [TMP_DATA], eax
  93.     push TMP_DATA
  94.     call EscreverInteiro
  95.     mov ebx, dword [NEW_DATA]
  96.     mov dword [OLD_DATA], ebx
  97.     mov eax, dword [OLD_DATA]
  98.     cmp eax, 0
  99.     jg L1
  100.    
  101.     mov eax, 1
  102.     mov ebx, 0
  103.     int 80h
RAW Paste Data