ИПЦ устанавливает Cy всегда в true, может быть, отрицательные числа?

Мне нужно посчитать слова, где больше больших букв, чем цифр.

я использую inr c если большая буква в слове и dcr c если есть номер. В конце слова я пытаюсь с>0, если это правда, я делаю inr d, d количество слов с большими буквами, чем цифры. Проблема в том, что с> 0 всегда верно. (Я думаю, потому что он считает все слова).

cpi 'A'             ;find if it is letter
jnc mozno_pismeno
cpi '9'+1           :find if it is number
jc mozno_cislo

mozno_pismeno:      ;maybe it is letter
cpi 'Z'+1           ;second chceck if it is letter
jc je_to_pismeno
jmp getchar_main
je_to_pismeno:      ;it is letter so inr c
inr c
jmp getchar_main    

mozno_cislo:        ;maybe it is number
cpi '0'             ;second check if it is number
jnc je_to_cislo
jmp getchar_main
je_to_cislo:        ;it is number so dcr c
dcr c
jmp getchar_main

koniec_slova:       ;it is end of the word
mov a,c
cpi 1               ;if c>0 that mean that there was more letters
jnc ma_viac_pismen
mvi c,0             ;prepare c for next one character
jmp getchar_main
ma_viac_pismen:     ;c>0 so inr d 
inr d 
mvi c,0             ;prepare c for next one character
jmp getchar_main

0 ответов

CPIустанавливает флаг переноса в соответствии с результатами беззнакового сравнения. Другими словами, если у вас больше цифр, чем букв, тогда ваше отрицательное число фактически рассматривается как большое положительное число.

Однако он также устанавливает флаг Знака в соответствии со знаком результата вычитания, который по большей части имеет тенденцию быть таким же, как результат сравнения со знаком. Итак, первое решение может заменитьJNC а также JC в вашей последней части с JP а также JMсоответственно. Это не будет работать правильно с некоторыми большими входами, так как-128-1 дает 127 и флаг "Знак" неверно предполагает, что -128 > 1.

Другой способ подписанного сравнения на Intel 8080: XRI 128 / CPI x+128и снова использовать флаг переноса (так, сдвиг всех чисел на 128 и выполнение беззнакового сравнения). Итак, второе решение, которое вы можете попробовать, - заменитьCPI 1 с XRI 128 / CPI x+129. Это немного медленнее, но у него нет проблемы с переполнением, как в первом варианте.

(Не применяйте оба решения, так как это не сработает).

Другие вопросы по тегам