es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ld: main.o: en la función `main’: main.asm:(.text+0x6): referencia indefinida a `printf’

Este es mi código aquí y cuando intento vincular mi programa, el enlazador dice referencia indefinida a printf en mi código. El código es un programa para verificar la divisibilidad por 2 y 8 y imprimir números en un bucle. Y obtengo el error de referencia indefinida a printf y necesito que el usuario ingrese un número entero. Lo vinculé a través de:

nasm -f elf32 cw2.asm
gcc -m32 cw2.o

Además, probé un compilador en línea y también obtuve el mismo error.

global main

extern printf

SECTION .data
message1: db "Ingrese un número: ", 0
number1: db "%d", 0
integer1: times 10 db 0 ; 32-bits integer = 10 bytes
msg db 'Divisible por 2 y 8', 0xa,0xd
len equ $ - msg
SYS_EXIT equ 1
STDOUT EQU 1
SYS_WRITE EQU 4
SECTION .bss
val2 resb 2

SECTION .text

main:

push message1
call printf
pop ebx
mov eax, 3
mov ebx, 1
mov ebx, val2
mov edx, 2
int 0x80
push val2
mov al, [val2]

l1:
.divisible_por_2:
mov ax, [number1]
xor dx, dx
mov bx, 2
div bx
cmp dx, 0
jnz .no_divisible

.divisible_por_8:
mov ax, [number1]
xor dx, dx
mov bx, 8
div bx
cmp dx, 0
jnz .no_divisible

.imprimir_numero:
mov edx, [number1]
add edx, 48
mov [number1], edx

mov eax, 4
mov ebx, 1
mov ecx, [number1]
mov edx, len
int 0x80
mov eax, .divisible_por_2
int 0x80

.no_divisible:
xor eax, eax
mov edx, [eax+len]
mov al, 1
mov esi, .divisible_por_2
mov edi, eax
mov eax, 1
int 0x80

El programa debería imprimir números en bucle, por lo que no hay un final para el programa.
Aquí está el error que obtuve en Linux cuando intenté vincular
Error

ld: main.o: en la función <code>main': main.asm:(.text+0x6): referencia indefinida a</code>printf'
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el enlazador no puede encontrar una referencia a la función printf. Esto se debe a que el programa ha llamado a la función printf, pero no ha sido enlazada al programa.

    Para resolver este error, el programa necesita ser enlazado con la biblioteca C, que contiene la definición de la función printf. Modifica el comando de enlazado para incluir la biblioteca C de la siguiente manera:

    gcc -m32 cw2.o -lc
    

    La opción -lc le indica al enlazador que enlace la biblioteca C. Esto debería resolver el error de referencia no definida a printf.

    Adicionalmente, para obtener la entrada del usuario, el programa necesita llamar a la función scanf, que también forma parte de la biblioteca C. Para utilizar scanf, el programa debe declarar primero su prototipo utilizando la palabra clave extern de la siguiente manera:

    extern scanf
    

    Luego, el programa puede llamar a scanf para leer la entrada del usuario de la siguiente manera:

    push val2
    push number1
    call scanf
    add esp, 8
    

    El primer parámetro de scanf es la cadena de formato, que en este caso es “%d”. El segundo parámetro es la dirección de la variable en la cual almacenar el valor de entrada. La instrucción add esp, 8 ajusta el puntero de pila para remover los parámetros de la pila después de la llamada a scanf.

    Con estos cambios, el programa debería ser capaz de leer la entrada del usuario e imprimir números en un bucle, sin errores de referencia no definida.

Comments are closed.