ИПЦ устанавливает 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
. Это немного медленнее, но у него нет проблемы с переполнением, как в первом варианте.
(Не применяйте оба решения, так как это не сработает).