Added modified max program with stdin input

This commit is contained in:
Fabio Scotto di Santolo
2025-07-03 11:13:40 +02:00
parent 72ff1890ff
commit f7fc4f932f
2 changed files with 130 additions and 1 deletions

View File

@@ -4,7 +4,7 @@ compile() {
local filename="$(basename "$1")"
local basename="${filename%.*}"
nasm -f elf32 -o "$basename.o" "$filename"
nasm -f elf32 -g -F dwarf -o "$basename.o" "$filename"
ld -m elf_i386 -o "$basename" "$basename.o"
rm "$basename.o"
}

129
imax.asm Normal file
View File

@@ -0,0 +1,129 @@
; A simple program that prints the max between two numbers from stdin
;
; Author: Fabio Scotto di Santolo
; Date: 02/07/2025
global _start
section .text
_start:
; Prompt for first number:
mov eax, 0x04 ; write syscall
mov ebx, 1 ; STDOUT file descriptor
mov ecx, prompt
mov edx, len0
int 0x80 ; trigger syscall
; Read first number
mov eax, 0x03 ; read syscall
mov ebx, 0 ; STDIN file descriptor
mov ecx, buffer1
mov edx, 32
int 0x80 ; trigger syscall
mov edi, buffer1 ; save buffer address
mov esi, eax ; save length
; Prompt for second number:
mov eax, 0x04 ; write syscall
mov ebx, 1 ; STDOUT file descriptor
mov ecx, prompt
mov edx, len0
int 0x80 ; trigger syscall
; Read second number
mov eax, 0x03 ; read syscall
mov ebx, 0 ; STDIN file descriptor
mov ecx, buffer2
mov edx, 32
int 0x80 ; trigger syscall
; Convert second number
mov ecx, buffer2 ; save buffer address
mov ebx, eax ; save length
call ascii_to_int
push eax ; save converted second number in the stack
; Convert first number
mov ecx, edi ; ECX = address
mov ebx, esi ; EBX = length
call ascii_to_int ; EAX = first number
; compare numbers
pop ebx ; restore converted second number from stack
cmp eax, ebx ; compare a and b values
jg greater
jle less_or_equal
less_or_equal: ; print b is greater or equal than b
mov eax, 0x04 ; write syscall
mov ebx, 1 ; STDOUT file descriptor
mov ecx, msg1
mov edx, len1
int 0x80 ; trigger syscall
jmp end
greater: ; print a is greater than b
mov eax, 0x04 ; write syscall
mov ebx, 1 ; STDOUT file descriptor
mov ecx, msg2
mov edx, len2
int 0x80 ; trigger syscall
jmp end
end:
; call syscall exit
mov eax, 0x1
xor ebx, ebx ; reset register to 0
int 0x80 ; trigger syscall
; --- ASCII to Integer Conversion Routine ---
ascii_to_int:
push ebx
push ecx
push edx
push esi
xor eax, eax
xor edx, edx
mov esi, ecx
mov ecx, ebx
convert_loop:
cmp byte [esi], 0xA ; newline?
je convert_done
cmp byte [esi], 0xD ; carriage return?
je convert_done
mov ebx, 10
mul ebx ; EAX *= 10
movzx ebx, byte [esi]
sub ebx, '0'
add eax, ebx ; EAX += digit
inc esi
loop convert_loop
convert_done:
pop esi
pop edx
pop ecx
pop ebx
ret
section .data
prompt: db "Insert a number: "
len0: equ $ - prompt
msg1: db "A is less or equal than B", 0xA
len1: equ $ - msg1
msg2: db "A is greater than B", 0xA
len2: equ $ - msg2
section .bss
buffer1: resb 32 ; a buffer of 32 bytes
buffer2: resb 32 ; a buffer of 32 bytes