-
Notifications
You must be signed in to change notification settings - Fork 0
/
args.asm
114 lines (97 loc) · 3.58 KB
/
args.asm
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
MAXARGS equ 5 ; 1 = program path 2 = 1st arg 3 = 2nd arg etc...
sys_exit equ 1 ; Llamadas de sistema
sys_read equ 3
sys_write equ 4
stdin equ 0
stdout equ 1
stderr equ 3
SECTION .data
;szErrMsg db "Too many arguments. The max number of args is 4", 10
;ERRLEN equ $-szErrMsg ;Bloque de codigo si quiero limitar argumentos
szLineFeed dw 10 ;un \n
noArgus: dw 'No hay nada para buscar! Usage: exe -e | -f | -i',10;Mensaje a mostrar si no hay args
noArgusLong: equ $-noArgus ;longitud
SECTION .text ;Main del programa
global _start
_start:
nop
push ebp
mov ebp, esp
cmp dword [ebp + 4], 1
je NoArgs ; no args entered
; uncomment the following 2 lines to limit args entered
; and set MAXARGS to Total args wanted + 1
; cmp dword [ebp + 4], MAXARGS ; check total args entered
; ja TooManyArgs ; if total is greater than MAXARGS, show error and quit
mov ebx, 3
DoNextArg:
mov edi, dword [ebp + 4 * ebx]
test edi, edi
jz Exit ;Si es == 0
call GetStrlen
push edx ; Longitud del string
mov ecx, dword [ebp + 4 * ebx]
call DisplayNorm ; Mostrar texto de manera normal
pop edi ; mover longitud al EDI
mov esi, dword [ebp + 4 * ebx]
inc ebx ; Se aumenta la posición del arreglo de argumentos
jmp DoNextArg
NoArgs:
; No args entered,
; start program without args here
mov eax,sys_write ; call system 'write' id 4
mov ebx,stdout ; descriptor de archivo 1 = pantalla
mov ecx,noArgus ; guardo la cadena en un registro ecx
mov edx,noArgusLong ; guardo la cadena en un registro edx
int 80h ; interrupcion para invocar al kernel
jmp Exit ; Salida del programa
DisplayNorm:
push ebx ;Esto me imprime el argumento que ingreso
mov eax, sys_write
mov ebx, stdout
int 80H
mov ecx, szLineFeed ;Esto imprime \n
mov edx, 1
mov eax, sys_write
mov ebx, stdout
int 80H
pop ebx
ret
; StrsNotEqual:
; mov eax,sys_write ; call system 'write' id 4
; mov ebx,stdout ; descriptor de archivo 1 = pantalla
; mov ecx,mensaje ; guardo la cadena en un registro ecx
; mov edx,mensajel ; guardo longitud de la cadena en un registro edx
; int 80h ; interrupcion para invocar al kernel
; jmp Exit
GetStrlen: ;me devuelve la longitud del argumento
push ebx
xor ecx, ecx
not ecx
xor eax, eax
cld
repne scasb
mov byte [edi - 1], 10
not ecx
pop ebx
lea edx, [ecx - 1]
ret
; TooManyArgs: ;Bloque de codigo si quiero limitar argumentos
; mov eax, sys_write
; mov ebx, stdout
; mov ecx, szErrMsg
; mov edx, ERRLEN
; int 80H
; EsArgE:
; mov eax,sys_write ; call system 'write' id 4
; mov ebx,stdout ; descriptor de archivo 1 = pantalla
; mov ecx,mensaje ; guardo la cadena en un registro ecx
; mov edx,mensajel ; guardo la cadena en un registro edx
; int 80h ; interrupcion para invocar al kernel
; jmp Exit
Exit: ;Salida del programa
mov esp, ebp
pop ebp
mov eax, sys_exit
xor ebx, ebx
int 80H