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.

¿Recibo un error al llamar a writeString en EDX?

He estado haciendo una tarea en Visual Studio que se supone que imprime un array de caracteres en un formato de “caja”, donde después de cada 4 caracteres hay un salto de línea.

Pero cuando intento llamar a la función writeString de Irvine32 por segunda vez, el programa produce un error de violación de acceso en la lectura de la ubicación.

Aquí está mi código (estoy usando DWORD, por eso incremento en 4):

mov esi, OFFSET array1 
mov ebx, totalSize
mov eax, counter

forLoop: 

cmp eax, ebx 
jae loopExit
mov edx, 0 
mov edx, [esi + eax * 4]
call writeString
jmp forLoop

Incluso intenté hacerlo más simple usando la suma en su lugar, pero aún así no funcionó:

mov esi, OFFSET array1 
mov ebx, totalSize
mov eax, counter

forLoop: 

cmp eax, ebx 
jae loopExit
mov edx, 0 
mov edx, esi 
call writeString
mov ecx, 4
mov esi, [esi + 4]
jmp forLoop

No puedo entender qué está saliendo mal aquí. Simplemente creo que hay algo incorrecto con el puntero o writeString, pero no sé qué.

Gracias por cualquier ayuda y disculpa si esta es una pregunta tonta.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que puede haber un problema con la función writeString o la forma en que se llama. Según el código proporcionado, no está claro cuál es el valor de totalSize y counter, y cómo se relacionan con el tamaño de la matriz.

    Una posible solución podría ser utilizar un bucle para iterar a través de la matriz e imprimir cada caracter individualmente, en lugar de llamar a la función writeString múltiples veces. Además, puede ser necesario ajustar el puntero utilizado para acceder a la matriz para asegurarse de que apunta a la ubicación correcta en la memoria.

    Aquí hay un ejemplo de cómo se podría implementar:

    mov esi, OFFSET array1
    mov ebx, totalSize  ; tamaño de la matriz en bytes
    mov ecx, 0          ; contador para el número de caracteres impresos
    
    forLoop:
    
        cmp ecx, ebx
        jge loopExit     ; salir del bucle si se han impreso todos los caracteres
    
        mov dl, BYTE PTR [esi]
        call writeChar    ; imprimir el caracter actual
    
        inc ecx           ; incrementar el contador de caracteres
    
        cmp ecx, 1
        jne checkMod      ; verificar si se han impreso 4 caracteres
    
        mov dl, '\n'      ; imprimir un salto de línea después de cada 4 caracteres
        call writeChar
    
        mov ecx, 0        ; reiniciar el contador de caracteres
    
        checkMod:
    
        add esi, 1        ; incrementar el puntero al siguiente caracter
        jmp forLoop
    
    loopExit:
    

    Este código recorre la matriz, imprimiendo un caracter a la vez utilizando la función writeChar. También verifica si se han impreso 4 caracteres y agrega un caracter de salto de línea antes de continuar. El contador de caracteres se utiliza para realizar un seguimiento de cuántos caracteres se han imprimido y se reinicia después de cada cuarto caracter.

    En general, el problema con el error de “Access violation reading location” podría deberse a varios factores diferentes, como valores incorrectos de puntero o problemas de asignación de memoria. Puede ser útil depurar el código paso a paso con un depurador o agregar declaraciones de impresión para ver qué valores se están utilizando y cuándo ocurre el error.

Comments are closed.