【问题标题】:subtracting two integers bit by bit in assembly在汇编中逐位减去两个整数
【发布时间】:2013-06-25 00:23:20
【问题描述】:

我正在尝试逐位减去 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 寄存器中的值,但是由于使用了dlbl,我应该使用哪个通用寄存器来存储al 的值?

【问题讨论】:

  • 如果你的寄存器用完了然后找到哪个值可以是临时值,然后使用堆栈。推斧头,将斧头用于临时的东西,然后将值弹回斧头之类的东西
  • 是的,但是推送和弹出指令应该在后面的部分,我不应该在这个实验室知道这些指令
  • 我只需要存储 al 的值,因为这确实是我要修改的唯一寄存器
  • 您也可以将值存储到临时变量中。但是您仍然有很多寄存器,例如AHBHDHSIDIBP(后3个是16位但可以存储您的8位值就好了)。此外,您还可以像 MOV AL, X; XOR AL, Y; AND AL, 1 这样进行计算,为您节省一个寄存器。

标签: assembly x86 bitwise-operators masm irvine32


【解决方案1】:

不,您的代码仍然是错误的。下面是一段代码,展示了如何在堆栈中存储寄存器。 (然而它远未优化) 通常,如果您的寄存器用完了,请使用堆栈。 如果在代码中的其他地方使用了寄存器并且需要持久化,请使用堆栈来存储它们,然后在完成后重置它们。

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

【讨论】:

    【解决方案2】:
    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
    

    好的,我知道了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多