1

私はアセンブリが初めてで、IA32 アーキテクチャを使用しています。次の操作を生成する関数をコーディングしようと.sしています: C + A - D + B

  • A は 8 ビット変数です
  • B は 16 ビット変数です
  • C と D は両方とも 32 ビット変数です

この関数は、C で出力する必要がある 64 ビット値を返す必要がありますが、これを理解することはできません。

私はこれを試していますが、正の数のテストでは機能しますが、負の数で作業しているときは機能せず、理由がわかりません。

私の機能sum_and_subtract.s

.section .data

.global A
.global B
.global C
.global D

.section .text
.global sum_and_subtract

# short sum_and_subtract(void)

sum_and_subtract:

#prologue 
    pushl %ebp 
    movl %esp, %ebp
    
    pushl %ebx
    
#body of the function

    movl $0, %eax # clear eax   
    movl C, %eax
    movl $0, %ecx
    movb A, %cl
    
    addl %ecx, %eax
    movl $0, %edx
    movl D, %edx
    subl %edx, %eax
    movl $0, %ebx
    movw B, %bx
    addl %ebx, %eax
        
    movl $0, %edx
    adcl $0, %edx
    
    cdq
#epilogue

fim:

    popl %ebx
    
    movl %ebp, %esp
    popl %ebp
    ret

正しい例は次のとおりです。

  • A = 0、B = 1、C = 0、D = 0; 期待値 = 1 -> 結果 = 1 であり、この例では機能します

エラーは次の場合に表示されます。

  • A = 0、B = 0、C = 0、D = 1; 期待値 = -1 -> 結果 = 256

あなたのコメントを見た後、長い長い結果を出力するメインコードを書くのを忘れていました。

main.c :

#include <stdio.h>
#include "sum_and_subtract.h"   

char A = 0;
short B = 0;
long C = 0;
long D = 1;

int main(void) {
    
    printf("A = %d\n", A);
    printf("B = %hd\n", B);
    printf("C = %ld\n", C);
    printf("D = %ld\n", D);

    long long result = sum_and_subtract();
    
    printf("Result = %lld\n", result);
    
    return 0;

}

ここにあります。

私はこの他のファイルを持っていますsum_and_subtract.h

long long sum_and_subtract(void);
4

1 に答える 1

0

私はCコンパイラに従います:

doit:
        movsbl  A(%rip), %eax
        movswl  B(%rip), %edx
        addl    C(%rip), %eax
        subl    D(%rip), %eax
        addl    %edx, %eax
        cltq
        ret
        movsx   eax, BYTE PTR A[rip]
        movsx   edx, WORD PTR B[rip]
        add     eax, DWORD PTR C[rip]
        sub     eax, DWORD PTR D[rip]
        add     eax, edx
        cdqe
        ret

それは「印刷する」-1

それはむしろコメントなので、UVしないでください。気軽にDV

印刷された完全なコード: https://godbolt.org/z/3a9YMo

印刷コード: https://godbolt.org/z/KT8YWT

于 2020-11-02T23:33:32.210 に答える