关于关键字“注册” [英] about the keyword "register"

查看:83
本文介绍了关于关键字“注册”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好吗....

请看下面的代码,并告诉我原因。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆