问题描述
我是组装的新手,并且正在使用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,%edx
movl D,%edx
subl %edx,%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;
}
在这里。
long long sum_and_subtract(void);
解决方法
我将遵循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
这是一个评论,所以不要紫外线。随时使用DV
带有打印内容的完整代码:https://godbolt.org/z/3a9YMo
并带有打印代码:https://godbolt.org/z/KT8YWT