私はアセンブリが初めてで、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);