我是组装新手,我正在使用 IA32 架构。我正在尝试编写一个.s
产生以下操作的函数:C + A - D + B
- A 是一个 8 位变量
- B 是一个 16 位变量
- C 和 D 都是 32 位变量
该函数应该返回一个 64 位的值,该值必须用 C 语言打印,我无法弄清楚。
我正在尝试这个,它适用于正数的测试,但是当我使用负数时它不起作用,我无法弄清楚原因。
我的功能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
看到你的评论后,我忘了写我的主要代码来打印我的 long long 结果。
主.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);