更改程序集8086中寄存器的符号位

时间:2014-12-27 11:06:52

标签: assembly cpu-registers x86-16

我正在尝试编写一个相当简单的汇编代码,它会更改寄存器AL的符号位(只是符号位)。

我需要找到两种不同的方法来做到这一点,但遗憾的是我提出的解决方案似乎并没有起作用。

1)我尝试从自身减去AL两次:

mov BL,AL
sub AL,BL
sub AL,BL

但这不仅仅改变了符号位。我理解为什么。

2)我也尝试过向AL添加10000000。这确实解决了这个问题,但如果AL的符号位为1,那么我会得到溢出并进位。

有没有办法只更改符号位,而不会遇到溢出/进位问题?

4 个答案:

答案 0 :(得分:3)

如何做:

XOR AL, 80H

也:

MOV BL, AL
MOV AL, 0
SUB AL, BL
AND BL, 7FH
AND AL, BL

保留标志的另一件事你总是可以去

   PUSHF
       // whatever
    POPF

答案 1 :(得分:1)

将其移入进位标志,补充标志并将其移回:

shl al, 1
cmc
rcr al, 1

要保留标记,您可以使用pushfpopf

答案 2 :(得分:1)

XOR使用您想要更改的寄存器操作常数0x8000(对于16位)。

点击谷歌搜索:

xor Bitwise logical XOR
  Syntax:   xor dest, src
  dest: register or memory
  src: register, memory, or immediate
  Action: dest = dest ^ src
  Flags Affected: OF=0, SF, ZF, AF=?, PF, CF=0

答案 3 :(得分:0)

要更改符号,请使用NEG指令

例如

MOV AX,0101        - AX = 0101
NEG AX             - AX = 1010
                      because of the NEG instruction


NEG instruction affects these flags only:
    CF, ZF, SF, OF, PF, AF.

NEG - Make operand negative (two's complement).
      Actually it reverses each bit of operand and then adds 1 to
      it. For example 5 will become -5, and -2 will become 2.