Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 如何在不使用减号的情况下从内存位置减去一?_Assembly_X86 - Fatal编程技术网

Assembly 如何在不使用减号的情况下从内存位置减去一?

Assembly 如何在不使用减号的情况下从内存位置减去一?,assembly,x86,Assembly,X86,我在一个面试问题网站上得到了这个问题。解决方案将是用汇编语言编写的代码。我不太擅长组装,只是想知道如何才能完成。我知道没有负号我们可以通过加(-1)来减去。这是接受2的赞美。但对于我来说,到底应该如何编写指令是很困难的。任何帮助都将不胜感激 我得到了这样的东西: MOV AX,b Taking 2's compliment here ADD AX,above mentioned command 我正在使用X86。 谢谢因为有几种方法可以减去一个,而且因为不完全清楚什么是允许的,什么是不允许

我在一个面试问题网站上得到了这个问题。解决方案将是用汇编语言编写的代码。我不太擅长组装,只是想知道如何才能完成。我知道没有负号我们可以通过加(-1)来减去。这是接受2的赞美。但对于我来说,到底应该如何编写指令是很困难的。任何帮助都将不胜感激

我得到了这样的东西:

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
decrements
CX
还有一个疑问,我想从内存位置X86减去1。将值移动到AX是正确的移动吗?首先将值移动到AX同样有效,减小它,然后按原样将其写回内存以直接递减内存中的值。那么,我不能像上面的答案中所述使用MOV和DEC命令吗?可以,但不需要MOV,因为-1或DEC的add immediate可以直接与内存位置一起使用,而不使用任何寄存器。使用递减或进行位操作。如果发生位操作,想看到您的解决方案的人可能会感到惊讶。
        neg     value
        not     value
        sub AX,1