Created
October 24, 2023 17:09
-
-
Save ManuelWiki/a3885a0840475c13c14a971b241ee67d to your computer and use it in GitHub Desktop.
Programa de Turbo Assembler (MASM/TASM) que establece el bit de paridad para una localidad de memoria de un byte llamada dato. Si la suma de unos de los bits 0 a 6 es par pondrá el bit 7 en cero, pero si la suma es non pondrá el bit 7 en uno. Este programa es parte de una serie de tareas que comparto para ayudar a otros y demostrar mi experienci…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; TITULO: programa que establece el bit de paridad para una localidad de memoria de un byte llamada dato. | |
; Si la suma de unos de los bits 0 a 6 es par pondrá el bit 7 en cero | |
; pero si la suma es non pondrá el bit 7 en uno. | |
ideal | |
dosseg | |
model small | |
stack 256 | |
dataseg | |
codsal db 0 | |
; Mis variables { | |
dato db 01110100b | |
unos db 0 ; Contador de unos | |
;} | |
codeseg | |
inicio: | |
mov ax, @data | |
mov ds, ax | |
; ###### MI CODIGO ####### { | |
; Debemos contar cuantos 1s hay en las 7 primeras posiciones | |
; Para eso, haremos un ciclo que revise cada una de esas posiciones | |
mov bl, [dato] ; copiamos 'dato' a 'bl' para no perder su valor original | |
mov cx, 7 ; Copiamos 7 a 'cx' para que el ciclo se repita 7 veces | |
ciclo: | |
; Veremos si el bit de la posicion actual es 0 o 1 | |
; Para eso, copiaremos este valor a 'cx'. Luego veremos por qué | |
mov al, 00000001b | |
; Y haremos esta operación | |
and al, bl | |
; Si en la posicion 0 de 'bl' hay un 1, en 'al' se guardara '00000001' (o sea 1 en binario) | |
; pero si hay un 0, se guardara '00000000' (o sea 0 en binario). Para esto fue que copiamos 00000001 a 'al' | |
; Si el bit de esa posicion era un 1, se va a sumar 1 al contador | |
add [unos], al | |
; Si no, se va a sumar 0 y el contador va quedar igual | |
; recorreremos 'bl' un paso a la derecha, para leer la siguiente posicion | |
ror bl, 1 | |
dec cx ; Le restamos 1 a 'cx' por cada repeticion del ciclo | |
jcxz fin_ciclo ; Si 'cx' es 0, salimos del ciclo | |
jmp ciclo ; Si no, lo repetimos | |
fin_ciclo: | |
; aqui, despues del ciclo, ya tenemos contados los 1s en las primeras 7 posiciones en 'dato' | |
; Ahora tenemos que ver si es par (el bit en la posicion 0 es igual a 0) o impar (el bit en la posicion 0 es igual a 1) | |
; Vamos a ver si ese bit es 0 o es 1 | |
mov al, 00000001b | |
and al, [unos] | |
; Si era 1, en 'al' se guardo un 1, pero si no, se guardo un 0 | |
cmp al, 0 | |
je par ; Si al es igual a 0, saltamos a 'par' | |
jmp impar ; Si es 1, saltamos a 'impar' | |
par: | |
; Con esto, pondremos el bit mas significativo en 0, sin cambiar el resto | |
and [dato], 01111111b | |
jmp salir | |
impar: | |
; Con esto, pondremos el bit mas significativo en 1, sin cambiar el resto | |
or [dato], 10000000b | |
jmp salir | |
; } | |
salir: | |
mov ah, 04Ch | |
mov al, [codsal] | |
int 21h | |
end inicio |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment