-exec disassemble
Dump of assembler code for function main:
0x00000000080006aa <+0>: push %rbp
0x00000000080006ab <+1>: mov %rsp,%rbp
0x00000000080006ae <+4>: sub $0x20,%rsp
0x00000000080006b2 <+8>: mov %fs:0x28,%rax
0x00000000080006bb <+17>: mov %rax,-0x8(%rbp)
0x00000000080006bf <+21>: xor %eax,%eax
0x00000000080006c1 <+23>: movss 0x13f(%rip),%xmm0 # 0x8000808
0x00000000080006c9 <+31>: movss %xmm0,-0x14(%rbp)
0x00000000080006ce <+36>: movss -0x14(%rbp),%xmm0
0x00000000080006d3 <+41>: cvtss2sd %xmm0,%xmm0
0x00000000080006d7 <+45>: lea 0x116(%rip),%rdi # 0x80007f4
0x00000000080006de <+52>: mov $0x1,%eax
0x00000000080006e3 <+57>: callq 0x8000580 <printf@plt>
0x00000000080006e8 <+62>: lea -0x14(%rbp),%rax
0x00000000080006ec <+66>: mov (%rax),%eax
0x00000000080006ee <+68>: mov %eax,%esi
0x00000000080006f0 <+70>: lea 0x101(%rip),%rdi # 0x80007f8
0x00000000080006f7 <+77>: mov $0x0,%eax
0x00000000080006fc <+82>: callq 0x8000580 <printf@plt>
0x0000000008000701 <+87>: lea -0x14(%rbp),%rax
0x0000000008000705 <+91>: mov %rax,-0x10(%rbp)
0x0000000008000709 <+95>: mov -0x10(%rbp),%rax
0x000000000800070d <+99>: mov (%rax),%eax
0x000000000800070f <+101>: and $0x7fffff,%eax
0x0000000008000714 <+106>: mov %eax,%ecx
0x0000000008000716 <+108>: mov -0x10(%rbp),%rax
0x000000000800071a <+112>: movzwl 0x2(%rax),%eax
0x000000000800071e <+116>: shr $0x7,%ax
0x0000000008000722 <+120>: and $0xff,%ah
0x0000000008000725 <+123>: movzbl %al,%eax
0x0000000008000728 <+126>: lea -0x7f(%rax),%edx
0x000000000800072b <+129>: mov -0x10(%rbp),%rax
0x000000000800072f <+133>: movzbl 0x3(%rax),%eax
0x0000000008000733 <+137>: shr $0x7,%al
0x0000000008000736 <+140>: movzbl %al,%eax
0x0000000008000739 <+143>: mov %eax,%esi
0x000000000800073b <+145>: lea 0xba(%rip),%rdi # 0x80007fc
0x0000000008000742 <+152>: mov $0x0,%eax
0x0000000008000747 <+157>: callq 0x8000580 <printf@plt>
0x000000000800074c <+162>: mov $0x0,%eax
0x0000000008000751 <+167>: mov -0x8(%rbp),%rsi
0x0000000008000755 <+171>: xor %fs:0x28,%rsi
0x000000000800075e <+180>: je 0x8000765 <main+187>
0x0000000008000760 <+182>: callq 0x8000570 <__stack_chk_fail@plt>
0x0000000008000765 <+187>: leaveq
0x0000000008000766 <+188>: retq
End of assembler dump.
二选一
-exec disassemble /m main
-exec disassemble /m
Dump of assembler code for function main:
5 {
0x00000000080006aa <+0>: push %rbp
0x00000000080006ab <+1>: mov %rsp,%rbp
0x00000000080006ae <+4>: sub $0x20,%rsp
0x00000000080006b2 <+8>: mov %fs:0x28,%rax
0x00000000080006bb <+17>: mov %rax,-0x8(%rbp)
0x00000000080006bf <+21>: xor %eax,%eax
6 typedef struct FP_SINGLE
7 {
8 unsigned int nFraction:23;//尾数部分
9 unsigned int nExponent:8;//指数部分
10 unsigned int nSign:1;//符号位
11 }FP_SINGLE;
12
13 float a = -2345.125;//PPT 单精度浮点数
0x00000000080006c1 <+23>: movss 0x13f(%rip),%xmm0 # 0x8000808
0x00000000080006c9 <+31>: movss %xmm0,-0x14(%rbp)
14
15 printf("%f\n",a); //显示这个浮点数
0x00000000080006ce <+36>: movss -0x14(%rbp),%xmm0
0x00000000080006d3 <+41>: cvtss2sd %xmm0,%xmm0
0x00000000080006d7 <+45>: lea 0x116(%rip),%rdi # 0x80007f4
0x00000000080006de <+52>: mov $0x1,%eax
0x00000000080006e3 <+57>: callq 0x8000580 <printf@plt>
16 printf("%x\n",*(int*)&a); //以十六进制的格式显示该浮点数
0x00000000080006e8 <+62>: lea -0x14(%rbp),%rax
0x00000000080006ec <+66>: mov (%rax),%eax
0x00000000080006ee <+68>: mov %eax,%esi
0x00000000080006f0 <+70>: lea 0x101(%rip),%rdi # 0x80007f8
0x00000000080006f7 <+77>: mov $0x0,%eax
0x00000000080006fc <+82>: callq 0x8000580 <printf@plt>
17
18 FP_SINGLE *p = (FP_SINGLE*)&a;
0x0000000008000701 <+87>: lea -0x14(%rbp),%rax
0x0000000008000705 <+91>: mov %rax,-0x10(%rbp)
19
20 printf("%d,%#X,%#X\n",p->nSign,p->nExponent-127,p->nFraction);
=> 0x0000000008000709 <+95>: mov -0x10(%rbp),%rax
0x000000000800070d <+99>: mov (%rax),%eax
0x000000000800070f <+101>: and $0x7fffff,%eax
0x0000000008000714 <+106>: mov %eax,%ecx
0x0000000008000716 <+108>: mov -0x10(%rbp),%rax
0x000000000800071a <+112>: movzwl 0x2(%rax),%eax
0x000000000800071e <+116>: shr $0x7,%ax
0x0000000008000722 <+120>: and $0xff,%ah
0x0000000008000725 <+123>: movzbl %al,%eax
0x0000000008000728 <+126>: lea -0x7f(%rax),%edx
0x000000000800072b <+129>: mov -0x10(%rbp),%rax
0x000000000800072f <+133>: movzbl 0x3(%rax),%eax
0x0000000008000733 <+137>: shr $0x7,%al
0x0000000008000736 <+140>: movzbl %al,%eax
0x0000000008000739 <+143>: mov %eax,%esi
0x000000000800073b <+145>: lea 0xba(%rip),%rdi # 0x80007fc
0x0000000008000742 <+152>: mov $0x0,%eax
0x0000000008000747 <+157>: callq 0x8000580 <printf@plt>
21
22 return 0;
0x000000000800074c <+162>: mov $0x0,%eax
23 } 0x0000000008000751 <+167>: mov -0x8(%rbp),%rsi
0x0000000008000755 <+171>: xor %fs:0x28,%rsi
0x000000000800075e <+180>: je 0x8000765 <main+187>
0x0000000008000760 <+182>: callq 0x8000570 <__stack_chk_fail@plt>
0x0000000008000765 <+187>: leaveq
0x0000000008000766 <+188>: retq
End of assembler dump.
上面用的是Intel芯片,是冯诺依曼结构,所以每条语言的字节数是不等长的
对应的C语言是
#include <stdio.h> //标准输入输出头文件
#include <stdlib.h> //标准库头文件
int main()
{
typedef struct FP_SINGLE
{
unsigned int nFraction:23;//尾数部分
unsigned int nExponent:8;//指数部分
unsigned int nSign:1;//符号位
}FP_SINGLE;
float a = -2345.125;//PPT 单精度浮点数
printf("%f\n",a); //显示这个浮点数
printf("%x\n",*(int*)&a); //以十六进制的格式显示该浮点数
FP_SINGLE *p = (FP_SINGLE*)&a;
printf("%d,%#X,%#X\n",p->nSign,p->nExponent-127,p->nFraction);
return 0;
}
显示寄存器
-exec info registers
rax 0x7ffffffeda8c 140737488280204
rbx 0x0 0
rcx 0x0 0
rdx 0x0 0
rsi 0x8402260 138420832
rdi 0x1 1
rbp 0x7ffffffedaa0 0x7ffffffedaa0
rsp 0x7ffffffeda80 0x7ffffffeda80
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x80005a0 134219168
r13 0x7ffffffedb80 140737488280448
r14 0x0 0
r15 0x0 0
rip 0x8000709 0x8000709 <main+95>
eflags 0x206 [ PF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
打印某寄存器的值
-exec print $rip
rip–>程序计数器–>PC
pc是rip的别称
执行下一行
-exec si
结果一致
x后面只能跟地址,不能再写a
地址由低到高存储相应的字节