微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

程序集IA32中的符号扩展

如何解决程序集IA32中的符号扩展

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

}

在这里

我还有另一个文件sum_and_subtract.h

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。