Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Architetture dei sistemi di elaborazione
- ; Esercitazione 2 - Esercizio 3
- ; Se vuoi testare l'altro caso usa VAR DW 1H
- ; TEST: If the result of the AND is 0, the ZF is
- ; set to 1, otherwise set to 0
- .MODEL SMALL
- .STACK
- .DATA
- VAR DW 0BEACH
- DIM DB 16 ; DIM DB TYPE VAR non funziona su EMU8086
- RIS DB 0
- .CODE
- .STARTUP
- ; SP = 256
- ; Salvataggio dei parametri di ingresso nello stack
- ; 1) Variabile su cui fare il conteggio di "1"
- PUSH VAR ; SP = 254
- ; 2) Dimensione della variabile da analizzare
- XOR CX, CX
- MOV CL, DIM
- PUSH CX ; SP = 252
- ; 3) Salvataggio di uno spazio nello stack per il
- ; risultato (ottimizzare a 1 byte anzichè 2?)
- SUB SP, 2 ; SP = 250, qui memorizzo RIS
- CALL CONTA_UNO ; SP = 248, all'uscita SP = 250
- ; Metto il risultato della procedura in CL
- POP CX ; SP = 252
- MOV RIS, CL
- ; "Svuoto" lo stack
- ADD SP, 4 ; SP = 256
- ; Testo il 4° bit
- TEST RIS, 00001000B
- JNZ NEGA ; Se NZ allora il 4° bit è 1
- JMP NOPE ; Altrimenti no :)
- NEGA: NEG RIS
- NOPE:
- .EXIT
- CONTA_UNO PROC
- PUSH BP ; SP = 246
- MOV BP, SP ; BP = 246
- PUSH BX
- PUSH CX
- PUSH DX
- XOR BX, BX ; BL = contatore bit a "1"
- MOV DX, [BP + 8] ; DX = dato da analizzare
- MOV CX, [BP + 6] ; CX = dimensione del dato
- CICLO:
- SHR DX, 1
- ADC BL, 0
- LOOP CICLO
- MOV [BP + 4], BL
- POP DX
- POP CX
- POP BX
- POP BP
- RET
- CONTA_UNO ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment