-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscanf e printf.asm
More file actions
70 lines (58 loc) · 2.11 KB
/
scanf e printf.asm
File metadata and controls
70 lines (58 loc) · 2.11 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
%include "io.inc"
extern printf
extern scanf
section .data
fms db "%lu", 0
;fms db "%s",0 ----utilizado em Strings
;fms db "%c",0 ---- Utilizado para pegar caracter por caracter juntas exemplo rafa
;string db " ",0
string db " espaço ",0dh,0ah,0
section .bss
num1 resd 1
array resd 1
section .text
global CMAIN
CMAIN:
mov ebp, esp; for correct debugging
; ESP---Ponteiro de Topo de Pilha ; EBP----Ponteiro de Base de Pilha
;----------------- vai pegar o valor inicial que é refente ao tamanho do vetor
push num1
push fms
call scanf
mov eax,[num1]; aqui vai passar o valor para o registrador eax
;--------------------
mov [array],eax; aqui vai fazer com que o array tenha o tamanho de eax
add esp,8
mov esi,0 ;------faz o incremento para acessar o array
mov ecx,eax; colocar o tamanho do registrador de loop
;---------------- Vai pegar os valores para o array e o incrementar
@SCANF:
push num1
push fms
mov ebx,ecx; manobra para evitar a perda do valor de ecx que é alterado quando faz o call scanf
call scanf
mov ecx,ebx; manobra para devolver o tamanho em ecx e não fazer o loop morrer
mov eax,[num1]; passa o valor para o registrador eax, pois não pode fazer movimentaçao de memoria com memoria.
mov [array+esi*4],eax
inc esi; incremento para acesso à memoria
loop @SCANF
mov ecx,esi; como ele foi incrementado tem o tamanho do vetor. Então fazendo a passagem para registrador de loop
mov esi,0; para utilizar novamente como incrementador
;------------------------ para iniciar amostragem dos valores do array
@PRINTF:
push DWORD[array+esi*4]; tem que colocar o tamanho do seu array,pois o montador não sabe. Nesse caso é um DWORD
inc esi
push DWORD fms
mov ebx,ecx; manobra de correçao de erro de loop
call printf
;-----Puxando a string do local
push string
call printf; fazendo a chamada
;-------
mov ecx,ebx; manobra de correcao de erro de loop
add esp,8
mov esp,ebp
loop @PRINTF
;write your code here
xor eax, eax
ret