【发布时间】:2021-09-11 07:16:01
【问题描述】:
我刚刚开始使用 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
它没有打印出任何值,谁能给我提示一下问题出在哪里?谢谢。
【问题讨论】:
-
你知道 EAX=1 是 SYS_exit,对吧?所以
int 0x80只是退出你的程序。使用调试器单步执行您的代码。当然,如果您不进行任何write系统调用或调用 printf 或其他任何东西,它也不会打印任何内容。 -
由于那个在线IDE好像没有调试器,所以学习asm没用。不得不向 Stack Overflow 询问有关使用调试器单步执行时完全显而易见的事情的问题是浪费您自己的时间(以及其他所有人的时间)。 IIRC,onlinegdb.com 有一个 asm 模式,但我忘记了它是否有 NASM 或只是 GAS,如果它支持 32 位模式而不是本机 64 位 x86-64,我忘记了 IDK。 Linux 是免费的,NASM + 文本模式 GDB 非常轻量级;本地安装应该很有意义。
-
可以
mov eax,5*4*3*2- 可能会更快。 -
mul ebx ; f = f*a是错误的,如果你考虑ebx中的f和eax中的a。它实际上做的是a = f * a。 (当然还要将上半部分写成edx。)如果你想乘以ebx,请使用imul ebx, eax。
标签: assembly x86 nasm factorial