Skip to content

Instantly share code, notes, and snippets.

@ManuelWiki
Created October 24, 2023 17:09
Show Gist options
  • Save ManuelWiki/a3885a0840475c13c14a971b241ee67d to your computer and use it in GitHub Desktop.
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…
; 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