1

我需要数单词,哪里有比数字更多的大字母。

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
4

1 回答 1

1

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

但是,它也会根据减法结果的符号设置 Sign 标志,这在很大程度上倾向于与有符号比较的结果相同。所以第一个解决方案可以在你的最后一部分中分别用and替换JNCand 。但是,这不适用于一些较大的输入,因为产量和 Sign 标志会错误地暗示.JCJPJM-128-1127-128 > 1

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

(但不要同时应用这两种解决方案,因为它不起作用)。

于 2019-08-20T22:09:50.887 回答