Assembly 如何在不使用减号的情况下从内存位置减去一?
我在一个面试问题网站上得到了这个问题。解决方案将是用汇编语言编写的代码。我不太擅长组装,只是想知道如何才能完成。我知道没有负号我们可以通过加(-1)来减去。这是接受2的赞美。但对于我来说,到底应该如何编写指令是很困难的。任何帮助都将不胜感激 我得到了这样的东西:Assembly 如何在不使用减号的情况下从内存位置减去一?,assembly,x86,Assembly,X86,我在一个面试问题网站上得到了这个问题。解决方案将是用汇编语言编写的代码。我不太擅长组装,只是想知道如何才能完成。我知道没有负号我们可以通过加(-1)来减去。这是接受2的赞美。但对于我来说,到底应该如何编写指令是很困难的。任何帮助都将不胜感激 我得到了这样的东西: MOV AX,b Taking 2's compliment here ADD AX,above mentioned command 我正在使用X86。 谢谢因为有几种方法可以减去一个,而且因为不完全清楚什么是允许的,什么是不允许
MOV AX,b
Taking 2's compliment here
ADD AX,above mentioned command
我正在使用X86。
谢谢因为有几种方法可以减去一个,而且因为不完全清楚什么是允许的,什么是不允许的,所以我将发布几种可能的解决方案-随你选择 使用带有负数的
添加:
mov AX, b
add AX, -1
mov b, AX
使用减量:
mov AX, b
dec AX
mov b, AX
使用否定+加法:
mov AX, b
neg AX
add AX, 1 ; inc AX also works
neg AX
还有无数其他的可能性。如果这是X86或其他处理器,那么您有一个“立即添加到内存”(英特尔格式)
或者只是从内存中减量:
dec value
或者一些复杂的事情:
neg value
not value
在我看来,不使用减号的情况下,最明显的减法是:
sub AX,1
这比dec
的优点是它可以相应地设置标志。您使用的是x86吗?这个怎么样?漂亮的2,非常漂亮的2。明亮美丽,非常均匀。这很有效b/c你在使用循环计数寄存器?@JayInNyc是的,loop
decrementsCX
还有一个疑问,我想从内存位置X86减去1。将值移动到AX是正确的移动吗?首先将值移动到AX同样有效,减小它,然后按原样将其写回内存以直接递减内存中的值。那么,我不能像上面的答案中所述使用MOV和DEC命令吗?可以,但不需要MOV,因为-1或DEC的add immediate可以直接与内存位置一起使用,而不使用任何寄存器。使用递减或进行位操作。如果发生位操作,想看到您的解决方案的人可能会感到惊讶。
neg value
not value
sub AX,1