【问题标题】:how to use negative numbers as one in assembly?如何在汇编中使用负数作为一?
【发布时间】:2013-02-11 17:11:32
【问题描述】:

我在汇编中有一个算术程序,但是当我加、减、乘负数时,它不会产生所需的输出。

举例

输入:

-1+2=66675 (should be 1)

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

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

问题:

  • 如何将 (-) 和 (1) 视为一体?

  • 如何对有符号数进行算术运算?

请给点建议...

【问题讨论】:

  • In CONVERT RESULT TO ASCII: MOV AL , BYTE PTR RESULT + 1 ;首先检查 AX 是正还是负...如果你发现这个数字是负数,你应该把它转换成二进制恭维.然后,当您将其转换为人类可读的文本时,您需要将其转换回来。
  • 好的,现在我知道了,谢谢你的时间。记住我从你那里学到的一切。上帝保佑! :)
  • 是的,今天过得愉快。希望我能提供更多帮助,但 ASM 与我的母语相去甚远 :)

标签: assembly tasm


【解决方案1】:

我建议阅读 2 的赞美以及有符号整数和无符号整数之间的区别。您显示的值看起来很可疑,就像一个有符号的 int 负值被转换为一个无符号的 int 值而不进行转换。负整数的最高有效位设置为 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?请多多包涵,我对汇编很陌生..我们有一个计算器项目,但没有讨论汇编语言..我真的很难理解这个......
  • 一个 8 位(你的更大,但 8 位是一个更简单的例子) unsigned int 的值范围是 0 到 255。一个有符号的 8 位 int 是 -128 到 127。二进制补码是方案用于进行加法运算。 ASM 是非常低级的,根据环境,您可能没有带符号的 int。你的打印功能说我有 1111 1111 所以我的号码必须是 255,而实际上它是 -1。
  • 关键是把所有以^1^000 0000开头的数字都当作一个经过补码转换的负数。在我的示例中,如果您尝试将 200 添加到该值上,它会搞砸一切,因为您添加的正数对于容器来说太大了!
  • 好的,我明白你的意思了...如果它只是典型的数学问题,我可以很容易地执行这个过程,但是在将它实现到程序集时我遇到了问题..我已经有了一个计算器程序,但缺少功能。不能执行负数,而且我在除法上也有问题 sigh ..无论如何,感谢您提供非常有用的信息..
  • 但是你可以! (两个恭维-1)1111 1111 +(2)0000 0010 =(一个)0000 0001。(两个恭维-4)1111 1100 *(4)0000 0100 =(两个恭维-16)1111 0000。只要确保你存储负数,因为它是二进制的补码值,并确保没有正数超出新范围,大约是以前的一半。只是需要一些练习才能让它下来。同一个网站有关于如何进行二进制加法、减法、乘法和除法的很好的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多