问题描述
我刚刚开始使用 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
无需循环或乘法。如果您打算使用循环(或者如果这就是课程的重点),通常在汇编中您将与零进行比较,因此您倒计时,而不是倒计时。
在汇编中使用调试器是必不可少的。您的代码存在一些结构性问题,调试器会发现这些问题。您不能只使用在线系统。您必须在计算机上设置调试器。