一个在汇编中对数字求平方的简单函数
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
函数签名。其他未定义。
我进入汇编编程的第二天,我正在尝试创建一个函数来计算一个数的平方
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
函数签名。其他未定义。