2018-11-24

阶乘程序出现段错误

.section .data
        .section .text
        .globl _start
_start:
        pushl $8         #8入栈 sp=-4
        movl $1,%eax     #eax=1 
        call power       #调函数 sp=-8
        jmp exit
.type power, @function
power:
        pushl %ebp      #ebp入栈 sp=-12
        movl %esp,%ebp  #ebp=esp=-12
        subl $4,%esp    #esp-=4  =-16
        movl 8(%ebp),%ebx #ebx=8
        cmpl $1,%ebx      #if ebx==1
        je   power_end   #跳出
        subl 1,%ebx       #else : ebx-=1
        movl %ebx,-4(%ebp) #-16栈存入7
        call power         #调函数
        movl 12(%esp),%ecx
        addl %ecx,%eax
        addl $4,%esp
        popl %ebp
        ret

power_end:
        movl $1,%eax
        addl $4,%esp
        popl %ebp
        ret

exit:
        movl %eax,%ebx
        movl $1,%eax
        int $0x80

发现问题, subl 1,%ebx 中的1没有加$符号,加上后解决,得到36.
程序过于复杂,取代ecx为ebx后,加上注释为

.section .data
        .section .text
        .globl _start
_start:
        pushl $8         #8入栈 sp=-4
        movl $1,%eax     #eax=1 
        call power       #调函数 sp=-8
        jmp exit
.type power, @function
power:
        pushl %ebp      #ebp入栈 sp=-12
        movl %esp,%ebp  #ebp=esp=-12
        subl $4,%esp    #esp-=4  =-16
        movl 8(%ebp),%ebx #ebx=8
        cmpl $1,%ebx      #if ebx==1
        je   power_end   #跳出
        subl $1,%ebx       #else : ebx-=1
        movl %ebx,-4(%ebp) #-16栈存入7
        call power         #调函数
        movl 12(%esp),%ebx #从子函数跳出后,sp在dsp的-4位置,0(%esp)保存着子函数阶乘的数,12(%esp)是本阶
乘需要用的数。
        addl %ebx,%eax     #将本阶段数与递归回来的数相加
        addl $4,%esp       #esp归位
        popl %ebp          #弹出ebp
        ret                #跳出函数,返回值在eax中

power_end:
        movl $1,%eax
        addl $4,%esp
        popl %ebp
        ret

exit:
        movl %eax,%ebx
        movl $1,%eax
        int $0x80

迭代计算有误,应该是120,测试结果为14.
.section .data
.section .text
.globl _start
_start:
movl 1,%eax pushl %eax movl5,%ecx
pushl %ecx
loop:
cmpl $1, %ecx
je exit
call power
jmp loop
.type power, @function
power:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%ecx
movl 12(%ebp),%eax
decl %ecx
movl %ecx,8(%ebp)
incl %eax
imull 12(%ebp),%eax
mov %eax,12(%ebp)

power_exit:
popl %ebp
ret
exit:
movl %eax,%ebx
addl 8,%esp movl1,%eax
int $0x80
更改为如下,解决,设计上应该有一个自增的用于阶乘的参数,加上一个自减的用于计数的参数,再有一个记录前期所有阶乘结果的参数。三个参数都是迭代所需。
14那个结果原因在于上面代码计算出的结果是42*43,结果的二进制是0111 0000 1110 ,ebx带着这个值从程序中返回,但是返回的值需要小于255,也就是只收集一个字节,一个字节只有八个比特位,由于机器是小端的,所以上面的二进制在内存中是0110 0000 1110 按这个顺序读一个字节,恰好是0110 0000 ,cpu读这个内存得到的数其实是 0000 0110,也就是14,所以解决。

.section .data
        .section .text
        .globl _start
_start:
        movl $1,%edx
        pushl %edx
        movl $5,%ecx
        pushl %ecx
        movl $1,%eax
        pushl %eax
loop:
        cmpl $1, %ecx
        je exit
        call power
        jmp loop
.type power, @function
power:
        pushl %ebp
        movl %esp,%ebp
        movl 8(%ebp),%eax
        movl 12(%ebp),%ecx
        movl 16(%ebp),%edx
        decl %ecx
        movl %ecx,12(%ebp)
        incl %edx
        movl %edx,16(%ebp)
        imull %edx,%eax
        mov %eax,8(%ebp)

power_exit:
        popl %ebp
        ret
exit:
        movl %eax,%ebx
        addl $8,%esp
        movl $1,%eax
        int $0x80

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 最近看了下 PyTorch 的损失函数文档,整理了下自己的理解,重新格式化了公式如下,以便以后查阅。 值得注意的是...
    云雨惊袭明月夜阅读 1,039评论 0 0
  • 首先非常感恩公司推荐这次学习的机会,参加了加法与减法读书会,虽然没有说一直全身心都投入近来,因为有其他的事务要去处...
    叶君桦jjiiiiiih阅读 493评论 0 0
  • 在本周李笑来老师的专栏里,重新说明了把握机会,投资自己。实在感到是感到愧疚,我就像李笑来老师说的很多时候停留在“特...
    弋衍阅读 471评论 0 0
  • 宋美雪从未如此地颓丧过。用许伊人的话来说,她就是衰,那种出了精神病院就被车撞死的衰。宋美雪气鼓鼓地瞪着坐在窗台前看...
    情书格阅读 314评论 0 0
  • 2018.5.8日 星期二 晴 4篇 今天是自己的庆祝的一天,因为我首次考科一,顺利通过,儿子月...
    d7db246e7581阅读 273评论 2 2