如何在汇编中使用负数作为1?

3
我有一个汇编算术程序,但当我对负数进行加减乘时,它无法产生期望的输出。

例如:
输入:
-1+2=66675 (should be 1)

-1-1=656745 (should be -2)

-1*-1=66757 (should be 1) 

问题:
  • 如何将(-)和(1)视为一个数进行处理?
  • 如何在有符号数中进行算术运算?
请给出任何建议...

1
在将结果转换为ASCII时:MOV AL,BYTE PTR RESULT + 1; 首先检查AX是否为正或负... 如果您发现数字为负数,则应将其转换为二进制补码。 然后在将其转换为人类可读文本时,您需要将其转换回去。 - Kibitz503
好的,现在我知道了,谢谢你的时间。我会记住从你那里学到的一切。上帝保佑! :) - scarface23
祝你有美好的一天,伙计。但愿我能提供更多帮助,但汇编语言离我母语还很远 :) - Kibitz503
1个回答

1
我建议您了解二进制补码以及有符号整数和无符号整数之间的区别。您展示的值看起来非常像将有符号整数负值转换为无符号整数值而没有进行转换。负整数具有最高位设置为1的最高位。如果您在不首先掩码的情况下将该值推入无符号整数中,则得到比预期大得多的数字。
8位表示的示例:
signed value = -1 
unsigned value = 255 
binary = 1111 1111

Take the twos compliment: 
       1111 1111
XOR    0000 0000
equals 0000 0000
add1   0000 0001
dec value = 1

您可以在这里了解更多(他们有一个关于二进制补码加法的示例供您参考):http://academic.evergreen.edu/projects/biophysics/technotes/program/2s_comp.htm


那么您的意思是,如果我输入(-1+2),那么-1应该首先转换为2的补码,以便它被视为-1?请您耐心等待,我对汇编语言非常陌生...我们有一个计算器项目,但没有讨论过汇编语言...我真的很难理解这个问题... - scarface23
一个8位(你的可能更大,但8位是一个更容易的例子)无符号整数的值范围为0到255。有符号的8位整数是-128到127。二进制补码是用来使加法操作工作的方案。汇编语言非常低级,根据环境的不同,你可能没有有符号整数。你的打印函数显示我有1111 1111,所以我的数字必须是255,但实际上它是-1。 - Kibitz503
关键是将所有以^1^000 0000开头的数字视为已转换为二进制补码的负数。在我的例子中,如果您尝试将200添加到该值中,它会搞乱一切,因为您正在添加一个太大的正数到容器中! - Kibitz503
但是你可以!(二进制补码-1)1111 1111 +(2)0000 0010 =(一)0000 0001。 (二进制补码-4)1111 1100 *(4)0000 0100 =(二进制补码-16)1111 0000。只需确保将负数存储为其二进制补码值,并确保没有正数超过新范围,这个范围大约是之前的一半。只需要一些练习就可以掌握它。同一网站提供了有关如何进行二进制加法,减法,乘法和除法的良好信息。 - Kibitz503
好的,我明白了。也许我可以发布我的代码的一部分,只有在获取输入后的过程,然后你可以告诉我程序中哪些部分应该修改?我会将代码与帖子一起发布。 - scarface23
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接