如何在NASM中获取用户输入并实现阶乘计算程序
实现用户输入数字并计算阶乘的汇编程序
你的现有代码已经实现了递归计算阶乘的核心逻辑,但目前是硬编码计算3的阶乘,以下是修改后的代码,新增用户输入功能,并适配通用数字的阶乘计算:
修改后的完整代码
; 递归实现用户输入数字的阶乘计算 ; 支持输入范围:1-9(超出会溢出或结果不正确) ; Fact(n) = n * fact(n-1) (n>0) section .text global _start _start: ; 提示用户输入数字 mov edx, prompt_len mov ecx, prompt mov ebx, 1 mov eax, 4 int 80h ; 读取用户输入(最多1字节,即单个数字) mov edx, 1 mov ecx, input_buf mov ebx, 0 mov eax, 3 int 80h ; 将ASCII码转换为数值(输入字符-'0') mov bl, [input_buf] sub bl, 30h ; 调用阶乘计算函数 call proc_fact ; 将计算结果转换为ASCII码 add ax, 30h mov [fact], ax ; 输出结果提示 mov edx, result_msg_len mov ecx, result_msg mov ebx, 1 mov eax, 4 int 80h ; 输出阶乘结果 mov edx, 1 mov ecx, fact mov ebx, 1 mov eax, 4 int 80h ; 输出换行符 mov edx, 1 mov ecx, newline mov ebx, 1 mov eax, 4 int 80h ; 退出程序 mov eax, 1 int 80h ; 递归阶乘计算函数 ; 输入:bl = 要计算阶乘的数字n ; 输出:ax = n的阶乘结果 proc_fact: cmp bl, 1 ; 递归终止条件:n=1时返回1 jg do_calculation mov ax, 1 ret do_calculation: dec bl ; n = n-1 call proc_fact ; 递归计算fact(n-1) inc bl ; 恢复n的值 mul bl ; ax = ax * bl (即fact(n-1)*n) ret section .data prompt db "请输入一个1-9的数字:" prompt_len equ $ - prompt result_msg db "该数字的阶乘是:" result_msg_len equ $ - result_msg newline db 0xA ; 换行符 section .bss input_buf resb 1 ; 存储用户输入的字符 fact resb 1 ; 存储阶乘结果(ASCII码)
关键修改点说明
- 新增用户输入逻辑:使用
read系统调用读取用户输入的单个数字,将ASCII码转换为数值后传入阶乘函数。 - 通用化提示信息:替换原固定的3的阶乘提示,改为引导输入和通用结果提示。
- 结果输出优化:新增换行符,让输出格式更整洁。
- 保留递归核心:原有的递归阶乘计算逻辑完全保留,仅修改了输入源。
注意事项
- 目前代码仅支持1-9的数字输入,因为阶乘结果用1字节存储(ASCII码形式),超过9的阶乘结果会溢出(比如10!是362880,远大于单字节能存储的范围)。如果需要支持更大数字,需要修改结果存储方式为多字节,并实现多字节数字的ASCII转换和输出。
- 编译运行方式:使用
nasm -f elf32 factorial.asm -o factorial.o编译,再用ld -m elf_i386 factorial.o -o factorial链接,最后运行./factorial即可测试。
内容的提问来源于stack exchange,提问作者Kennex
相关产品推荐
相关产品推荐

