Assembly 我不知道';我不明白是什么';我的方式有问题;我在做比较(cmpl)

Assembly 我不知道';我不明白是什么';我的方式有问题;我在做比较(cmpl),assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,我真的不明白我的程序出了什么问题。它将-5打印为数组中的最大值。当然,这是完全错误的。应该是34。我认为问题肯定在这里的某个地方: cmpl %ebx, %eax # Compare max and value cmova %eax, %ebx # If eax > ebx, it's new max 我想我做比较的方式有问题。这是本书中的一个稍加修改

我真的不明白我的程序出了什么问题。它将
-5
打印为数组中的最大值。当然,这是完全错误的。应该是34。我认为问题肯定在这里的某个地方:

            cmpl        %ebx, %eax                 # Compare max and value
            cmova       %eax, %ebx                 # If eax > ebx, it's new max
我想我做比较的方式有问题。这是本书中的一个稍加修改的示例:

要编译程序,请使用以下命令:

as --32 -gstabs max.s -o max.o && \
ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out -lc max.o && \
rm max.o && ./a.out

正如有人所说,
cmova
检查“over”,它将值视为无符号。如果您将数字视为无符号,
-5
将被解释为
0xfffffb
,远远高于34(也高于
-45
0xffffd3
)。因此,该值“获胜”,并再次显示为签名编号(即
-5


如果要比较有符号的数字,请改用
cmovg

正如有人所说,
cmova
检查“上面”,它将值视为无符号。如果您将数字视为无符号,
-5
将被解释为
0xfffffb
,远远高于34(也高于
-45
0xffffd3
)。因此,该值“获胜”,并再次显示为签名编号(即
-5


如果要比较有符号的数字,请改用
cmovg

cmova
无符号,则需要
cmovg
。请参阅指令集参考。
cmova
未签名,您需要
cmovg
。请参阅指令集参考。请始终记住:-a在上面,-b在下面;都没有签名-g较大,-l较小;都有签名。永远记住:-a在上面,-b在下面;都没有签名-g较大,-l较小;双方都签了名。
as --32 -gstabs max.s -o max.o && \
ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out -lc max.o && \
rm max.o && ./a.out