版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-课程实验报告课程名称:计算机系统原理实验实验名称: Bomb Lab专业班级:*:*:完成时间: 2017.4.19 1、 实验目的熟悉汇编程序,学习gdb调试工具,熟悉并掌握函数调用过程中的栈帧构造的变化。2、 实验环境个人PC,Linu*发行版本,终端,gdb调试工具。3、 实验要求1.本次实验为熟悉汇编程序及其调试方法的实验。2.实验容包含2个文件bomb可执行文件和bomb.cc源文件。3.使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。4.分析汇编代码,找到在每个phase程序段中,引导程序跳转到e*plode_bomb程序段的地方,并分析其成功跳转的条件,以
2、此为突破口寻找应该在命令行输入何种字符通关。5.本实验一共有7个关卡,包括6个普通关卡和1个隐藏关卡。要求至少通过6个普通关卡。4、 实验容及操作步骤(1) 准备过程1. 解压文件夹得到bomb,bomb.c,README-bomblab.t*t以及实验根本容与要求.t*t等文档。查看实验根本容与要求.t*t了解实验容与要求后翻开bomb.c文件,编译发现不能通过,代码不完整,所以bomb.c文件只能用来作为参考。查看bomb.c文件发现控制密码正确的6个函数分别为phase_1,phase_2,phase_3,phase_4,phase_5,phase_6,因此可以对bomb文件反汇编得到汇
3、编文本,结合汇编文本与bomb.c文本进一步分析。2. 进入Ubuntu,将bom和bomb.c文档复制到主文件目录下,ctrl+alt+t翻开终端,通过objdump -d bomb bomb.s命令将可执行文件反汇编成bomb.s文件,并且可以通过gdb -q bomb进展调试。3. 将bomb.c复制成文本后翻开bomb.c查看汇编代码并进一步分析。(2) 关卡分析1. phase_1phase_1汇编代码及注释如下:08048f61 : 8048f61:55 push %ebp 8048f62:89 e5 mov %esp,%ebp 8048f64:83 ec 18 sub $0*18
4、,%esp*开辟一个24位的栈空间 8048f67:c7 44 24 04 5c a1 04 movl $0*804a15c,0*4(%esp)*将0*804a15c存到%eap+4的位置,*/s 0*804a15c 得到 We have to stand with our North Korean allies. 8048f6e:08 8048f6f:8b 45 08 mov 0*8(%ebp),%ea* 8048f72:89 04 24 mov %ea*,(%esp)*将%ebp+8处的值存到%esp 8048f75:e8 31 00 00 00 call 8048fab 8048f7a:
5、85 c0 test %ea*,%ea* 8048f7c:74 05 je 8048f83 *%ea*=0则跳出函数,否则跳到爆炸函数,可以看出,调用函数后如果两个字符串相等的话最后%ea*会等于0 8048f7e:e8 4e 01 00 00 call 80490d1 8048f83:c9 leave 8048f84:c3 ret 8048f85:90 nop 8048f86:90 nop 8048f87:90 nop 8048f88:90 nop 8048f89:90 nop 8048f8a:90 nop 8048f8b:90 nop 8048f8c:90 nop 8048f8d:90 n
6、op 8048f8e:90 nop 8048f8f:90 nop思路与分析:通过call 8048fab 我们可以推断要求输入的是一串字符串,movl $0*804a15c,0*4(%esp)将地址0*804a15c存到%esp+4的位置,mov 0*8(%ebp),%ea*和mov %ea*,(%esp)将输入的字符串存到%esp中,call 8048fab 调用字符串比拟函数,通过比拟上面位置参数%esp+4与%esp对应的字符串是否相等,将返回值存到%ea*中,test %ea*,%ea*,je 8048f83 ,call 80490d1 ,判断如果两个字符串不相等则爆炸。由上面分析可知
7、地址0*804a15c中存着正确的字符串,我们只要输入一样的字符串就可以通过关卡。进入gdb,通过命令*/s 0*804a15c查看该字符串为:We have to stand with our North Korean allies.所以phase_1的通关密码为:We have to stand with our North Korean allies.通过 r 命令运行程序,输入该字符串则通过第一关:结论与心得:通过分析汇编代码,通过字符串比拟函数可以推测输入的是一串字符串,通过*/s以字符串的形式查看地址0*804a15c所对应的值,运行程序后输入该字符串即可通过关卡。字符串比拟函数主
8、要是通过将两个字符串进展比拟,将结果存到%ea*中,最后判断%ea*的值。第一关相比照拟简单,也比拟好理解。2. phase_2phase_2汇编代码及注释如下:08048d6a : 8048d6a:55 push %ebp 8048d6b:89 e5 mov %esp,%ebp 8048d6d:56 push %esi 8048d6e:53 push %eb* 8048d6f:83 ec 30 sub $0*30,%esp 8048d72:8d 45 e0 lea -0*20(%ebp),%ea* 8048d75:89 44 24 04 mov %ea*,0*4(%esp)*将第一个数字的地
9、址放到%esp+4的位置 8048d79:8b 45 08 mov 0*8(%ebp),%ea* 8048d7c:89 04 24 mov %ea*,(%esp) 8048d7f:e8 87 03 00 00 call 804910b *读取六个数字 8048d84:83 7d e0 00 cmpl $0*0,-0*20(%ebp) 8048d88:75 06 jne 8048d90 *0和-0*20(%ebp)比拟,不相等就爆炸 8048d8a:83 7d e4 01 cmpl $0*1,-0*1c(%ebp) 8048d8e:74 05 je 8048d95 *1和-0*1c(%ebp)比
10、拟,相等就跳过爆炸 8048d90:e8 3c 03 00 00 call 80490d1 8048d95:8d 5d e8 lea -0*18(%ebp),%eb*将第三个数字的地址传到%eb*中,即现在%eb*中存着第三个数字的地址 8048d98:8d 75 f8 lea -0*8(%ebp),%esi*将%eb*的地址传到%esi,%esi用于待会的判断完毕条件,%eb*存的地址一直循环加4,循环直到%eb*的下一个地址是%esi就完毕】 8048d9b:8b 43 fc mov -0*4(%eb*),%ea*将第二个数放到%ea*存放器中 8048d9e:03 43 f8 add -
11、0*8(%eb*),%ea*计算第二个数和第一个数的和 8048da1:39 03 cmp %ea*,(%eb*) 8048da3:74 05 je 8048daa *前两个数的和与第三个数相比拟,相等则跳过炸弹 8048da5:e8 27 03 00 00 call 80490d1 8048daa:83 c3 04 add $0*4,%eb*将%eb*的地址加4,现在%eb*中存着第四个数字的地址 8048dad:39 f3 cmp %esi,%eb* 8048daf:75 ea jne 8048d9b *比拟现在%esi和%eb*里面的值是否相等,不相等则循环,否则完毕。其实两个存放器中存
12、的都是地址,为的是保证只输入6个数,因为当输入第7个数时,%eb*=%esi 8048db1:83 c4 30 add $0*30,%esp 8048db4:5b pop %eb* 8048db5:5e pop %esi 8048db6:5d pop %ebp*释放栈帧 8048db7:c3 ret思路与分析:通过call 804910b 我们可以推断出应该是要输入6个数字。通过对汇编代码进展分析知道-0*20(%ebp)存着第一个数字,-0*1c(%ebp)存着第二个数字,依次类推。通过cmpl $0*0,-0*20(%ebp),jne 8048d90 和cmpl $0*1,-0*1c(%e
13、bp),je 8048d95 知道第一个数字必须是0,第二个数字必须是1,否则就爆炸。命令lea -0*18(%ebp),%eb*初始化存放器%eb*的值,将第三个数字的地址传到%eb*中.lea -0*8(%ebp),%esi将%eb*的地址传到%esi,%esi用于待会的判断完毕条件,%eb*存的地址一直循环加4,循环直到%eb*的下一个地址是%esi就完毕,mov -0*4(%eb*),%ea*将第二个数放到%ea*存放器中,add -0*8(%eb*),%ea*计算第二个数和第一个数的和,cmp %ea*,(%eb*),je 8048daa 前两个数的和与第三个数相比拟,相等则跳过炸弹
14、。add $0*4,%eb*将%eb*的地址加4,现在%eb*中存着第四个数字的地址,之后%eb*一直加4,知道循环完6个数字。通过上面的分析知道,输入的前两个数字为0和1,后面的数字等于前面两个数字的和。所以,这六个数字为Fibonacci数列的前六项。为0 1 1 2 3 5。输入这6个数字可通过phase_2.结论与心得:第二关需要弄懂栈帧构造的变化,通过add $0*4,%eb*将%eb*的地址加4,然后判断前两个数字的和与当前位置的数是否相等。结合第一个和第二个数字是0和1知道结果为0 1 1 2 3 5。3. phase_3phase_3汇编代码及注释如下:08048ea1 : 8
15、048ea1:55 push %ebp 8048ea2:89 e5 mov %esp,%ebp 8048ea4:83 ec 28 sub $0*28,%esp 8048ea7:8d 45 f0 lea -0*10(%ebp),%ea*第二个数的位置 8048eaa:89 44 24 0c mov %ea*,0*c(%esp) 8048eae:8d 45 f4 lea -0*c(%ebp),%ea*第一个数的位置 8048eb1:89 44 24 08 mov %ea*,0*8(%esp) 8048eb5:c7 44 24 04 3e a2 04 movl $0*804a23e,0*4(%esp
16、)*通过查看0*804a23e的容,即*/s 0*804a23e,显示为%d %d,提示输入两个整型数 8048ebc:08 8048ebd:8b 45 08 mov 0*8(%ebp),%ea* 8048ec0:89 04 24 mov %ea*,(%esp) 8048ec3:e8 78 f9 ff ff call 8048840 *isoc99标准输入变量,应该是把输入的数字个数存在%ea*里 8048ec8:83 f8 01 cmp $0*1,%ea* 8048ecb:7f 05 jg 8048ed2 *至少输入2个数,否则爆炸 8048ecd:e8 ff 01 00 00 call 8
17、0490d1 8048ed2:83 7d f4 07 cmpl $0*7,-0*c(%ebp) 8048ed6:77 6b ja 8048f43 *第1个数大于7爆炸,所以,第一个数需要小于等于7 8048ed8:8b 45 f4 mov -0*c(%ebp),%ea*将第一个数存到%ea*中 8048edb:ff 24 85 a0 a1 04 08 jmp *0*804a1a0(,%ea*,4)*跳转至0*804a1a0+4*%ea*存放第一个数中的容所指的行数p/* *0*804a1a0+4*%ea* 8048ee2:b8 00 00 00 00 mov $0*0,%ea* 8048ee7
18、:eb 53 jmp 8048f3c 8048ee9:b8 00 00 00 00 mov $0*0,%ea* 8048eee:66 90 *chg %a*,%a* 8048ef0:eb 45 jmp 8048f37 8048ef2:b8 00 00 00 00 mov $0*0,%ea*第一个数等于5的时候跳到这里 8048ef7:eb 39 jmp 8048f32 8048ef9:b8 00 00 00 00 mov $0*0,%ea*第一个数等于4的时候跳到这里 8048efe:66 90 *chg %a*,%a* 8048f00:eb 2b jmp 8048f2d 8048f02:b8
19、 00 00 00 00 mov $0*0,%ea*第一个数等于4的时候跳到这里 8048f07:eb 1f jmp 8048f28 8048f09:b8 00 00 00 00 mov $0*0,%ea*第一个数等于2的时候跳到这里 8048f0e:66 90 *chg %a*,%a* 8048f10:eb 11 jmp 8048f23 8048f12:b8 14 03 00 00 mov $0*314,%ea*第一个数为0的时候跳到这里p/* *0*804a1a0首先*=778,最后第二个数等于147 8048f17:eb 05 jmp 8048f1e *跳转到 8048f1e 这一行 8
20、048f19:b8 00 00 00 00 mov $0*0,%ea*第一个数等于1的时候跳到这里 8048f1e:2d 5a 03 00 00 sub $0*35a,%ea*=*-858 8048f23:05 ef 02 00 00 add $0*2ef,%ea*=*+751 8048f28:2d 16 02 00 00 sub $0*216,%ea*=*-534 8048f2d:05 16 02 00 00 add $0*216,%ea*=*+534 8048f32:2d 16 02 00 00 sub $0*216,%ea*=*-534 8048f37:05 16 02 00 00 ad
21、d $0*216,%ea*=*+534 8048f3c:2d 16 02 00 00 sub $0*216,%ea*=*-534 8048f41:eb 0a jmp 8048f4d *跳转到 8048f4d 这一行 8048f43:e8 89 01 00 00 call 80490d1 8048f48:b8 00 00 00 00 mov $0*0,%ea* 8048f4d:83 7d f4 05 cmpl $0*5,-0*c(%ebp) 8048f51:7f 05 jg 8048f58 *第一个数字需要小于等于5,否则爆炸 8048f53:3b 45 f0 cmp -0*10(%ebp),%
22、ea* 8048f56:74 05 je 8048f5d *0,147; 1 -641;2,217; 3,-534; 4,0; 5,-534 8048f58:e8 74 01 00 00 call 80490d1 8048f5d:c9 leave 8048f5e:66 90 *chg %a*,%a* 8048f60:c3 ret思路与分析:观察到指令movl $0*804a23e,0*4(%esp),通过查看0*804a23e的容,即*/s 0*804a23e,显示为%d %d,提示输入两个整型数。call 8048840 ,调用isoc99标准输入变量,是把输入的数字个数存在%ea*里返回。
23、通过cmp $0*1,%ea*和jg 8048ed2 知道至少输入2个数,否则爆炸。通过cmpl $0*7,-0*c(%ebp)和ja 8048f43 知道第一个数字小于等于7,由cmpl $0*5,-0*c(%ebp)和jg 8048f58 知道输入的数字要小于等于5,所以输入的数字围为0-5。jmp *0*804a1a0(,%ea*,4)为switch分支构造,%ea*存着输入的数字的值,当输入的数组是0的时候,查看*0*804a1a0的值,得到$1 = 0*8048f12,即跳转到0*8048f12处。当输入的数字为1-5时依次类推。得到的地址分别为:cmp -0*10(%ebp),%e
24、a*和je 8048f5d 即为判断经过一系列运算后求的值是否与正确的值相等。通过分析汇编代码,我们可以知道当输入不同的*值,等到的y值如下:当*=0时,y=788-858+751-534+534-534+534-534=147 当*=1时,y=-858+751-534+534-534+534-534=-641当*=2时,y=751-534+534-534+534-534=217 当*=3时,*=-534+534-534+534-534=-534 当*=4时,*=534-534+534-534=0 当*=5时,*=-534+534-534=-534所以可以输入六组数据:0 147;1 -641
25、;2 217;3 -534;4 0;5 -534。随便输入一组都能通过炸弹。结论与心得:第三关主要用到了switch分支构造,根据输如的不同数字跳转到不同位置进展不同的运算,最后得到结果。首先分析输入数字的围,然后通过判断跳转的位置来准确计算。4.phase_4phase_4汇编代码及注释如下:08048e2e : 8048e2e:55 push %ebp 8048e2f:89 e5 mov %esp,%ebp 8048e31:83 ec 28 sub $0*28,%esp*开辟栈空间 8048e34:8d 45 f0 lea -0*10(%ebp),%ea*第二个数字 8048e37:89
26、44 24 0c mov %ea*,0*c(%esp) 8048e3b:8d 45 f4 lea -0*c(%ebp),%ea*第一个数字 8048e3e:89 44 24 08 mov %ea*,0*8(%esp) 8048e42:c7 44 24 04 3e a2 04 movl $0*804a23e,0*4(%esp)*输入*/s 0*804a23e 显示为%d %d,提示输入两个整型数字 8048e49:08 8048e4a:8b 45 08 mov 0*8(%ebp),%ea* 8048e4d:89 04 24 mov %ea*,(%esp) 8048e50:e8 eb f9 ff
27、ff call 8048840 *标准输入变量,将输入的数字个数存在%ea*中 8048e55:83 f8 02 cmp $0*2,%ea* 8048e58:75 0c jne 8048e66 *要求输入2个数字,即输入的数字个数不等于2则爆炸 8048e5a:8b 45 f4 mov -0*c(%ebp),%ea*将第一个数放到%ea*中 8048e5d:85 c0 test %ea*,%ea* 8048e5f:78 05 js 8048e66 *判断第一个数,如果是负数就爆炸,所以需要%ea*=0 8048e61:83 f8 0e cmp $0*e,%ea* 8048e64:7e 05 j
28、le 8048e6b *比拟第一个数和14(0*e)的大小,如果%ea*=14,则继续执行,否则爆炸 8048e66:e8 66 02 00 00 call 80490d1 8048e6b:c7 44 24 08 0e 00 00 movl $0*e,0*8(%esp)*将0*e存到%esp+8 8048e72:00 8048e73:c7 44 24 04 00 00 00 movl $0*0,0*4(%esp)*将0*0存到%esp+4 8048e7a:00 8048e7b:8b 45 f4 mov -0*c(%ebp),%ea* 8048e7e:89 04 24 mov %ea*,(%es
29、p)*将第一个数存到%esp 8048e81:e8 da fc ff ff call 8048b60 *调用func4函数(递归函数) 8048e86:83 f8 01 cmp $0*1,%ea*函数的返回值y存放在%ea*存放器中 8048e89:75 06 jne 8048e91 *y要等于1,否则爆炸 8048e8b:83 7d f0 01 cmpl $0*1,-0*10(%ebp) 8048e8f:74 0c je 8048e9d *第二个数要等于1,否则爆炸 8048e91:8d b4 26 00 00 00 00 lea 0*0(%esi,%eiz,1),%esi 8048e98:
30、e8 34 02 00 00 call 80490d1 8048e9d:c9 leave 8048e9e:66 90 *chg %a*,%a* 8048ea0:c3 ret call 8048b60 知道要调用func4函数。func4汇编代码及注释如下:08048b60 : 8048b60:55 push %ebp 8048b61:89 e5 mov %esp,%ebp 8048b63:83 ec 18 sub $0*18,%esp*建立一个栈帧 8048b66:89 5d f8 mov %eb*,-0*8(%ebp) 8048b69:89 75 fc mov %esi,-0*4(%ebp)
31、 8048b6c:8b 55 08 mov 0*8(%ebp),%ed*%ed*-* 8048b6f:8b 45 0c mov 0*c(%ebp),%ea*%ea*-y=0*0=0 8048b72:8b 5d 10 mov 0*10(%ebp),%eb*%eb*-z=0*e=14func4(*,y,z) 8048b75:89 d9 mov %eb*,%ec*计算临时变量t的过程,*t=z 8048b77:29 c1 sub %ea*,%ec*t=z-y 8048b79:89 ce mov %ec*,%esi*t=z-y 8048b7b:c1 ee 1f shr $0*1f,%esi*t=(z-
32、y)31,逻辑右移31位 8048b7e:8d 0c 0e lea (%esi,%ec*,1),%ec*t=(z-y)31+(z-y) 8048b81:d1 f9 sar %ec*t=(z-y)31+(z-y)1 8048b83:01 c1 add %ea*,%ec*t=(z-y)31+(z-y)/2+y=(1431+14)/2+0=7 8048b85:39 d1 cmp %ed*,%ec*将7和*第一个数比拟,即7-* 8048b87:7e 17 jle 8048ba0 *当7*) 8048b8c:89 4c 24 08 mov %ec*,0*8(%esp)*将t-1移到0*8(%esp),
33、z=t-1 8048b90:89 44 24 04 mov %ea*,0*4(%esp)*y 8048b94:89 14 24 mov %ed*,(%esp)* 8048b97:e8 c4 ff ff ff call 8048b60 *递归 8048b9c:01 c0 add %ea*,%ea*y=2*y,将结果存放到%ea*中 8048b9e:eb 20 jmp 8048bc0 *完毕 8048ba0:b8 00 00 00 00 mov $0*0,%ea*if(*=7)时就跳转到这里,此时令y=0 8048ba5:39 d1 cmp %ed*,%ec* 8048ba7:7d 17 jge
34、8048bc0 *如果t=*(在这种情况下只能*=t),则跳转到8048bc0,否则继续执行 8048ba9:89 5c 24 08 mov %eb*,0*8(%esp)*z 8048bad:83 c1 01 add $0*1,%ec*y=t+1 8048bb0:89 4c 24 04 mov %ec*,0*4(%esp)y=t+1 8048bb4:89 14 24 mov %ed*,(%esp)* 8048bb7:e8 a4 ff ff ff call 8048b60 *递归 8048bbc:8d 44 00 01 lea 0*1(%ea*,%ea*,1),%ea*y=z*y+1,将结果存到
35、%ea*中 8048bc0:8b 5d f8 mov -0*8(%ebp),%eb*if(t=*)跳转到这里 8048bc3:8b 75 fc mov -0*4(%ebp),%esi 8048bc6:89 ec mov %ebp,%esp 8048bc8:5d pop %ebp 8048bc9:c3 ret思路与分析:首先分析phase_4汇编代码。movl $0*804a23e,0*4(%esp)输入*/s 0*804a23e 显示为%d %d,提示输入两个整型数字。call 8048840 ,cmp $0*2,%ea*,jne 8048e66 任然要求输入2个数字。通过mov -0*c(%
36、ebp),%ea*,test %ea*,%ea*,js 8048e66 知道第一个数为非负数。由cmp $0*e,%ea*和jle 8048e6b 又可以知道第一个数字要小于等于14。之后分析func4函数,分别用%esp,0*4(%esp),%0*8(%esp)传递三个参数,设为*,y,z。参数y存储在存放器%ea*中并作为最终的返回值,最终结果为1,也就是n的值;参数*和z存储于存放器%ed*和%eb*中,并通堆栈指针来保存或改变配合其他指令。在func4中进一步缩小了第一个数字的围。现在需要第一个数字的围为7-14。通过分析func4汇编代码,可以得到如下的c代码:*include*in
37、t *,y,z,ret;*int func4()*int t=(z-y)31+(z-y)/2+y;*if(t*)*z=t-1;*func4();*y=z*y;*else*y=0;*if(t=*)*return y;*y=t+1;*func4();*y=2*y+1;*int main()*for(*=0;*=0*e;*+)*y=0;*z=0*e;*ret=func4();*if(ret=1)*printf(m=%d,n=%dn,*,ret)*return 0;* 第二个数必须为1。经过分析可以有三组数。分别是:8 1;9 1;11 1。任意输入一组数就能通过关卡。结论与心得:这一关中在函数里调用
38、了另外一个函数func4,func4函数中运用到了线性递归。通过分析汇编代码可以写出相应的c代码,通过分析第一个数围在7-14,第二个数必须为1,结合c代码可以得出结果。5.phase_5phase_5汇编代码及注释如下:08048db8 : 8048db8:55 push %ebp 8048db9:89 e5 mov %esp,%ebp 8048dbb:56 push %esi 8048dbc:53 push %eb* 8048dbd:83 ec 20 sub $0*20,%esp*开辟栈空间 8048dc0:8d 45 f0 lea -0*10(%ebp),%ea* 8048dc3:89
39、44 24 0c mov %ea*,0*c(%esp)*第二个数 8048dc7:8d 45 f4 lea -0*c(%ebp),%ea* 8048dca:89 44 24 08 mov %ea*,0*8(%esp)*第一个数 8048dce:c7 44 24 04 3e a2 04 movl $0*804a23e,0*4(%esp)*输入*/s 0*804a23e 显示为%d %d,提示输入两个整型数字 8048dd5:08 8048dd6:8b 45 08 mov 0*8(%ebp),%ea* 8048dd9:89 04 24 mov %ea*,(%esp) 8048ddc:e8 5f f
40、a ff ff call 8048840 *将输入的数字个数返回到%ea*中 8048de1:83 f8 01 cmp $0*1,%ea* 8048de4:7f 05 jg 8048deb *假设输入的数字个数大于1则跳转,否则爆炸,所以至少输入两个数字 8048de6:e8 e6 02 00 00 call 80490d1 8048deb:8b 45 f4 mov -0*c(%ebp),%ea* 8048dee:83 e0 0f and $0*f,%ea*第一个数与 0*f,这个操作可以只保存第一个数的二进制后四位0与任何数都为0 8048df1:89 45 f4 mov %ea*,-0*c
41、(%ebp)*经过上面的操作后再把第一个数放回原来的位置只保存二进制表示的后四位 8048df4:83 f8 0f cmp $0*f,%ea* 8048df7:74 29 je 8048e22 *比拟,如果第一个数和0*f1111相等则爆炸,说明第一个数的二进制后四位不能为1111,否则爆炸 8048df9:b9 00 00 00 00 mov $0*0,%ec*%ec*=0;用来累加%ea*,初始化为0 8048dfe:ba 00 00 00 00 mov $0*0,%ed*%ed*=0;循环次数,初始化为0 8048e03:bb c0 a1 04 08 mov $0*804a1c0,%eb*p *0*804a1c0=10,这个地址为数组的首地址,求的值为第一个元素的值,求数组元素:p *0*804a1c016=10, 2, 14, 7, 8, 12, 15, 11, 0, 4, 1, 13, 3, 9, 6, 5 8048e08:83 c2 01 add $0*1,%ed*%ed*=1,循环从这里开场 8048e0b:8b 04 83 mov (%eb*,%ea*,4),%ea*%ea*=(%eb*+4*%ea*)=(0*804a1c0+4*%ea*);%ea*用来保存求出的数组中的*个值 8048e0e:01 c1 add %ea*,%ec*%ec*=%ec*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB 31892-2026伞类产品安全通用技术要求
- 长治医学院《锅炉原理资料》2025-2026学年期末试卷
- 阳泉职业技术学院《进出口贸易实务》2025-2026学年期末试卷
- 长春工程学院《货币金融》2025-2026学年期末试卷
- 阳泉职业技术学院《融合新闻学》2025-2026学年期末试卷
- 长春医学高等专科学校《卫生经济学》2025-2026学年期末试卷
- 中国矿业大学徐海学院《新闻编辑》2025-2026学年期末试卷
- 长春东方职业学院《海商法》2025-2026学年期末试卷
- 伊春职业学院《国际贸易理论》2025-2026学年期末试卷
- 长春师范高等专科学校《模拟导游》2025-2026学年期末试卷
- 贵州中医药大学时珍学院《C#程序语言设计》2023-2024学年第一学期期末试卷
- 语言运用与综合性学习-2025年中考语文专项复习(湖北专用)(原题版)
- 法院委托评估价格异议申请书
- 人工挖孔桩专项施工方案(水磨钻施工)
- 卫生事业管理学:第十一章 社会健康资源管理
- ASTM-D3359-(附著力测试标准)-中文版
- DBJ15-22-2021-T 锤击式预应力混凝土管桩工程技术规程(广东省)
- 混凝土中氯离子含量检测技术规程
- 监理大纲工程监理方案技术标投标方案
- DL-T5706-2014火力发电工程施工组织设计导则
- 《跟上兔子》绘本四年级第1季Can-I-Play-with-You教学课件
评论
0/150
提交评论