Сборка IA-32: сложение / вычитание 32-битных значений со знаком и возврат 64-битных значений со знаком - PullRequest
0 голосов
/ 19 октября 2018

В архитектуре IA-32 как суммировать / вычитать два 32-битных значения со знаком и сохранять результат в 64-битном (EDX: EAX) при управлениизнак?

Для этого 32-битные значения:

A = 97
B = 232
C = 2147483600
D = 200

Как мне сделать C + A - D + B и вернуть 64-битное значение в Assembly ?

Примечание: результат от C + A переполняет 32-битный реестр.

Я пытался использовать функцию adc , чтобы добавить перенос к edx после добавления C к A, но, поскольку он подписан, он не делает то, что я притворяюсь.

То, что я пробовал для C + A, но оно не сохраняет знак:

#Prologue
    pushl %ebp
    movl %esp, %ebp

    #Body
    movl $0, %edx
    movl $0, %ecx
    movl $0, %eax
    movb 8(%ebp), %al       #
    movsx %al, %eax         #move with sign extention to 32 bit eax
    addl 16(%ebp), %eax     #adding C + A
    adcl $0, %edx

У меня также есть та же проблема, если C было -97, а A было -2147483600 (для отрицательных значений).

1 Ответ

0 голосов
/ 20 октября 2018

Лучший способ - расширить 32-битные значения со знаком до 64-битных значений до соответствующего вычисления с помощью CDQ:

.section .data

fmt: .string "Result: %lli\n"

.section .text
.globl main

main:
    pushl $97           # A
    pushl $232          # B
    pushl $2147483600   # C
    pushl $200          # D
    call do_it
    add $8, %esp

    push %edx
    push %eax
    push $fmt
    call printf
    add $8, %esp

    pushl $0
    call exit

do_it:
    pushl %ebp                  # Prologue
    movl %esp, %ebp

    mov 12(%ebp), %eax          # C
    cdq
    mov %edx, %edi              # X = C
    mov %eax, %esi

    mov 20(%ebp), %eax          # A
    cdq
    add %eax, %esi
    adc %edx, %edi              # X += A

    mov 8(%ebp), %eax           # D
    cdq
    sub %eax, %esi              # X -= D
    sbb %edx, %edi

    mov 16(%ebp), %eax          # B
    cdq
    add %eax, %esi
    adc %edx, %edi              # X += B

    mov %edi, %edx              # RETURN = X
    mov %esi, %eax

    leave                       # Epilogue
    ret
...