LC2…

Ecco fatto il compitino di LC2. Erano 2 anni che per pigrizia me lo portavo dietro. Titolo dell’esercizio: “Conta maiuscole”.

E´ stato come tornare indietro di 15 anni!

Ecco testo e soluzione dell’esame.

        .orig x3000
        LEA     R0, string
        JSR     CONTA_MAIUS
        TRAP    x25
string  .stringz "Questa è La mia FRase"

CONTA_MAIUS
                            ; R0 *str
                            ; R1 contatore altri caratteri
        ST      R2, str2    ; R2 str[i]
        ST      R3, str3    ; R3 confronto
        ST      R4, str4    ; R4 char 'A' mod2
        ST      R5, str5    ; R5 char 'Z' mod2
        ST      R6, str6    ; R6 contatore doppie

        AND     R1, R1, x0  ; azzerro R1
        AND     R6, R6, x0  ; azzerro R6
        LD      R4, charA   ; R4 = - 'A'
        NOT     R4, R4
        ADD     R4, R4, #1
        LD      R5, charZ   ; R5 = - 'Z'
        NOT     R5, R5
        ADD     R5, R5, #1

loop    LDR     R2, R0, #0
        BRZ     end         ; str[i] == 0 ?
        ADD     R3, R2, R4
        BRN     other       ; str[i] < 'A' ?
        ADD     R3, R2, R5
        BRP     other       ; str[i] > 'Z' ?
        ADD     R6, R6, #1
        BR      next
other   ADD     R1, R1, #1
next    ADD     R0, R0, #1
        BR      loop
end     ADD     R0, R6, #0  ; copio in R0 il risultato
                            ; R1 contiene già il valore da tornare
        LD      R2, str2
        LD      R3, str3
        LD      R4, str4
        LD      R5, str5
        LD      R6, str6
        RET

charA   .fill x41
charZ   .fill x5A
str2    .fill #0
str3    .fill #0
str4    .fill #0
str5    .fill #0
str6    .fill #0
        .end

Nel caso trovaste qualche errore e/o imperfezione, segnalatemela.

Ma adesso si torna al presente, ovvero al lavoro.

Aggiornamento

Per curiosità in Java avrei scritto

String str = "Questa è La mia FRase";
int upperCase = 0, others = 0;

for (char ch : str.toCharArray()) {
  if (Character.isUpperCase(ch))
    ++upperCase;
  else
    ++others;
}

in C

char* str = "Questa è La mia FRase";
int u = 0, o = 0;
for (; *str != 0 ; ++str)
  isupper(*str) ? ++u : ++o;

in Python

str = "Questa è La mia FRase"
u = o = 0
for ch in str :
  if ch.isupper() :
    u += 1
  else :
    o += 1