问题描述
您如何知道使用MASM x86汇编语言对指令进行签名还是未签名?
解决方法
除法,乘法和右移;对于已签名数据(imul
,idiv
,sar
)和未签名数据(mul
,div
,shr
)有不同的说明。
对于条件分支,对于带符号的{jo
,jl
,jnl
,jg
,jng
,js
, jns
和未签名的(jc
,jb
,jnb
,ja
,jna
)来检查不同的标志。
对于加法,减法(包括cmp
)和按位指令(and
,or
等;包括xor
),这没有什么区别如果已签名或未签名,则对于两种情况,相同的指令均起作用。区别在于您稍后会关心哪些标志(如果有),而不是指令本身。
例如,您可以执行test
(不管sub eax,123
中的值是带符号的还是无符号的),然后有一个eax
(如果相减的结果是带符号的) )或jo .tooBig
(如果减法的结果未签名),以确定减法是否溢出。
注意:对于左移,指令jc .tooBig
对有符号和无符号都起作用;但是汇编器可以允许对同一名称(不同名称,相同操作码,相同机器码)使用替代名称shl
,使其看起来类似于右移。