Assembly CPI设置Cy总是为真,可能是负数?
我需要数一数单词,其中大字母比数字多 如果大写字母在word中,我使用Assembly CPI设置Cy总是为真,可能是负数?,assembly,intel-8080,Assembly,Intel 8080,我需要数一数单词,其中大字母比数字多 如果大写字母在word中,我使用inr c;如果有数字,我使用dcr c。在单词的末尾,我尝试c>0,如果它是真的,我就做inr dd是大号字母多于数字的单词数。问题是,c>0总是正确的。(我想,因为它算得上所有的单词) CPI根据无符号比较的结果设置进位标志。换句话说,如果你的数字比字母多,那么你的负数实际上被视为一个大正数 但是,它还根据减法结果的符号设置符号标志,这在很大程度上倾向于与有符号比较的结果相同。因此,第一种解决方案可以分别用JP和JM替换最
inr c
;如果有数字,我使用dcr c
。在单词的末尾,我尝试c>0,如果它是真的,我就做inr d
d
是大号字母多于数字的单词数。问题是,c>0总是正确的。(我想,因为它算得上所有的单词)
CPI
根据无符号比较的结果设置进位标志。换句话说,如果你的数字比字母多,那么你的负数实际上被视为一个大正数
但是,它还根据减法结果的符号设置符号标志,这在很大程度上倾向于与有符号比较的结果相同。因此,第一种解决方案可以分别用JP
和JM
替换最后一部分中的JNC
和JC
。但是,对于一些较大的输入,这将无法正常工作,因为-128-1
产生127
,并且符号标志将错误地提示-128>1
在Intel 8080上进行签名比较的另一种方法是执行XRI 128/CPI x+128
并再次使用进位标志(因此,将所有数字移动128并进行无符号比较)。因此,您可以尝试的第二种解决方案是将cpi1
替换为xri128/cpix+129
。这有点慢,但不像第一个选项那样有溢出问题
(但不要同时应用这两种解决方案,因为这样做行不通)。进位是用于无符号数字的。请根据需要尝试
JP/JM
。谢谢。现在它工作了。但如果ACarry仅对无符号数字有意义,则Cy应设置为1。如果你有,比如说,-1
作为有符号,实际上是255
,那么如果你检查进位标志,它就大于1
。
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