2011-03-21 29 views
0

可能重复:
assembly function flow装配功能流

汇编函数流

你好

我 “从地上规划了” 读一

如果你不知道这本书是什么,你仍然可以帮助我。

在这本书(第4章)中有两件事我不明白。

问:我不明白

  1. 什么"movl %ebx, -4(%ebp) #store当前结果”的。

  2. 又是什么 “在标记部分current result” 是指

下面的代码

稍微向上,在那里我小号

movl 8(%ebp), %ebx”,这意味着节省8(%ebp) to %ebx

但为什么我不明白的是

如果程序员想8(%EBP)保存到-4(%EBP)的原因,

为什么要8(%ebp)通过%ebx

是“movl 8(%ebp), -4(%ebp)”有什么不对?

或者是否有任何输入错误“movl 8(%ebp), %ebx%eax #put first argument”? (我觉得%EBX应该是%eax中或反之亦然)

#PURPOSE: Program to illustrate how functions work 

# This program will compute the value of 

# 2^3 + 5^2 

# 

#Everything in the main program is stored in registers, 

#so the data section doesn’t have anything. 

.section .data 

.section .text 

.globl _start 

_start: 

pushl $3 #push second argument 

pushl $2 #push first argument 

call power #call the function 

addl $8, %esp #move the stack pointer back 

pushl %eax #save the first answer before 

#calling the next function 

pushl $2 #push second argument 

pushl $5 #push first argument 



call power #call the function 

addl $8, %esp #move the stack pointer back 

popl %ebx #The second answer is already 

#in %eax. We saved the 

#first answer onto the stack, 

#so now we can just pop it 

#out into %ebx 

addl %eax, %ebx #add them together 

#the result is in %ebx 

movl $1, %eax #exit (%ebx is returned) 

int $0x80 

#PURPOSE: This function is used to compute 

# the value of a number raised to 

# a power. 

# 

#INPUT: First argument - the base number 

# Second argument - the power to 

# raise it to 

# 

#OUTPUT: Will give the result as a return value 

# 

#NOTES: The power must be 1 or greater 

# 

#VARIABLES: 

# %ebx - holds the base number 

# %ecx - holds the power 

# 

# -4(%ebp) - holds the current result 

# 

# %eax is used for temporary storage 

# 

.type power, @function 

power: 

pushl %ebp #save old base pointer 

movl %esp, %ebp #make stack pointer the base pointer 

subl $4, %esp #get room for our local storage 

########################################## 

movl 8(%ebp), %ebx #put first argument in %eax 

movl 12(%ebp), %ecx #put second argument in %ecx 

movl %ebx, -4(%ebp) #store current result 

########################################## 

power_loop_start: 

cmpl $1, %ecx #if the power is 1, we are done 

je end_power 

movl -4(%ebp), %eax #move the current result into %eax 

imull %ebx, %eax #multiply the current result by 

#the base number 

movl %eax, -4(%ebp) #store the current result 

decl %ecx #decrease the power 

jmp power_loop_start #run for the next power 

end_power: 

movl -4(%ebp), %eax #return value goes in %eax 

movl %ebp, %esp #restore the stack pointer 

popl %ebp #restore the base pointer 

ret 
+0

看起来是一个交叉帖子? HTTP://计算器。com/questions/5373134/assembly-function-flow – 2011-03-21 02:41:35

+0

哦对不起我不是故意做调皮的东西 我以为每个站点都有不同的访问者 – 2011-03-21 02:59:22

回答

0

是 “MOVL 8(%EBP)-4(%EBP)” akward的

是的。事实上,处理器无法做到这一点。处理器没有足够的内存读取/写入组件来执行相同命令中的读取和写入操作。因此,为了将一个值从一个内存点移动到另一个内存点,必须先将其复制到一个寄存器中。

在x86世界中,我知道它有可能以push的值来源,即pop它到达目的地。这将有效地将内存复制到内存中,但这是一种特殊情况,并且很可能比列出的内存慢。

+0

这个问题是一个确切的重复。不要打扰。 – karlphillip 2011-03-22 16:34:32