MASM的已签名和未签名说明

问题描述

您如何知道使用MASM x86汇编语言对指令进行签名还是未签名?

解决方法

除法,乘法和右移;对于已签名数据(imulidivsar)和未签名数据(muldivshr)有不同的说明。

对于条件分支,对于带符号的{jojljnljgjngjsjns和未签名的(jcjbjnbjajna)来检查不同的标志。

对于加法,减法(包括cmp)和按位指令(andor等;包括xor),这没有什么区别如果已签名或未签名,则对于两种情况,相同的指令均起作用。区别在于您稍后会关心哪些标志(如果有),而不是指令本身。

例如,您可以执行test(不管sub eax,123中的值是带符号的还是无符号的),然后有一个eax(如果相减的结果是带符号的) )或jo .tooBig(如果减法的结果未签名),以确定减法是否溢出。

注意:对于左移,指令jc .tooBig对有符号和无符号都起作用;但是汇编器可以允许对同一名称(不同名称,相同操作码,相同机器码)使用替代名称shl,使其看起来类似于右移。