就我所知,“机器指令操作码的倒数第二位用来指示是否为有符号操作数的,为1时指示是有符号操作数,为0时是无符号操作数,比如ADD指令,ADD 16位寄存器/32寄存器,有符号操作数,它被翻译成机器指令时的操作码是0x83,而ADD 16位寄存器/32寄存器,无符号操作数,它被翻译成机器指令时的操作码是0x81”如这样的指令有以下几个:ADC、ADD、AND、CMP、IMUL、OR、PUSH、SBB、SUB、XOR,而且这样的有符号立即数都是八位的,在2001年版《IA-32 Intel Architecture Software Developer’s Manual》第2卷PDF文档表述为“sign-extended imm8”(来至3-21页的ADD指令)。而对于NASM汇编器而言(其他汇编器没有试过),它翻译指令时并没有将这样的指令翻译成前面所述的0x83或者0x81的操作码,而是将负数转化成补码来翻译。如:
mov ax,-1
add ax,-1
它最终得到的机器码是:B8 FF FF 05 FF FF
其中B8是mov ax 而FF FF 是-1;05是add ax 而FF FF 是-1
可见它并没有把第二条指令add的操作码翻译成0x81,可能符号的处理与汇编器有关系吧,至于寄存器的符号问题,从上面的第一条指令可以得出ax的值肯定是FF FF了。