当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : GNU as 汇编问题求助!
帖子发表于 : 2009-08-19 23:55 

注册: 2009-05-11 17:05
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
这个程序的目的是:对于给出的三组数据,求出最大值。
应用的方法:编写一个子函数---max,对于每组数据分别调用max子函数,求出三个数值,在选出三个数中的最大者。
但是,编译,链接过程都没有报错,运行时一直出现“段错误139”,
用gdb时显示为:子函数中的“movl (%ebx),%ecx“ 和 ”movl (%ebx,%edi,4),%eax“ 出现段错误,
求助问题的解决方法。

代码:
#PURPOSE: Find the maximum number in these three data items,
#         for every item we will call MAX to find the maximum one
#        in THIS item.
#
#VARIABLE: %edx - Holds the MAXIMUM data of the three items.
#
#The following memory locations are used:
#
#data_itemN - contains the item data. 
#
#

.section .data
    data_item1:             
        .long 3,67,34,222,45,75,1,34,44,33,22,11,66,4
   data_item2:
      .long 98,23,43,54,23,67,8,50,98,74,39,26,36,7
   data_item3:
      .long 95,90,77,34,75,58,39,34,85,34,45,65,45,9
   data_items_end:
       .equ DATA_SIZE1,data_item2-data_item1
      .equ DATA_SIZE2,data_item3-data_item2
      .equ DATA_SIZE3,data_items_end-data_item3


.section .text
.globl _start
_start:
    movl  $data_item1,%ecx
   pushl %ecx
   pushl $DATA_SIZE1
   call max
   movl %eax,%edx            # %edx holds the maximum
   addl $8,%esp              # put %esp back

   movl $data_item2,%ecx
   pushl %ecx
   pushl $DATA_SIZE2
   call max
   addl $8,%esp              # set %esp back
    cmpl %edx,%eax
   jle label
    movl %eax,%edx
   
label:
   movl $data_item3,%ecx
   pushl %ecx
   pushl $DATA_SIZE3
   call max
   addl $8,%esp               # set %esp back
    cmpl %edx,%eax
   jle end
   movl %eax,%edx

end:
    movl %edx,%ebx
   movl $1,%eax
   int $0x80


#PURPOSE:This program finds the maximum number of a set of data items.
#
#VARIABLES:The registers have the following uses:
#
# %edi - Hold the index of the data item being examined
# %esi - Hold that how much ".long" datas there is
# %ecx - Largest data item found now
# %eax - Current data item
# %ebx - The addr of the data
#
.type max,@function
max:
    pushl %ebp
   movl %esp,%ebp
   pushl %edx                   # save %edx, beacuse it would be used in the MAIN procedure

   xor  %edx,%edx
   movl 12(%ebp),%eax
   movl $4,%ebx
   idivl %ebx
   movl %eax,%esi               #the numbers of data is in %esi

    movl $0,%edi
   movl 16(%ebp),%ebx
[color=#FF0000]   movl (%ebx),%ecx[/color]

start_loop:
    cmpl %edi,%esi
   je exit_loop
   incl %edi
[color=#FF0000]   movl (%ebx,%edi,4),%eax[/color]
   cmpl %ecx,%eax
   jle start_loop

   movl %eax,%ecx
   jmp start_loop

exit_loop:
   popl %edx                      # restore %edx
   movl %ecx,%eax

   movl %ebp,%esp
   popl %ebp
   ret


页首
 用户资料  
 
2 楼 
 文章标题 : Re: GNU as 汇编问题求助!
帖子发表于 : 2009-08-20 12:52 

注册: 2009-05-11 17:05
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
问题已解决:自己把错误找到了! :em06 :em11


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译