побитовое вычитание двух целых чисел в ассемблере

Я пытаюсь побитно вычесть 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?


person bluebk    schedule 25.06.2013    source источник
comment
Если у вас закончились регистры, найдите, какое значение может быть временным, а затем используйте стек. толкать топор, использовать топор для временных вещей, затем возвращать значение обратно к топору   -  person ady    schedule 25.06.2013
comment
да, но инструкции push и pop должны были быть в следующем разделе, я не должен знать эти инструкции в этой лабораторной работе   -  person bluebk    schedule 25.06.2013
comment
Мне нужно только сохранить значение al, так как это действительно единственный регистр, который я хочу изменить.   -  person bluebk    schedule 25.06.2013
comment
Вы также можете сохранить значение во временной переменной. Но у вас все еще осталось много регистров, таких как AH, BH, DH, SI, DI, BP (последние 3 16-битные, но могут отлично хранить ваше 8-битное значение). Кроме того, вы можете выполнять такие вычисления, как MOV AL, X; XOR AL, Y; AND AL, 1, экономя один регистр.   -  person Jester    schedule 25.06.2013


Ответы (2)


Нет, ваш код все еще неверен. Ниже приведен фрагмент кода, показывающий, как хранить регистры в стеке. (Однако он далек от оптимизации) В общем, если у вас нет регистров, используйте стек. Если регистры используются в других местах вашего кода и должны сохраняться, используйте стек для их хранения, а затем сбросьте их, когда закончите.

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
person a.lasram    schedule 26.06.2013

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

Ладно, я понял

person bluebk    schedule 25.06.2013