1

我是组装新手,我正在使用 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);
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

这是一个评论,所以不要紫外线。随意DV

带打印的完整代码:https ://godbolt.org/z/3a9YMo

并带有打印代码:https ://godbolt.org/z/KT8YWT

于 2020-11-02T23:33:32.210 回答