|
发表于 2023-2-5 10:31:12
|
显示全部楼层
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
1149: 55 pushq %rbp
114a: 48 89 e5 movq %rsp,%rbp
114d: 48 83 ec 10 subq $0x10,%rsp
int z = 2;
1151: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp)
while (z--)
1158: eb 19 jmp 1173 <main+0x2a>
{
printf("z=%d\n", z);
115a: 8b 45 fc movl -0x4(%rbp),%eax
115d: 89 c6 movl %eax,%esi
115f: 48 8d 05 9e 0e 00 00 leaq 0xe9e(%rip),%rax # 2004 <_IO_stdin_used+0x4>
1166: 48 89 c7 movq %rax,%rdi
1169: b8 00 00 00 00 movl $0x0,%eax
116e: e8 cd fe ff ff callq 1040 <printf@plt>
while (z--)
1173: 8b 45 fc movl -0x4(%rbp),%eax
1176: 8d 50 ff leal -0x1(%rax),%edx
1179: 89 55 fc movl %edx,-0x4(%rbp)
117c: 85 c0 testl %eax,%eax
117e: 75 da jne 115a <main+0x11>
}
printf("z=%d\n", z);
1180: 8b 45 fc movl -0x4(%rbp),%eax
1183: 89 c6 movl %eax,%esi
1185: 48 8d 05 78 0e 00 00 leaq 0xe78(%rip),%rax # 2004 <_IO_stdin_used+0x4>
118c: 48 89 c7 movq %rax,%rdi
118f: b8 00 00 00 00 movl $0x0,%eax
1194: e8 a7 fe ff ff callq 1040 <printf@plt>
system("pause");
1199: 48 8d 05 6a 0e 00 00 leaq 0xe6a(%rip),%rax # 200a <_IO_stdin_used+0xa>
11a0: 48 89 c7 movq %rax,%rdi
11a3: e8 88 fe ff ff callq 1030 <system@plt>
return 0;
11a8: b8 00 00 00 00 movl $0x0,%eax
}
11ad: c9 leaveq
11ae: c3 retq
1173: 8b 45 fc movl -0x4(%rbp),%eax
1176: 8d 50 ff leal -0x1(%rax),%edx
1179: 89 55 fc movl %edx,-0x4(%rbp)
117c: 85 c0 testl %eax,%eax
117e: 75 da jne 115a <main+0x11>
上面这5条指令就是while(z--)对应的汇编语言指令
其实应该是6条指令
1158: eb 19 jmp 1173 <main+0x2a>
这个应该也属于是 while(z--) 语句
首先,一上来先给z的值赋值成2
1151: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp)
-0x4(%rbp) 就是 z 的地址
然后就是一个jmp
1158: eb 19 jmp 1173 <main+0x2a>
这个jmp让cpu从1173的位置继续执行,就是
1173: 8b 45 fc movl -0x4(%rbp),%eax
这就是while语句的部分了
先把z的值读取出来,读取到eax里面
1176: 8d 50 ff leal -0x1(%rax),%edx
然后给eax的值减 1
减 1 之后的结果给edx
一开始z的值是2
1173: 8b 45 fc movl -0x4(%rbp),%eax
把这个2读取到eax里面
1176: 8d 50 ff leal -0x1(%rax),%edx
2 - 1 = 1
把1给edx
1179: 89 55 fc movl %edx,-0x4(%rbp)
把edx中的这个1写回到z里面
执行完这条指令之后,z的值就变成1了
117c: 85 c0 testl %eax,%eax
接下来判断eax中的值,eax中的值是2
117e: 75 da jne 115a <main+0x11>
所以转移到 115a的地方继续执行指令
115a就是去执行printf
printf("z=%d\n", z);
115a: 8b 45 fc movl -0x4(%rbp),%eax
115d: 89 c6 movl %eax,%esi
115f: 48 8d 05 9e 0e 00 00 leaq 0xe9e(%rip),%rax # 2004 <_IO_stdin_used+0x4>
1166: 48 89 c7 movq %rax,%rdi
1169: b8 00 00 00 00 movl $0x0,%eax
116e: e8 cd fe ff ff callq 1040 <printf@plt>
执行完这个printf之后又来到了while的部分
116e是printf的最后一条指令,这条指令的下一条指令是1173
就是while的部分
1173: 8b 45 fc movl -0x4(%rbp),%eax
一样的,把z中的1读取到eax
1176: 8d 50 ff leal -0x1(%rax),%edx
给这个值减 1 ,结果写到edx
就是把1 - 1 的结果写到edx
就是把 0 写到edx
1179: 89 55 fc movl %edx,-0x4(%rbp)
然后又把0写到z里面
执行完这条指令之后z里面保存的值就是0了
117c: 85 c0 testl %eax,%eax
117e: 75 da jne 115a <main+0x11>
然后判断eax里面的值是不是0,eax中的值是1,不是0
所以再跳回去执行printf
执行完printf之后又来到了while
1173: 8b 45 fc movl -0x4(%rbp),%eax
1176: 8d 50 ff leal -0x1(%rax),%edx
1179: 89 55 fc movl %edx,-0x4(%rbp)
117c: 85 c0 testl %eax,%eax
117e: 75 da jne 115a <main+0x11>
还是这个
把z里面的那个0读取到eax
减1的结果写到edx
0 - 1 等于几?
等于 -1,没错,把-1写回z里面
1179: 89 55 fc movl %edx,-0x4(%rbp)
执行完这条指令之后,z里面保存的就是-1
然后接下来判断eax里面的值是不是0
这一次eax里面的值是0了
那就不跳上去了,就是说117e的这条jne指令执行完之后要执行1180位置的指令,而不是之前的115a了
printf("z=%d\n", z);
1180: 8b 45 fc movl -0x4(%rbp),%eax
1183: 89 c6 movl %eax,%esi
1185: 48 8d 05 78 0e 00 00 leaq 0xe78(%rip),%rax # 2004 <_IO_stdin_used+0x4>
118c: 48 89 c7 movq %rax,%rdi
118f: b8 00 00 00 00 movl $0x0,%eax
1194: e8 a7 fe ff ff callq 1040 <printf@plt>
1180开始又是一个printf
再之后就是system函数了
然后就没了
|
评分
-
查看全部评分
|