I'm trying to subtract 2 integers bit-by-bit and was given this algorithm
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
I have implemented up to this line b = ((not x) and y) or ((not x) and b) or (y and b)
. How should I implement that last line of the algorithm in my code
This is what I have so far:
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
The algorithm start from the calculation loop label. I needed to save the value stored in al
register, in order to implement the last line of the algorithm, but since dl
and bl
is in used which general purpose register should I use to store value of al
?
No your code is still wrong. Below is a piece of code that shows how to store registers in the stack. (It is however far from optimized)
In general if you’re out of registers, use the stack.
If registers are used in other places in your code and need to persist, use the stack to store them then reset them when you’re done.
calculation:
mov ebx, 0
mov ecx, 7
subtract:
; init
mov eax, 0
mov edx, 0
; al = bit i of x
mov al, X
and al, 1h
; dl = bit i of y
mov dl, Y
and dl, 1h
; save data for later (technique 1 the stack)
push eax
push edx
; bit i of difference = x xor y xor b
xor al, dl
xor al, bl
or diff, al ; or instead of mov
; restore data (technique 1 the stack)
pop edx
pop eax
; b = ((not x) and y) or ((not x) and b) or (y and b)
not al
mov dh, al ; copy not al in dh (technique 2)
and al, dl ; ((not x) and y)
and dh, bl ; ((not x) and b)
and dl, bl ; (y and b)
or al, dh ; ((not x) and y) or ((not x) and b)
or al, dl ; ((not x) and y) or ((not x) and b) or (y and b)
mov bl, al
ror diff, 1
ror X, 1
ror Y, 1
loop subtract
ror diff, 1
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
prompt5 BYTE "The result is: ",0dh,0ah,0
X byte 0
Y byte 0
sum 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 bh, 0
mov ecx, 8
subtract:
mov al, X
and al, 1h
mov dl, Y
and dl, 1h
mov ah, al
mov dh, al
xor al, dl
xor al, bl
mov bh, al
add sum, bh
not ah
and ah, dl
not dh
and dh, dl
and dl, bl
or ah, dh
or ah, dl
mov bl, ah
ror X, 1
ror Y, 1
loop subtract
xor eax, eax
mov al, sum
js printError1
cmp ebx, 0ffh
jg printError1
jmp printResult
printResult:
xor edx, edx
mov edx, OFFSET prompt1
call writeString
call writeInt
exit
main ENDP
END main
ok I got it