CPI将Cy始终设为true,可能为负数?

时间:2017-02-25 17:41:09

标签: assembly intel-8080

我需要计算单词,哪里是大字而不是数字。

如果有大字,我使用inr c,如果有数字则使用dcr c。在单词结尾处我尝试c> 0,如果是,我做inr dd是字母数量大于数字的字数。问题是,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

1 个答案:

答案 0 :(得分:1)

CPI根据无符号比较的结果设置进位标志。换句话说,如果数字多于字母,那么您的负数实际上就是一个大正数。

但是,它还会根据减法结果的符号来设置符号标志,在大多数情况下,该符号倾向于与符号比较的结果相同。因此,第一个解决方案是在最后部分分别用JNCJC替换JPJM。但是,这对于某些较大的输入将无法正常工作,因为-128-1会产生127,并且Sign标志会错误地提示-128 > 1

在Intel 8080上进行带符号比较的另一种方法是进行XRI 128 / CPI x+128并再次使用Carry标志(因此,将所有数字都移128并进行无符号比较)。因此,您可以尝试的第二种解决方案是将CPI 1替换为XRI 128 / CPI x+129。这有点慢,但是没有第一个选项那样的溢出问题。

(不过,请不要同时使用这两种解决方案,因为它将无法正常工作。)