Assembly 检查一个或多个数字的符号

Assembly 检查一个或多个数字的符号,assembly,x86,Assembly,X86,与之相关的是,我曾尝试用汇编程序检查单个数字或多个压缩数字的符号,以完成大部分繁重的工作: # Checking sign / unpacking values # to check the sign, of an N-bit number, we can do check the left-most bit: # 1 << (num_bits - 1) # For example: for a signed 16 bit number, we can do: # NUM &

与之相关的是,我曾尝试用汇编程序检查单个数字或多个压缩数字的符号,以完成大部分繁重的工作:

# Checking sign / unpacking values
# to check the sign, of an N-bit number, we can do check the left-most bit:
#   1 << (num_bits - 1)
# For example: for a signed 16 bit number, we can do:
#   NUM & (1 << 15) --> if this is NOT ZERO, it means the left-most bit was set and thus is a negative (signed) number

# (1) checking a single number
NEG_NUM = -4
mov $NEG_NUM, %ax
test $(1 << (16-1)),  %ax
setnz %r11b

POS_NUM = 4
mov $POS_NUM, %ax
test $(1 << (16-1)),  %ax
setnz %r12b

# (2) checking multiple numbers packed into a single value
# pack two 16-bit values into %eax -- signed short nums[] = {10, -2}
NEG_MULTI_PART_NUM = 0x000AAFFE
mov $NEG_MULTI_PART_NUM, %eax
test $(1 << (32-1) | (1 << (16-1))), %eax
setnz %r13b

POS_MULTI_PART_NUM = 0x0B003F1E
mov $POS_MULTI_PART_NUM, %eax
test $(1 << (32-1) | (1 << (16-1))), %eax
setnz %r14b
我有几个与此相关的问题:

是测试$1x86有一个符号标志SF。测试相同,相同/集%al将是惯用的。当您想要的位已经有了一个专门针对它的特殊标志结果时,不需要在立即测试上浪费代码大小

查看编译器输出的int fooint x{return xx86有一个符号标志,SF。test same,same/sets%al将是惯用的。当您想要的位已经有一个特殊标志结果时,无需在立即测试上浪费代码大小


查看int fooint x的编译器输出{return xx86有一个符号标志SF。test same,same/设置%r11b。不需要在立即数上浪费代码大小。查看int fooint x的编译器输出{返回x@PeterCordes你能解释一下它是如何工作的吗?在编译器资源管理器上尝试时,它在优化时不会给出太多,只是:movl%edi、%eax、shrw$15、%ax。顺便说一下,我对值进行硬编码只是为了测试,这样我可以或多或少地看到结果并进行测试,以确保它们是正确的。哦,对了,这是e甚至更好。它只是将符号位移到底部,留下一个0或1整数。但这不是int返回值,是吗?@PeterCordes复制我的第一个示例是一个简短的例子-以下是链接:哦,出于某种原因,你也为布尔返回值选择了一个简短的字符。你的setz只返回bool,即0或1字节。x86有一个符号标志,SF。测试相同,相同/设置%r11b。无需在立即数上浪费代码大小。查看编译器输出的int fooint x{返回x@PeterCordes你能解释一下它是如何工作的吗?在编译器资源管理器上尝试时,它在优化时不会给出太多,只是:movl%edi、%eax、shrw$15、%ax。顺便说一下,我对值进行硬编码只是为了测试,这样我可以或多或少地看到结果并进行测试,以确保它们是正确的。哦,对了,这是e更好。它只是将符号位移到底部,留下一个0或1整数。但这不是int返回值,是吗?@PeterCordes复制我的第一个示例是一个简短的例子-这里是链接:哦,出于某种原因,你也选择了布尔返回值的简短。你的setz只返回bool,即0或1字节。谢谢,因为要检查的示例:mov$NEG_NUM,%ax/test$1@carl.hiass:mov是否设置了标志?检查:不,它没有。拜托,伙计,你已经知道足够多,可以快速研究这部分你可能不确定的内容。但当然,如果这是像add%cx,%ax这样的计算结果,那么SF就已经根据t的结果设置了他补充道。mov不是ALU指令,也不设置标志。在实际代码中,您永远不会在mov上立即执行此操作,但可能是在loadok上。我想我当时就知道了。它将是:mov$-4,%ax test%ax,%ax sets%bl。其中第一条指令是移动一个数字进行测试。这正确吗?@carl.hiass:是的。通常您可以省略mov-从您的示例中立即开始,只讨论测试AX中已经存在的某些值,而不指定它是如何到达那里的。这与编写一个与通过某些测试值的测试调用程序分离的函数的想法相同。明白了。感谢您的帮助和建议,作为AlwaysHanks,举个示例检查:mov$NEG_NUM,%AX/test$1@carl.hiass:does mov是否设置了标志?检查:不,没有。拜托,老兄,你已经知道了足够多的知识,可以快速研究这部分你可能不确定的内容。但是,当然,如果它是一个计算的结果,比如添加%cx,%ax,那么SF将已经根据添加的结果设置。mov不是ALU指令,也不会设置标志。In真正的代码您永远不会在mov立即数上执行此操作,但可能是加载。我想我当时就知道了。它将是:mov$-4,%ax test%ax,%ax sets%bl。其中第一条指令是移动一个数字进行测试。正确吗?@carl.hiass:是的。通常,您可以从示例中省略mov立即数,只需讨论测试一些AX中已经存在的值,但没有指定它是如何到达的。与编写一个与通过某些测试值的测试调用程序分离的函数的想法相同。获得它感谢您一如既往的帮助和建议