Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- N EQU 13
- AREA imageArea, DATA, READONLY
- image DCB 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02
- AREA zipArea, DATA, READWRITE
- compressed SPACE 2*N
- AREA |.text|, CODE, READONLY
- ; Reset Handler
- Reset_Handler PROC
- EXPORT Reset_Handler [WEAK]
- LDR R0, =image
- LDR R1, =compressed
- PUSH {R0, R1}
- BL compression
- POP {R0, R1}
- LDR R0, =N
- LDR R1, =compressed
- PUSH {R0, R1}
- BL compressionStats
- POP {R0, R1}
- LDR R0, =5 ; res: 3
- LDR R1, =compressed
- PUSH {R0, R1}
- BL findSymbol
- POP {R0, R1}
- LDR R0, =13 ; res :2
- LDR R1, =compressed
- PUSH {R0, R1}
- BL findSymbol
- POP {R0, R1}
- LDR R0, =6 ; res: 1
- LDR R1, =compressed
- PUSH {R0, R1}
- BL findSymbol
- POP {R0, R1}
- stop B stop
- ENDP
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; ++ R1, R0, .. ----
- compression PROC
- PUSH {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, lr}
- LDR R0, [SP, #48]
- LDR R1, [SP, #52]
- EOR R5, R5, R5 ; contatore
- EOR R4, R4, R4 ; flag uguale
- EOR R6, R6, R6 ; totale
- SUB R0, R0, #1
- SUB R1, R1, #1
- preleva
- EOR R5, R5, R5
- ADD R7, R0, #1 ; salvo R0+1 in una var temporanea
- LDRB R2, [R0, #1]!
- LDRB R3, [R0, #1]!
- ADD R5, R5, #1
- CMP R2, R3
- BNE contadiverse
- contauguali
- LDRB R2, [R0, #1]!
- ADD R5, R5, #1
- CMP R2, R3
- BNE finesequg
- B contauguali
- contadiverse2
- MOV R3, R2
- contadiverse
- LDRB R2, [R0, #1]!
- ADD R5, R5, #1
- CMP R2, R3
- BEQ fineseqdiv
- B contadiverse2
- finesequg
- SUB R5, R5, #1
- STRB R5, [R1, #1]!
- STRB R3, [R1, #1]!
- ADD R9, R5, #1 ; per salvarlo nel contatore
- B next
- fineseqdiv
- SUB R5, R5, #3 ; gli ultimi due che preleva sono uguali + 1 per l'algoritmo
- ORR R5, R5, #0x00000080
- STRB R5, [R1, #1]!
- AND R5, R5, #0xFFFFFF7F
- ADD R5, R5, #1 ; per la stampa
- MOV R9, R5
- salvaseqdiv
- LDRB R8, [R7, #1]!
- STRB R8, [R1,#1]!
- SUB R5, R5, #1
- CMP R5, #0
- BHI salvaseqdiv
- next
- SUB R0, R0, #2
- ADD R6, R6, R9
- CMP R6, #N
- BLO preleva
- POP {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, pc}
- ENDP
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- compressionStats PROC
- PUSH {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, lr}
- LDR R0, [SP, #48] ; numero originale di byte
- LDR R1, [SP, #52] ; puntatore vettore
- SUB R1, R1, #1
- contbyte
- LDRB R3, [R1, #1]!
- ADD R2, R2, #1
- CMP R3, #0
- BNE contbyte
- SUB R2, R2, #1 ; numero bute vettore compresso
- LDR R6, =100
- MUL R5, R2, R6
- UDIV R5, R5, R0 ; R5 = nbyte/N
- SUB R4, R6, R5 ; fattore compressione
- STR R4, [SP, #48]
- POP {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, pc}
- ENDP
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- findSymbol PROC
- PUSH {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, lr}
- LDR R0, [SP, #48] ; i-esimo simbolo della immagine
- LDR R1, [SP, #52] ; compressa
- EOR R3, R3, R3 ; indice reale nel vettore originale
- ; considero una posizione umana (si parte da 1)
- leggi
- MOV R7, R1
- LDRB R2, [R1]
- CMP R2, #0x00000080
- BHS divseq
- eqseq
- ADD R2, R2, #1
- ADD R1, R1, #2
- ADD R3, R3, R2
- B try
- divseq
- AND R2, R2, #0x0000007F
- ADD R2, R2, #1
- ADD R3, R3, R2
- ADD R1, R1, R2
- ADD R1, R1, #1
- ADD R2, R2, #0x00000080
- try
- CMP R0, R3
- BLS found
- B leggi
- found
- CMP R2, #0x00000080
- BLO findeq
- finddiv
- AND R2, R2, #0x0000007F
- SUB R3, R3, R2
- cicla
- ADD R7, R7, #1
- ADD R3, R3, #1
- CMP R3, R0
- BNE cicla
- LDRB R5, [R7]
- B then
- findeq
- LDRB R5, [R7, #1]
- then
- STR R5, [SP, #48]
- POP {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, pc}
- ENDP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement