Я пытаюсь побитно вычесть 2 целых числа и получил этот алгоритм
b = 0
difference = 0
for i = 0 to (n-1)
x = bit i of X
y = bit i of Y
bit i of difference = x xor y xor b
b = ((not x) and y) or ((not x) and b) or (y and b)
end for loop
Я реализовал до этой строки b = ((not x) and y) or ((not x) and b) or (y and b)
. Как мне реализовать эту последнюю строку алгоритма в моем коде
Это то, что у меня есть до сих пор:
INCLUDE Irvine32.inc
.data
prompt1 BYTE "Enter the first integer: ",0dh,0ah,0
prompt2 BYTE "Enter the second integer: ",0dh,0ah,0
prompt3 BYTE "The first integer entered is not valid ",0dh,0ah,0
prompt4 BYTE "The second integer entered is not valid ",0dh,0ah,0
X byte 0
Y byte 0
diff byte 0
.code
main PROC
L1:
mov edx, OFFSET prompt1
call writeString
xor edx, edx
call readInt
js printError1
cmp eax, 0ffh
jg printError1
mov X, al
xor eax, eax
L2:
mov edx, OFFSET prompt2
call writeString
xor edx, edx
call readInt
js printError2
cmp eax, 0ffh
jg printError2
mov Y, al
xor eax, eax
jmp calculation
printError1:
mov edx, OFFSET prompt3
call writeString
xor edx, edx
jmp L1
printError2:
mov edx, OFFSET prompt4
call writeString
xor edx, edx
jmp L2
calculation:
mov ebx, 0
mov diff, 0
mov ecx, 7
subtract:
mov al, X
and al, 1h
mov dl, Y
and dl, 1h
xor al, dl
xor al, bl
mov diff, al
rol X, 1
rol Y, 1
loop subtract
exit
main ENDP
END main
Алгоритм начинается с метки цикла вычислений. Мне нужно было сохранить значение, хранящееся в регистре al
, чтобы реализовать последнюю строку алгоритма, но поскольку используются dl
и bl
, какой регистр общего назначения следует использовать для хранения значения al
?
AH
,BH
,DH
,SI
,DI
,BP
(последние 3 16-битные, но могут отлично хранить ваше 8-битное значение). Кроме того, вы можете выполнять такие вычисления, какMOV AL, X; XOR AL, Y; AND AL, 1
, экономя один регистр. - person Jester   schedule 25.06.2013