计原实验一 VScode GDB调试 反汇编

-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
在这里插入图片描述
在这里插入图片描述
地址由低到高存储相应的字节

在这里插入图片描述

什么是小端格式

添加链接描述

vscode中gdb调试命令

添加链接描述

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值