Herramientas Personales

Problemas resueltos curso 18/19

por Ruiz de Clavijo, Paulino Última modificación 30/05/2019 10:49


## Rellenar la memoria con datos

    .include"m328pdef.inc"

    .EQU N=16

    LDI XH,0X01
    LDI XL,0X00   ; X = 0X0100
    LDI R16,1
    Bucle: ST X+, R16
    INC R16
    CPI R16 , N+1
    BRNE Bucle
    
    
## Problema 7a
    
    traslada: 
    	PUSH R17    ; Hay que guardar los registros
    	PUSH R18    ; que se usen en la subrutina
    	CLR R17
    Bucle_traslada:     
	INC R17

        LD R18,X+   ; R18=RAM[X++];  (equivalente en JAVA/C)
        ST Y+, R18  ; RAM[Y++]=R18;  (equivalente en JAVA/C)

	CP R17,R16
	BREQ fin_traslada
	JMP Bucle_traslada
	    
    fin_traslada: 
        POP R18    ; Recupera los registros guardados
	POP R17    ; antes de volver de la subrutina
	ret
    
## Problema 7b

    LDI XH, 0X01
    LDI XL, 0x00
    LDI YH, 0X02
    LDI YL, 0x00
    LDI R16, 16
    CALL Traslada
    
## Problema 8

    ldi xh,0x01
    ldi xl,0x00
    ld r0, x
    ldi r16,0
    
  bucle:            ; for (r16=0;r16!=16;r16++)
    cpi r16,16
    breq fin
        
    ld r17,x+
    cp r0,r17
    brlo sigue    ; Comprueba si el número es menor
    mov r0, r17
    
  sigue:
    inc r16
    jmp bucle

## Problema 10

.include"m328pdef.inc"

    	LDI XH, 0x01
    	LDI XL, 0x00
    	LDI R16, 2
    Bucle: 
    	ST X+, R16
    	INC R16
    	INC R16
    	CPI R16, 254
    	BREQ Fin
        JMP Bucle
    Fin:
    	ST X+, R16 ; Faltaba una iteración del bucle
        BREAK

## Problema 11

    	LDI XH, 0x01
    	LDI XL, 0x00
    	LDI R16, 0
    	CLR R0
    	CLR R1
    Bucle: 
        ld r17,x+
    	SBRS R17,7 ; Comprueba si el bit 7 es 0
    	INC R0  ; Es positivo
    	SBRC R17,7 ;  Comprueba si el bit 7 es 1
        INC R1  ; Es negativo
    	inc r16
    	cpi r16,100
    	BREQ Fin
        JMP Bucle
    Fin:
         BREAK

## Problema 12
    
        ; Este es un poco complicado de entender
    	LDI XH, 0x01
    	LDI XL, 0x00
    	LDI YH, 0x01
    	LDI YL, 0x10 ; Apunta al siguiente tras el último
    	LDI R16, 0
    Bucle: 
    	ld R0,x
    	ld R1,-y
    	st x+,r1
    	st y,r0
    	inc r16
    	cpi r16,8
    brne bucle ; Salta si R16 != 8
         BREAK

## Problema 18

.include"m328pdef.inc"


ldi r16,0b01000001
call subrutina_bcd
break


subrutina_bcd:
	
	push r17
	push r18

	mov  r17,r16
	mov  r18,r16
	andi r17,0b00001111
	andi r18,0b11110000
	swap r18

	cpi r17,10   ; R17 < 10
	brlo ok
	ser  r0
	jmp  fin_subrutina
ok:
	cpi r18,10   ; R17 < 10
	brlo ok2
	ser  r0
	jmp  fin_subrutina
ok2:
	clr r0
fin_subrutina:
	pop r18
	pop r17

Acciones de Documento