-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprogram.asm
More file actions
140 lines (111 loc) · 1.95 KB
/
program.asm
File metadata and controls
140 lines (111 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
; constantes
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
True equ 1
False equ 0
segment .data
segment .bss ; variaveis
res RESB 1
section .text
global _start
print: ; subrotina print
PUSH EBP ; guarda o base pointer
MOV EBP, ESP ; estabelece um novo base pointer
MOV EAX, [EBP+8] ; 1 argumento antes do RET e EBP
XOR ESI, ESI
print_dec: ; empilha todos os digitos
MOV EDX, 0
MOV EBX, 0x000A
DIV EBX
ADD EDX, '0'
PUSH EDX
INC ESI ; contador de digitos
CMP EAX, 0
JZ print_next ; quando acabar pula
JMP print_dec
print_next:
CMP ESI, 0
JZ print_exit ; quando acabar de imprimir
DEC ESI
MOV EAX, SYS_WRITE
MOV EBX, STDOUT
POP ECX
MOV [res], ECX
MOV ECX, res
MOV EDX, 1
INT 0x80
JMP print_next
print_exit:
POP EBP
RET
; subrotinas if/while
binop_je:
JE binop_true
JMP binop_false
binop_jg:
JG binop_true
JMP binop_false
binop_jl:
JL binop_true
JMP binop_false
binop_false:
MOV EBX, False
JMP binop_exit
binop_true:
MOV EBX, True
binop_exit:
RET
_start:
PUSH EBP ; guarda o base pointer
MOV EBP, ESP ; estabelece um novo base pointer
; codigo gerado pelo compilador
PUSH DWORD 0
PUSH DWORD 0
PUSH DWORD 0
MOV EBX, 5
MOV [EBP - 8], EBX
MOV EBX, 2
MOV [EBP - 4], EBX
MOV EBX, 1
MOV [EBP - 12], EBX
LOOP_33:
MOV EBX, [EBP - 4]
PUSH EBX
MOV EBX, [EBP - 8]
PUSH EBX
MOV EBX, 1
POP EAX
ADD EAX, EBX
MOV EBX, EAX
POP EAX
CMP EAX, EBX ; comparacao menor que
CALL binop_jl
CMP EBX, False ; verifica se o teste deu falso
JE EXIT_33 ; e sai caso for igual a falso.
MOV EBX, [EBP - 12]
PUSH EBX
MOV EBX, [EBP - 4]
POP EAX
IMUL EBX
MOV EBX, EAX
MOV [EBP - 12], EBX
MOV EBX, [EBP - 4]
PUSH EBX
MOV EBX, 1
POP EAX
ADD EAX, EBX
MOV EBX, EAX
MOV [EBP - 4], EBX
JMP LOOP_33 ; e sai caso for igual a falso.
EXIT_33:
MOV EBX, [EBP - 12]
PUSH EBX ; inicio do print
CALL print ; chamada de funcao
POP EBX ; Desempilhe os argumentos
; interrupcao de saida
POP EBP
MOV EAX, 1
INT 0x80