逆向-beginners之结构体-CPU信息

#include <stdio.h>

#ifdef GNUC

static inline void cpuid(int code, int *a, int *b, int *c, int *d)

{

__asm volatile("cpuid":"=a"(*a), "=b"(*b), "=c"(*c), "=d"(*d):"a"(code));

}

#endif

#ifdef _MSC_VER

#include <intrin.h>

#endif

struct cpuid_1_eax

{

unsigned int stepping:4;

unsigned int model:4;

unsigned int family_id:4;

unsigned int processor_type:2;

unsigned int reserved1:2;

unsigned int extended_model_id:4;

unsigned int extended_family_id:8;

unsigned int reserved2:4;

};

int main()

{

struct cpuid_1_eax * tmp;

int b[4];

#ifdef _MSC_VER

__cpuid(b, 1);

#endif

#ifdef GNUC

cpuid(1, &b[0], &b[1], &b[2], &b[3]);

#endif

tmp = (struct cpuid_1_eax *) &b[0];

printf("stepping=%d\n", tmp->stepping);

printf("model=%d\n", tmp->model);

printf("family_id=%d\n", tmp->family_id);

printf("processor_type=%d\n", tmp->processor_type);

printf("extended_model_id=%d\n", tmp->extended_model_id);

printf("extended_family_id=%d\n", tmp->extended_family_id);

return 0;

}

#if 0

/*

* intel

*/

0000000000001169 <cpuid>:

1169: 55 push %rbp // rsp=0x7fffffffe180 rbp=0x7fffffffe1c0

116a: 48 89 e5 mov %rsp,%rbp // rsp=0x7fffffffe180 rbp=0x7fffffffe180

116d: 53 push %rbx // rsp=0x7fffffffe178 rbp=0x7fffffffe180

116e: 89 7d f4 mov %edi,-0xc(%rbp) // edi=1 (rbp-0xc)=0x7fffffffe174:0x555552e000000001

1171: 48 89 75 e8 mov %rsi,-0x18(%rbp) // rsi=0x7fffffffe1a0 (rbp-0x18)=0x7fffffffe168:0x00007fffffffe1a0

1175: 48 89 55 e0 mov %rdx,-0x20(%rbp) // rdx=0x7fffffffe1a4 (rbp-0x20)=0x7fffffffe160:0x00007fffffffe1a4

1179: 48 89 4d d8 mov %rcx,-0x28(%rbp) // rcx=0x7fffffffe1a8 (rbp-0x28)=0x7fffffffe158:0x00007fffffffe1a8

117d: 4c 89 45 d0 mov %r8,-0x30(%rbp) // r8=0x7fffffffe1ac (rbp-0x30)=0x7fffffffe150:0x00007fffffffe1ac

1181: 8b 45 f4 mov -0xc(%rbp),%eax // eax=1

1184: 0f a2 cpuid

1186: 89 de mov %ebx,%esi // esi=0x18400800

1188: 89 c7 mov %eax,%edi // edi=0x50657

118a: 48 8b 45 e8 mov -0x18(%rbp),%rax // rax=0x7fffffffe1a0

118e: 89 38 mov %edi,(%rax) // (rax)=0x7fffffffe1a0:0x0000000000050657

1190: 48 8b 45 e0 mov -0x20(%rbp),%rax // rax=0x7fffffffe1a4

1194: 89 30 mov %esi,(%rax) // (rax)=0x7fffffffe1a4:0x5555508018400800

1196: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=0x7fffffffe1a8

119a: 89 08 mov %ecx,(%rax) // (rax)=0x7fffffffe1a8:0x000055557ffefbff ecx=0x7ffefbff

119c: 48 8b 45 d0 mov -0x30(%rbp),%rax // rax=0x7fffffffe1ac

11a0: 89 10 mov %edx,(%rax) // (rax)=0x7fffffffe1ac:0xffffe2b0bfebfbff edx=0xbfebfbff

11a2: 90 nop // rsp=0x7fffffffe178 rbp=0x7fffffffe180

11a3: 5b pop %rbx // rsp=0x7fffffffe180 rbp=0x7fffffffe180

11a4: 5d pop %rbp // rsp=0x7fffffffe188 rbp=0x7fffffffe1c0

11a5: c3 retq // rsp=0x7fffffffe190 rbp=0x7fffffffe1c0 retq 相当于 : pop %rip

00000000000011a6 <main>:

11a6: f3 0f 1e fa endbr64 // rsp=0x7fffffffe1c8 rbp=0x0

11aa: 55 push %rbp // rsp=0x7fffffffe1c0

11ab: 48 89 e5 mov %rsp,%rbp // rsp=0x7fffffffe1c0 rbp=0x7fffffffe1c0

11ae: 48 83 ec 30 sub $0x30,%rsp // rsp=0x7fffffffe190 rbp=0x7fffffffe1c0

11b2: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax // rax=0xc6a79e60e6de8500

11b9: 00 00

11bb: 48 89 45 f8 mov %rax,-0x8(%rbp) // (rbp-0x8)=0x7fffffffe1b8: 0xc6a79e60e6de8500

11bf: 31 c0 xor %eax,%eax // eax=0

11c1: 48 8d 45 e0 lea -0x20(%rbp),%rax // rax=rbp-0x20=0x7fffffffe1a0

11c5: 48 8d 70 0c lea 0xc(%rax),%rsi // rsi=rbp-0x20+0xc=0x7fffffffe1a0+0xc=0x7fffffffe1ac

11c9: 48 8d 45 e0 lea -0x20(%rbp),%rax // rax=rbp-0x20=0x7fffffffe1a0

11cd: 48 8d 48 08 lea 0x8(%rax),%rcx // rcx=rbp-0x20+0x8=0x7fffffffe1a8

11d1: 48 8d 45 e0 lea -0x20(%rbp),%rax // rax=rbp-0x20=0x7fffffffe1a0

11d5: 48 8d 50 04 lea 0x4(%rax),%rdx // rdx=rbp-0x20+0x4=0x7fffffffe1a4

11d9: 48 8d 45 e0 lea -0x20(%rbp),%rax // rax=rbp-0x20=0x7fffffffe1a0

11dd: 49 89 f0 mov %rsi,%r8 // r8=rbp-0x20+0xc=0x7fffffffe1ac

11e0: 48 89 c6 mov %rax,%rsi // rsi=rbp-0x20=0x7fffffffe1a0

11e3: bf 01 00 00 00 mov $0x1,%edi // edi=1

11e8: e8 7c ff ff ff callq 1169 <cpuid> // cpuid(edi, rsi, rdx, rcx, r8) (1, 0x7fffffffe1a0, 0x7fffffffe1a4, 0x7fffffffe1a8, 0x7fffffffe1ac)

// rsp=0x7fffffffe188 rbp=0x7fffffffe1c0

11ed: 48 8d 45 e0 lea -0x20(%rbp),%rax // rsp=0x7fffffffe190 rbp=0x7fffffffe1c0 rax=0x7fffffffe1a0 rbp-0x20=0x7fffffffe1a0:0x1840080000050657

11f1: 48 89 45 d8 mov %rax,-0x28(%rbp) // (rbp-0x28)=0x7fffffffe1a0 rax=0x7fffffffe1a0 rbp-0x28=0x7fffffffe198:0x00007fffffffe1a0

11f5: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=(rbp-0x28)=0x7fffffffe1a0 rbp-0x28=0x7fffffffe198:0x00007fffffffe1a0

11f9: 0f b6 00 movzbl (%rax),%eax // eax=0x57 (rax)=(rbp-0x28)=(0x7fffffffe1a0)=0x7fffffffe1a0:0x1840080000050657

11fc: 83 e0 0f and $0xf,%eax // eax=eax&0xf=0x7 /* 取字节低四位 */

11ff: 0f b6 c0 movzbl %al,%eax // eax=al=0x7

1202: 89 c6 mov %eax,%esi // esi=eax=0x7

1204: 48 8d 3d f9 0d 00 00 lea 0xdf9(%rip),%rdi # 2004 <_IO_stdin_used+0x4>

120b: b8 00 00 00 00 mov $0x0,%eax

1210: e8 5b fe ff ff callq 1070 <printf@plt> // rsp=0x7fffffffe190 rbp=0x7fffffffe1c0

1215: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=(rbp-0x28)=rbp-0x20=0x7fffffffe1a0

1219: 0f b6 00 movzbl (%rax),%eax // eax=(rax)=(rbp-0x20)=0x57

121c: c0 e8 04 shr $0x4,%al // al=al>>4=0x5 /* 取字节高四位 */

121f: 0f b6 c0 movzbl %al,%eax // eax=al=0x5

1222: 89 c6 mov %eax,%esi // esi=eax=0x5

1224: 48 8d 3d e6 0d 00 00 lea 0xde6(%rip),%rdi # 2011 <_IO_stdin_used+0x11>

122b: b8 00 00 00 00 mov $0x0,%eax

1230: e8 3b fe ff ff callq 1070 <printf@plt>

1235: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=0x7fffffffe1a0 x/xg 0x7fffffffe1a0:0x1840080000050657 x/8xb 0x7fffffffe1a0:0x57 0x06 0x05 0x00 0x00 0x08 0x40 0x18

1239: 0f b6 40 01 movzbl 0x1(%rax),%eax // eax=0x6 (rax+0x1)=0x7fffffffe1a0+1=0x7fffffffe1a1=0x6

123d: 83 e0 0f and $0xf,%eax // eax=eax&0xf=0x6

1240: 0f b6 c0 movzbl %al,%eax // eax=al=0x6

1243: 89 c6 mov %eax,%esi // esi=0x6

1245: 48 8d 3d cf 0d 00 00 lea 0xdcf(%rip),%rdi # 201b <_IO_stdin_used+0x1b>

124c: b8 00 00 00 00 mov $0x0,%eax

1251: e8 1a fe ff ff callq 1070 <printf@plt>

1256: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=0x7fffffffe1a0

125a: 0f b6 40 01 movzbl 0x1(%rax),%eax // eax=(rax+0x1)=0x6

125e: c0 e8 04 shr $0x4,%al // al=al>>4=0x0

1261: 83 e0 03 and $0x3,%eax // eax&=3=0x0

1264: 0f b6 c0 movzbl %al,%eax // eax=0x0

1267: 89 c6 mov %eax,%esi

1269: 48 8d 3d b9 0d 00 00 lea 0xdb9(%rip),%rdi # 2029 <_IO_stdin_used+0x29>

1270: b8 00 00 00 00 mov $0x0,%eax

1275: e8 f6 fd ff ff callq 1070 <printf@plt>

127a: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=0x7fffffffe1a0

127e: 0f b6 40 02 movzbl 0x2(%rax),%eax // eax=(rax+0x2)=0x5

1282: 83 e0 0f and $0xf,%eax // eax=0x5

1285: 0f b6 c0 movzbl %al,%eax // eax=0x5

1288: 89 c6 mov %eax,%esi

128a: 48 8d 3d ab 0d 00 00 lea 0xdab(%rip),%rdi # 203c <_IO_stdin_used+0x3c>

1291: b8 00 00 00 00 mov $0x0,%eax

1296: e8 d5 fd ff ff callq 1070 <printf@plt>

129b: 48 8b 45 d8 mov -0x28(%rbp),%rax // rax=0x7fffffffe1a0

129f: 0f b7 40 02 movzwl 0x2(%rax),%eax // eax=0x5

12a3: 66 c1 e8 04 shr $0x4,%ax // ax=0x0

12a7: 80 e4 ff and $0xff,%ah // ah=0x0

12aa: 0f b6 c0 movzbl %al,%eax // eax=0x0

12ad: 89 c6 mov %eax,%esi

12af: 48 8d 3d 9c 0d 00 00 lea 0xd9c(%rip),%rdi # 2052 <_IO_stdin_used+0x52>

12b6: b8 00 00 00 00 mov $0x0,%eax

12bb: e8 b0 fd ff ff callq 1070 <printf@plt>

12c0: b8 00 00 00 00 mov $0x0,%eax

12c5: 48 8b 55 f8 mov -0x8(%rbp),%rdx

12c9: 64 48 33 14 25 28 00 xor %fs:0x28,%rdx

12d0: 00 00

12d2: 74 05 je 12d9 <main+0x133>

12d4: e8 87 fd ff ff callq 1060 <__stack_chk_fail@plt>

12d9: c9 leaveq

12da: c3 retq

12db: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)

/*

* arm

*/

#endif

相关推荐
我在人间贩卖青春10 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春10 天前
汇编之伪操作
汇编·伪操作
济61710 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka10 天前
汇编TEST指令
汇编
我在人间贩卖青春10 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春10 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka11 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子11 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka11 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春12 天前
汇编之分支跳转指令
汇编·arm·分支跳转