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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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_Subtraction_Negative Number - Fatal编程技术网

Assembly 在汇编语言中减去负数

Assembly 在汇编语言中减去负数,assembly,subtraction,negative-number,Assembly,Subtraction,Negative Number,我知道,为了在汇编中把一个数字变成负数,我需要把它变成2的补码,对它进行异或运算,然后加上1 我已经这样做了,但是我的输出仍然不正确,有人能告诉我哪里出了错吗 目标是减去-val1-val2-val3 这是我的大部分代码 .data 瓦尔1德沃德10000h 瓦尔2德沃德40000h val3 dword 20000h 最终德沃德? .代码 主进程 mov eax,val1 ; start with 10000h xor eax,val1 ; xor

我知道,为了在汇编中把一个数字变成负数,我需要把它变成2的补码,对它进行异或运算,然后加上1

我已经这样做了,但是我的输出仍然不正确,有人能告诉我哪里出了错吗

目标是减去-val1-val2-val3

这是我的大部分代码

.data
瓦尔1德沃德10000h
瓦尔2德沃德40000h
val3 dword 20000h
最终德沃德?

.代码 主进程

mov eax,val1            ; start with 10000h
xor eax,val1            ; xor eax to make it almost negative
add eax,1h              ; now add one to make it negative
sub eax,val2            ; subtract 40000h
sub eax,val3            ; subtract 20000h
mov finalVal,eax        ; store the result (30000h)
call    DumpRegs        ; display the registers

exit

最终结果应为EAX=FFF90000 但目前我的输出是EAX=FFFA0001

请注意,我使用的是32位数字,并在x86处理器上运行

感谢您的帮助

这不起作用:

mov eax,val1
xor eax,val1
  ; (a XOR a) is always 0. Using the line above you XOR
  ; val1 with val1 so EAX will always be 0 here!
add eax,1h
  ; (Ok. EAX will be 1 here...)
sub eax,val2
  ...
如果要对数字求反,可以使用“NEG”指令:

neg eax
not eax
add eax, 1h
如果要使用补码进行此操作,请使用“NOT”指令:

neg eax
not eax
add eax, 1h
或: