关于关键字“注册” [英] about the keyword "register"
问题描述
请看下面的代码,并告诉我原因。
1 #define swap(a, b)a = a ^ b; b = b ^ a; a = a ^ b
2
3 int main(无效){
4寄存器int a = 4;
5寄存器int b = 5;
6 swap(a,b);
7 br />
8返回0;
9}
上面代码的汇编代码。
(gdb )反汇编主
函数main的汇编代码转储:
0x08048334< main + 0> ;: push%ebp
0x08048335< main + 1>:mov%esp,%ebp
0x08048337< main + 3> ;: sub $ 0x8,%esp
0x0804833a< main + 6>:和$ 0 xfffffff0,%esp
0x0804833d< main + 9>:mov $ 0x0,%eax
0x08048342< main + 14> ;: add $ 0xf,%eax
0x08048345< main + 17>:添加$ 0xf,%eax
0x08048348< main + 20>:shr $ 0x4,%eax
0x0804834b< main + 23&g t;:shl $ 0x4,%eax
0x0804834e< main + 26> ;: sub%eax,%esp
0x08048350< main + 28>:mov $ 0x0 ,%eax
0x08048355< main + 33>:离开
0x08048356< main + 34>:ret
汇编程序转储结束。
哪里是XOR指令?
如果我删除关键字register在我的C程序中。
1 #define swap(a,b)a = a ^ b; b = b ^ a; a = a ^ b
2
3 int main(无效){
4 int a = 4;
5 int b = 5;
6交换(a,b);
7返回0;
8}
我会得到以下怪物" asm代码...
(gdb)反汇编主
函数main的汇编代码转储:
0x08048334< main + 0>:推%ebp
0x08048335< main + 1>:mov%esp,%ebp
0x08048337< main + 3> ;: sub $ 0x8,%esp
0x0804833a< main + 6>:和$ 0xfffffff0,%esp
0x0804833d< main + 9>:mov $ 0x0,%eax
0x08048342 < main + 14>:添加$ 0xf,%eax
0x08048345< main + 17>:添加$ 0xf,%eax
0x08048348< main + 20> :shr $ 0x4,%eax
0x0804834b< main + 23>:shl $ 0x4,%eax
0x0804834e< main + 26>:sub%eax,% esp
0x08048350< main + 28>:movl $ 0x4,0xfffffffc(%ebp)
0x08048357< main + 35>:movl $ 0x5,0xfffffff8(%ebp )
0x0804835e< main + 42>:mov 0xfffffff8(%ebp),%edx
0x08048361< main + 45>:lea 0xfffffffc(%ebp),% eax
0x08048364< main + 48>: xor%edx,(%eax)
0x08048366< main + 50> ;: mov 0xfffffffc(%ebp),%edx
0x08048369< main + 53>:lea 0xfffffff8(%ebp),%eax
0x0804836c< main + 56>:xor%edx,(%eax)
0x0804836e< main + 58>:mov 0xfffffff8 (%ebp),%edx
0x08048371< main + 61>:lea 0xfffffffc(%ebp),%eax
0x08048374< main + 64>:xor% edx,(%eax)
0x08048376< main + 66>:mov $ 0x0,%eax
0x0804837b< main + 71>:离开
0x0804837c< main + 72>:ret
汇编程序转储结束。
另一个奇怪的事情是xor指令。
Plz查看代码:
0x0804835e< main + 42>:mov 0xfffffff8(%ebp),%edx
0x08048361< main + 45>:lea 0xfffffffc(%ebp),%eax
0x08048364< main + 48>:xor%edx,(%eax)
0x08048366< main + 50>:mov 0xfffffffc (%ebp),%edx
0x08048369< main + 5 3>:lea 0xfffffff8(%ebp),%eax
0x0804836c< main + 56>:xor%edx,(%eax)
为什么不使用
xor%edx,(%eax)
xor%eax,(%edx)
来替换redundent
0x08048366< main + 50>:mov 0xfffffffc(%ebp),%edx
0x08048369< main + 53>:lea 0xfffffff8(%ebp),%eax
Thanx !!!!
0x8,%esp
0x0804833a< main + 6>:和
0xfffffff0,%esp
0x0804833d< main + 9>:mov
0x0,% eax
0x08048342< main + 14>:添加
howdy....
plz take a look at the following codes, and tell me the reason.
1 #define swap(a,b) a=a^b;b=b^a;a=a^b
2
3 int main(void){
4 register int a=4;
5 register int b=5;
6 swap(a,b);
7
8 return 0;
9 }
The assemble code of the above code.
(gdb) disassemble main
Dump of assembler code for function main:
0x08048334 <main+0>: push %ebp
0x08048335 <main+1>: mov %esp,%ebp
0x08048337 <main+3>: sub $0x8,%esp
0x0804833a <main+6>: and $0xfffffff0,%esp
0x0804833d <main+9>: mov $0x0,%eax
0x08048342 <main+14>: add $0xf,%eax
0x08048345 <main+17>: add $0xf,%eax
0x08048348 <main+20>: shr $0x4,%eax
0x0804834b <main+23>: shl $0x4,%eax
0x0804834e <main+26>: sub %eax,%esp
0x08048350 <main+28>: mov $0x0,%eax
0x08048355 <main+33>: leave
0x08048356 <main+34>: ret
End of assembler dump.
where is the XOR instruction?
if I remove the keyword "register" in my C program.
1 #define swap(a,b) a=a^b;b=b^a;a=a^b
2
3 int main(void){
4 int a=4;
5 int b=5;
6 swap(a,b);
7 return 0;
8 }
I''ll got the following "monster" asm code...
(gdb) disassemble main
Dump of assembler code for function main:
0x08048334 <main+0>: push %ebp
0x08048335 <main+1>: mov %esp,%ebp
0x08048337 <main+3>: sub $0x8,%esp
0x0804833a <main+6>: and $0xfffffff0,%esp
0x0804833d <main+9>: mov $0x0,%eax
0x08048342 <main+14>: add $0xf,%eax
0x08048345 <main+17>: add $0xf,%eax
0x08048348 <main+20>: shr $0x4,%eax
0x0804834b <main+23>: shl $0x4,%eax
0x0804834e <main+26>: sub %eax,%esp
0x08048350 <main+28>: movl $0x4,0xfffffffc(%ebp)
0x08048357 <main+35>: movl $0x5,0xfffffff8(%ebp)
0x0804835e <main+42>: mov 0xfffffff8(%ebp),%edx
0x08048361 <main+45>: lea 0xfffffffc(%ebp),%eax
0x08048364 <main+48>: xor %edx,(%eax)
0x08048366 <main+50>: mov 0xfffffffc(%ebp),%edx
0x08048369 <main+53>: lea 0xfffffff8(%ebp),%eax
0x0804836c <main+56>: xor %edx,(%eax)
0x0804836e <main+58>: mov 0xfffffff8(%ebp),%edx
0x08048371 <main+61>: lea 0xfffffffc(%ebp),%eax
0x08048374 <main+64>: xor %edx,(%eax)
0x08048376 <main+66>: mov $0x0,%eax
0x0804837b <main+71>: leave
0x0804837c <main+72>: ret
End of assembler dump.
Another strange thing is the xor instruction.
Plz see the code:
0x0804835e <main+42>: mov 0xfffffff8(%ebp),%edx
0x08048361 <main+45>: lea 0xfffffffc(%ebp),%eax
0x08048364 <main+48>: xor %edx,(%eax)
0x08048366 <main+50>: mov 0xfffffffc(%ebp),%edx
0x08048369 <main+53>: lea 0xfffffff8(%ebp),%eax
0x0804836c <main+56>: xor %edx,(%eax)
why dont use
xor %edx,(%eax)
xor %eax,(%edx)
to replace the redundent
0x08048366 <main+50>: mov 0xfffffffc(%ebp),%edx
0x08048369 <main+53>: lea 0xfffffff8(%ebp),%eax
Thanx!!!!
0x8,%esp
0x0804833a <main+6>: and
0xfffffff0,%esp
0x0804833d <main+9>: mov
0x0,%eax
0x08048342 <main+14>: add
这篇关于关于关键字“注册”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!