Ayuda con lenguaje ensamblador

Publicado en 'Programación' por Alguno, 4 Jul 2012.





  1. Alguno

    Alguno Miembro frecuente

    Registro:
    30 Ago 2009
    Mensajes:
    140
    Likes:
    10




    Hola estaba haciendo un ejercicio en lenguaje ensamblador , usando un simulador del microcontrolador 8051, sobre saber si un numero dado es primo o no , eh estado intentando pero no logro hacer que funcione bien , soy bastante novato en esto , si pudieran echarme una mano se los agradeceria .
    Código:
    org 0000h
    mov r0,#13 ; muevo a r0 el numero a probar
    mov r1,#1  ; numero ah dividir
    mov a,r0   ; muevo r0 al acumulador
    loop:
    inc r1
    mov b,r1
    div ab       
    mov r2,b
    dec a           ;disminuyo en 1 el acumulador
    jz primo       ; si el acumulador es cero significa que es primo
    cjne r2,#0,loop ; si el resto no es cero salta a loop
    
    primo:
    mov r5,#1
    end 
     


  2. blacklist

    blacklist Miembro frecuente

    Registro:
    31 Ene 2010
    Mensajes:
    235
    Likes:
    59
    debo suponer que a y b son los registros de trabajo, no? (no he trabajado con el 8051 pero sí sé assembler de otros micros) después de la división debo suponer también que el cociente queda en a y el residuo en b.

    lo que no entiendo es por qué disminuyes el acumulador. se supone que el acumulador (el número que evalúas) lo vas a ir dividiendo entre 1,2,3,4, y así hasta que el divisor llegue al número en cuestión (en realidad sería hasta la raíz cuadrada del número pero creo que no es práctico). no deberías decrementar el acumulador.
     
  3. Alguno

    Alguno Miembro frecuente

    Registro:
    30 Ago 2009
    Mensajes:
    140
    Likes:
    10
    Gracias por tu respuesta , si tienes razón no debí disminuir el acumulador , lo que debí hacer es comparar el valor del registro 1 ( que es el que aumenta) con el numero original , así la diferencia si me da cero significara que llego al mismo numero y que es primo ya que ninguno anterior lo dividió.Bueno acá esta el código con el que termine y hasta donde lo eh probado funciona,gracias blacklist por tu respuesta ^^
    Código:
     org 0000h
    
    lcall registro          
    mov r0,#15 ; muevo a r0 el numero a probar
    mov r1,#1  ; numero ah dividir
    mov a,r0   
    loop:
    inc r1
    mov a,r1
    subb a,r0         ; comparo si el numero a dividir es el mismo
    jz primo          ; salta a primo si la diferencia es cero
    mov a,r0
    mov b,r1
    div ab       
    mov r2,b
    cjne r2,#0,loop ; si el resto no es cero salta a loop
    mov r6,#1        ; si el numero no es primo
    mov a,#1
    call valores      
    clr P3.4
    clr P3.3
    mov P1,A
    sjmp $ 
    
    primo:
    mov r5,#1
    call valores
    clr P3.4
    clr P3.3
    mov P1,A
    sjmp $
    
    registro:
    mov r0,#0
    mov r1,#0
    mov r2,#0
    mov r5,#0
    mov r6,#0
    ret
    
    valores:
    inc A
    movc A,@A+PC
    ret
    db 08ch ; pone en el display "p"           
    db 0c0h ; pone en el display "0"
     
    Última edición: 5 Jul 2012
  4. blacklist

    blacklist Miembro frecuente

    Registro:
    31 Ene 2010
    Mensajes:
    235
    Likes:
    59
    chévere que te funcionó. en la san martín trabajan con 8051? con que fabricante trabajan? y qué módulos usan?
     
  5. Alguno

    Alguno Miembro frecuente

    Registro:
    30 Ago 2009
    Mensajes:
    140
    Likes:
    10
    =_= no soy de la san martin tío vivo en san martin de porres jajaa =_= estudio en la uni , en el curso de introducción de la ciencia de la computación estudiamos con el 8051.