一个在汇编中对数字求平方的简单函数

A simple function to square a number in assembly

我进入汇编编程的第二天,我正在尝试创建一个函数来计算一个数的平方
square.asm:

    global square: ; do not need _start because gcc has one already
    section .text
square:
    mov rax, rsi; remember: first argument is always in rsi. (Order is: rsi, rdi, rdx, tcx, r8, r9)
    mul rsi ; rax = rax * rsi (remember: accumulator is the implicit argument)
    ret ; returns the value in accumulator

main.c:

#include <stdio.h>

long int square(long int);

int main() {
    for (long int i = 1; i < 6; i++) {
        printf("%li", square(i));
    }
    return 0;
}

结果:

7556421251850319424-3765949904798924751-3765949904798924751-3765949904798924751-3765949904798924751

预计:

1491625

我错过了什么?

如果您使用 System V ABI,您的第一个参数在 rdi,而不是 rsi

使用:

mov ras, rdi
mul rdi
ret

为了使输出更易于阅读,您还需要在打印语句中加入一些空格或换行符:

printf("%li\n", square(i));

还有一个吹毛求疵 - 使用 int main(void)int main(int argc, char **argv) 作为您的 main 函数签名。其他未定义。