assemblyx86-16uppercaseemu8086alphabet

Print to the console the entire alphabet of uppercase and lowercase (A to Z, a to z) with custom foreground and background colors


How can I print all the alphabet characters (A to Z, a to z)?

I did the following. It lets me print all the characters from A-Z and a-z but the problem is that I get the in-between ASCII characters that I want to filter.
CX is expected to be set to 52 in a working program.

ORG 100h       
MOV AX,0B800H  
MOV DS,AX
MOV BX,0000    ;SET BX REGISTER
MOV CX, 58      ;USED AS A COUNTER 
MOV AL,'A'
MOV AH,0x0E
MOV DL, 41h  
CMP AX, DX
JG UPPERCASE 

UPPERCASE:
    ADD DL, 1
    CMP DX, 5Bh
    JG LOWERCASE
    JMP BACK
    
LOWERCASE:
    ADD DL, 1
    CMP DX, 60h
    JG BACK
    JL UPPERCASE

HLT

BACK:
  MOV [BX],AX
  ADD AL,1
  ADD AH,1
  ADD BX,2
  LOOP UPPERCASE

Solution

  • I get the in-between ASCII characters that I want to filter

    That's because your logic that tries to skip the range from [91,96] increments the parallel counter DL but forgets to also increment the ASCII code in AL. Of course you do not need that DL counter since AL can serve that purpose already!

    CMP AX, DX
    CMP DX, 5Bh
    CMP DX, 60h
    

    You only ever initialize DL (MOV DL, 41h), so comparing to DX is like playing Russian roulette. DH is not necessarily zeroed.

    JG UPPERCASE 
    
    UPPERCASE:
    

    This construct is non-sense in assembly programming. If the condition is greater then you jump to UPPERCASE, but if the condition is not greater then you fall-through in UPPERCASE. No matter, you will always run the code at UPPERCASE. In this program that is what you want to happen, but not in that manner.


    Using 2 loops

      ORG  256
      mov  ax, 0B800h  ; Output via ES:DI
      mov  es, ax
      xor  di, di
      cld
      mov  ax, 0E41h   ; YellowOnBlack capital 'A'
    firstLoop:
      stosw
      add  ax, 0101h   ; Increment Attribute and ASCII together
      cmp  al, 'Z'
      jbe  firstLoop
      mov  al, 'a'     ; Skip the in-between characters
    secondLoop:
      stosw
      add  ax, 0101h
      cmp  al, 'z'
      jbe  secondLoop
      ret
    

    Using 1 loop

      ORG  256
      mov  ax, 0B800h  ; Output via DS:BX
      mov  ds, ax
      xor  bx, bx      ; Better than `mov bx, 0`
      mov  ax, 0E41h   ; YellowOnBlack capital 'A'
    oneLoop:
      mov  [bx], ax
      add  bx, 2
      add  ax, 0101h   ; Increment Attribute and ASCII together
      cmp  al, 'Z' + 1
      je   skip
      cmp  al, 'z'
      jbe  oneLoop
      ret
    
    skip:
      mov  al, 'a'     ; Skip the in-between characters
      jmp  oneLoop