如何使用 NASM 找到 5 的阶乘?

问题描述

我刚刚开始使用 tutorialspoint 的在线 Asm 编译器 (https://www.tutorialspoint.com/compile_assembly_online.php) 学习 NASM。

我的第一个热身是编写一个计算 5 阶乘的代码。这是我的尝试:

section .text
    global _start      
_start:     
    mov eax,1      ;a = 1
    mov ebx,1      ;f = 1
    int 0x80        ;call kernel
    
l1:
    mul ebx        ; f = f*a
    inc eax        ; a++
    cmp eax,5     ; if a<=5
    jle l1         ; jump to l1

section .data
msg db 'Factorial 5 is:',0xa    
len equ $ - msg 

它没有打印出任何值,谁能给我提示一下问题出在哪里?谢谢。

解决方法

我不会使用 mul 操作。在汇编中,除非别无选择,否则您要坚持简单并避免除法、乘法和浮点数。

5! = 5 * 4 * 3 * 2 = 5 * 3 * 2 * 2 * 2 = (5 * 2 + 5 ) * 2 * 2 * 2

所以,计算这个:

5 << 1
ADD 5
<< 3

无需循环或乘法。如果您打算使用循环(或者如果这就是课程的重点),通常在汇编中您将与零进行比较,因此您倒计时,而不是倒计时。

在汇编中使用调试器是必不可少的。您的代码存在一些结构性问题,调试器会发现这些问题。您不能只使用在线系统。您必须在计算机上设置调试器。