我写了一个简单的程序,它将一个预定义的数字转换为预定义的权力并返回结果。它在NASM汇编中,用于Linux。我一直试图让我的头在如何使用堆栈来传递函数的变量,并希望确保我做到了这一点。它返回正确的数字,但我不知道它是否正确:这是将变量传递给堆栈的正确方法吗?
section .text
global _start
_start:
push dword 3 ;(power)
push dword 2 ;(num)
call power
mov ebx, eax
mov eax, 1
int 0x80
power:
push ebp
mov ebp, esp
sub esp, 8 ;reserve space for two local vars
push dword [ebp+8]
pop dword [ebp-4] ;store original num as a local var
push dword [ebp+12]
pop dword [ebp-8] ;store power in a local counter var
dec dword [ebp-8]
mov eax, [ebp-4] ;store original num in eax (current val)
jmp power_loop
power_loop:
imul eax, dword [ebp-4] ;multiply current val by original num
dec dword [ebp-8] ;decrement counter
cmp dword [ebp-8], 0
jne power_loop
mov esp, ebp ;restore stack pointer
pop ebp
ret
任何意见将不胜感激!
如果我不准问,什么是写汇编语言,看起来尽可能像它出来一个C编译器的点(其优化关闭,在那个)?使用寄存器! – 2011-04-06 03:18:05
我知道我本来可以使用寄存器,但我想学会装配以获得乐趣 - 这只是一个练习,学习如何使用堆栈传递参数。 – user693861 2011-04-07 04:16:06
使用堆栈传递参数是有些可以接受的(当与C代码等接口时是必需的),但在完全不必要的情况下在堆栈上创建局部变量是一个完全不同的故事(无论如何)。 – 2011-04-07 04:18:16