(1)判断双字的高位字是不是1,如果不是,直接返回
(2)清除进位标志
(3)将低字求反,然后 +1
(4)将进位保存起来
(5)将高位字求反,加上刚才的进位
--------------
XXXX:
MOV AX, X + 1 ;取 X 的高位字
CMP AX, 32768
JB X_EXIT ;是正数就跳转
MOV AX, X ;取 X 的低位字
XOR AX, 0FFFFH ;取反
ADD AX, 1
PUSHF
MOV X, AX
MOV AX, X + 1 ;取X 的高位字
XOR AX, 0FFFFH ;取反
POPF
ADC AX, 0
MOV X + 1, AX
X_EXIT:
RET
给你一个汇编的32位的例子
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include f:\masm32\include\windows.inc
include f:\masm32\include\user32.inc
include f:\masm32\include\kernel32.inc
includelib f:\masm32\lib\user32.lib
includelib f:\masm32\lib\kernel32.lib
myabs PROTO :DWORD
; #########################################################################
.data
nValue1 dd 100H
nValue2 dd 8FFFFFFFH
.code
start:
invoke myabs,nValue1
invoke myabs,nValue2
invoke ExitProcess,NULL
; 求ABS的子函数
myabs proc src:DWORD
xor eax,eax
mov eax, DWORD PTR src
test eax, 080000000H
jz POSITIVE
xor eax, 0FFFFFFFFH
inc eax
POSITIVE:
ret
myabs endp
end start