Changing ASCII case using bitwise operator

I am writing this post to share the method with my friends. I am doing Bachelor in Computer Science and Engineering. My microprocessor course teacher gave us a task to change case from upper or lower to uppercase. It is kind of "DO it yourself" task. I am using emu 8086 for this task. Here are two test cases that we have must pass: Teas Case 1: Input : abcd Output : ABCD Teas Case 2: Input : aBCd Output : ABCD NOTE: Input will be always 4 character and between a-z or A-Z. We can solve it using conditional instruction. To make the problem more interesting, I've challenged myself to solve it without branching. Gladly, I've found a way to solve it using bitwise operator. Character ASCII value (binary) A 0 1 0 0 0 0 0 1 a 0 1 1 0 0 0 0 1 We can see that the 6th bit is zero for uppercase character and one for lowercase character. If we can set the bit to 0 no matter what is the input, the character will become Uppercase. We can set it to zero and left rest of bits unchanged by using bitwise AND operation. a -> 0110 0001 1101 1111 ---------------- AND -> 0100 0001 I am going to use 11011111 (binary) or DF (hex) to set the 6th bit to zero and leave other bits unchanged. PROC MAIN MOV AH, 01H ; input mode INT 21H ; take 1st character in AL AND AL, 0DFH ; perform AND operation MOV BL, AL ; Move result to another Register INT 21H ; same as 1st character AND AL, 0DFH MOV BH, AL INT 21H ; same as 1st character AND AL, 0DFH MOV CL, AL INT 21H ; same as 1st character AND AL, 0DFH MOV CH, AL MOV AH, 02H MOV DL, 0AH ; print newline INT 21H MOV DL, 0DH ; print cret INT 21H MOV DL, BL ; print 1st character INT 21H MOV DL, BH ; print 2nd character INT 21H MOV DL, CL ; print 3rd character INT 21H MOV DL, CH ; print 4th character INT 21H ENDP Case 1 : Case 2 : Happy Coding !!!

Apr 11, 2025 - 18:44
 0
Changing ASCII case using bitwise operator

I am writing this post to share the method with my friends.

I am doing Bachelor in Computer Science and Engineering. My microprocessor course teacher gave us a task to change case from upper or lower to uppercase.

It is kind of "DO it yourself" task.

I am using emu 8086 for this task.

Here are two test cases that we have must pass:

Teas Case 1:
Input : abcd
Output : ABCD

Teas Case 2:
Input : aBCd
Output : ABCD

NOTE: Input will be always 4 character and between a-z or A-Z.

We can solve it using conditional instruction.
To make the problem more interesting, I've challenged myself to solve it without branching.

Gladly, I've found a way to solve it using bitwise operator.

Character ASCII value (binary)
A 0 1 0 0 0 0 0 1
a 0 1 1 0 0 0 0 1

We can see that the 6th bit is zero for uppercase character and one for lowercase character.

Indicating bit to change

If we can set the bit to 0 no matter what is the input, the character will become Uppercase.

We can set it to zero and left rest of bits unchanged by using bitwise AND operation.

a ->   0110 0001
       1101 1111
----------------
AND -> 0100 0001

I am going to use 11011111 (binary) or DF (hex) to set the 6th bit to zero and leave other bits unchanged.

PROC MAIN
   MOV AH, 01H   ; input mode

   INT 21H       ; take 1st character in AL
   AND AL, 0DFH  ; perform AND operation
   MOV BL, AL    ; Move result to another Register

   INT 21H       ; same as 1st character
   AND AL, 0DFH
   MOV BH, AL

   INT 21H       ; same as 1st character
   AND AL, 0DFH
   MOV CL, AL

   INT 21H       ; same as 1st character
   AND AL, 0DFH
   MOV CH, AL


   MOV AH, 02H

   MOV DL, 0AH   ; print newline
   INT 21H
   MOV DL, 0DH   ; print cret
   INT 21H 


   MOV DL, BL    ; print 1st character
   INT 21H

   MOV DL, BH    ; print 2nd character
   INT 21H

   MOV DL, CL    ; print 3rd character
   INT 21H

   MOV DL, CH    ; print 4th character
   INT 21H

ENDP

Case 1 :

Case 1

Case 2 :

Case 2

Happy Coding !!!