-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaaaaasm.asm
More file actions
82 lines (76 loc) · 2.3 KB
/
aaaaasm.asm
File metadata and controls
82 lines (76 loc) · 2.3 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
section .data
cadena0: db "Hola", 0 ; Cadena literal (terminada en null)
cadena0Len: equ $ - cadena0 - 1 ; Longitud sin el null
newLine: db 10, 0 ; Caracter de nueva línea (LF)
newLineLen: equ $ - newLine - 1
section .bss
inputBuffer: resb 64 ; Buffer para leer entrada (ejemplo)
intStrBuffer: resb 12 ; Buffer para convertir entero a cadena
section .text
global _start
; ------------------------------------------
; iprint - Imprime el entero en EAX (sin salto de línea)
; Destruye EAX, EBX, ECX, EDX
iprint:
push eax ; Guardar registros que se usarán
push ecx
push edx
push esi
mov esi, intStrBuffer + 10 ; Apuntar al final del buffer (-1 para null)
mov byte [esi+1], 0 ; Null terminator
test eax, eax ; Es cero?
jnz .convLoop
; Si es cero, poner '0'
mov byte [esi], '0'
dec esi
jmp .print
.convLoop:
mov edx, 0 ; Limpiar edx para división
mov ebx, 10 ; Divisor 10
idiv ebx ; eax = eax / 10, edx = eax % 10
add dl, '0' ; Convertir dígito (resto) a ASCII
mov [esi], dl ; Guardar dígito en buffer
dec esi ; Mover puntero del buffer
test eax, eax ; Quedan dígitos? (eax == 0?)
jnz .convLoop
.print:
inc esi ; Apuntar al primer dígito
mov ecx, esi ; Dirección de inicio de la cadena
mov edx, intStrBuffer + 11
sub edx, esi ; Calcular longitud (fin - inicio)
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
int 0x80
pop esi ; Restaurar registros
pop edx
pop ecx
pop eax
ret
; ------------------------------------------
; ------------------------------------------
; iprintLF - Imprime el entero en EAX y luego un salto de línea
; Destruye EAX, EBX, ECX, EDX
iprintLF:
call iprint ; Llama a la función de imprimir entero
push eax ; Guardar eax temporalmente si es necesario
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, newLine ; Dirección del carácter de nueva línea
mov edx, newLineLen ; Longitud (1)
int 0x80
pop eax ; Restaurar eax
ret
; ------------------------------------------
_start:
; --- Inicio del código generado ---
; TAC: escribir "Hola";
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, cadena0 ; Dirección de la cadena
mov edx, cadena0Len ; Longitud de la cadena
int 0x80 ; Llamada al kernel
; --- Fin del código generado ---
; Salida normal del programa
mov eax, 1 ; sys_exit
xor ebx, ebx ; Código de salida 0 (sin error)
int 0x80 ; Llamada al kernel