Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly CPI设置Cy总是为真,可能是负数?_Assembly_Intel 8080 - Fatal编程技术网

Assembly CPI设置Cy总是为真,可能是负数?

Assembly CPI设置Cy总是为真,可能是负数?,assembly,intel-8080,Assembly,Intel 8080,我需要数一数单词,其中大字母比数字多 如果大写字母在word中,我使用inr c;如果有数字,我使用dcr c。在单词的末尾,我尝试c>0,如果它是真的,我就做inr dd是大号字母多于数字的单词数。问题是,c>0总是正确的。(我想,因为它算得上所有的单词) CPI根据无符号比较的结果设置进位标志。换句话说,如果你的数字比字母多,那么你的负数实际上被视为一个大正数 但是,它还根据减法结果的符号设置符号标志,这在很大程度上倾向于与有符号比较的结果相同。因此,第一种解决方案可以分别用JP和JM替换最

我需要数一数单词,其中大字母比数字多

如果大写字母在word中,我使用
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