一 C语言的atoi函数简单实现,
int atoi(char* str)
{
int result = 0;
for (int i = 0; i < strlen(str); i++) {
if (str[i] < '0' || str[i] > '9') {
break;
}
result -= str[i] - '0';
}
return result;
}
二 nasm汇编实现
global atoi_asm
atoi_asm:
push rbx
push rcx
push rdx
push rsi
;保存一些寄存器
xor rax, rax;初始化结果寄存器
xor rcx, rcx;初始化计数器
multiLoop:;计算循环
xor rbx, rbx;清空rbx
mov bl, byte[rdi+rcx]; 把一个字节赋值给bl rbx的低32位
cmp bl, 48;和48对比 '0'
jl finished
cmp bl, 57;和字符'9'对比
jg finished
sub bl, 48; 把字符转换成数字
mov r8, rbx;缓存到r8寄存器
mov rbx, 10;10->rbx
mul rbx;原来的数据 * 10
add rax, r8; 和刚转换的数字 相加
inc rcx; 移动一位
jmp multiLoop
finished:
pop rsi
pop rdx
pop rcx
pop rbx
ret
三 C语言调用
#include <stdio.h>
extern int atoi_asm(char *buf);
int main()
{
int result = atoi_asm("12345");
printf("result %d\n", result);
return 0;
}
四 运行输出