我正在尝试编写一个相当简单的汇编代码,它会更改寄存器AL的符号位(只是符号位)。
我需要找到两种不同的方法来做到这一点,但遗憾的是我提出的解决方案似乎并没有起作用。
1)我尝试从自身减去AL两次:
mov BL,AL
sub AL,BL
sub AL,BL
但这不仅仅改变了符号位。我理解为什么。
2)我也尝试过向AL添加10000000。这确实解决了这个问题,但如果AL的符号位为1,那么我会得到溢出并进位。
有没有办法只更改符号位,而不会遇到溢出/进位问题?
答案 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
要保留标记,您可以使用pushf
和popf
。
答案 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.