我需要计算单词,哪里是大字而不是数字。
如果有大字,我使用inr c
,如果有数字则使用dcr c
。在单词结尾处我尝试c> 0,如果是,我做inr d
。 d
是字母数量大于数字的字数。问题是,c> 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 :(得分:1)
CPI
根据无符号比较的结果设置进位标志。换句话说,如果数字多于字母,那么您的负数实际上就是一个大正数。
但是,它还会根据减法结果的符号来设置符号标志,在大多数情况下,该符号倾向于与符号比较的结果相同。因此,第一个解决方案是在最后部分分别用JNC
和JC
替换JP
和JM
。但是,这对于某些较大的输入将无法正常工作,因为-128-1
会产生127
,并且Sign标志会错误地提示-128 > 1
。
在Intel 8080上进行带符号比较的另一种方法是进行XRI 128 / CPI x+128
并再次使用Carry标志(因此,将所有数字都移128并进行无符号比较)。因此,您可以尝试的第二种解决方案是将CPI 1
替换为XRI 128 / CPI x+129
。这有点慢,但是没有第一个选项那样的溢出问题。
(不过,请不要同时使用这两种解决方案,因为它将无法正常工作。)