逆向-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

相关推荐
CYRUS STUDIO7 分钟前
ARM64汇编寻址、汇编指令、指令编码方式
android·汇编·arm开发·arm·arm64
xiaozhiwise1 天前
ARM base instruction -- ccmp (immediate)
汇编
zzj_2626104 天前
masm汇编字符串输出演示
汇编
xiaozhiwise4 天前
ARM base instruction -- cls
汇编
R6bandito_5 天前
C/C++常用编译工具链:GCC,Clang
c语言·开发语言·汇编·c++·经验分享·gnu
xiaozhiwise6 天前
ARM base instruction -- cinc
汇编
CYRUS STUDIO6 天前
详解ARM64可执行程序的生成过程
android·c语言·汇编·c++·gdb·arm64
漠北的哈士奇7 天前
32位汇编——通用寄存器
汇编
xiaozhiwise8 天前
ARM base instruction -- bfi
汇编
xiaozhiwise8 天前
ARM base instruction -- adcs
汇编