没有合适的资源?快使用搜索试试~ 我知道了~
Linux基本反汇编结构与GDB入门.doc
1 下载量 28 浏览量
2022-11-28
23:56:18
上传
评论
收藏 121KB DOC 举报
温馨提示
试读
18页
Linux基本反汇编结构与GDB入门.doc
资源推荐
资源详情
资源评论
Linux 下的汇编与 Windows 汇编最大的不同就是第一个操作数是原操作数,第二
个是目的操作数,而 Windows 下却是相反。
1、 基本操作指令
简单的操作数类型说明,一般有三种,
(1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,
比如$0x1F,这个会在后面的具体分析中见到很多。
(2)寄存器操作数,它表示某个寄存器的内容,用符号 Ea 来表示任意寄存器
a,用引用 R[Ea]来表示它的值,这是将寄存器集合看成一个数组 R,用寄存器表
示符作为索引。
(3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访
问某个存储器位置。用符号 Mb[Addr]表示对存储在存储器中从地址 Addr 开始的
b 字节值的引用。通常可以省略下标 b。
图 1 表示有多种不同的寻址模式,一个立即数偏移 Imm,一个基址寄存器 Eb,
一 个 变 址 或 索 引 寄 存 器 Ei 和 一 个 伸 缩 因 子 s 。 有 效 地 址 被 计 算 为
Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元
素进行访问时会用到。
操作数类型
格式
操作数值
名称
立即数
$Imm
Imm
立即数寻址
寄存器
Ea
R[Ea]
寄存器寻址
寄存器
Imm
M[Imm]
绝对寻址
寄存器
(Ea)
M[R[Ea]]
间接寻址
寄存器
Imm(Eb)
M[Imm+R[Eb]]
(基址+偏移量)
寻址
寄存器
(Eb,Ei)
M[R[Eb]+R[Ei]]
变址寻址
寄存器
M[Imm+R[Eb]+R[Ei]]
寄存器
(,Ei, s)
M[R[Ei] * s]
伸 缩 化 的 变 址 寻
址
寄存器
Imm(,Ei, s)
M[Imm+R[Ei] * s]]
伸 缩 化 的 变 址 寻
址
寄存器
(Eb,Ei, s)
M[R[Eb]+R[Ei] * s]
伸 缩 化 的 变 址 寻
址
寄存器
Imm(Eb,Ei, s)
M[Imm+R[Eb]+R[Ei]
* s]
伸 缩 化 的 变 址 寻
址
图 1 操作数格式
注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是
1、2、4、或者是 8。 从上面的图我们就可以大致了解操作数的类型了。
在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个
操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够
对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需
要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到
目的位置。下面给出源操作数和目的操作数的五种可能组合。
1、movl $0x4050, %eax 立即数——寄存器
2、movl %ebp, %esp 寄存器——寄存器
3、movl (%edi, %ecx), %eax 存储器——寄存器
4、movl $-17, (%esp) 立即数——存储器
5、 movl %eax, -12(%ebp) 寄存器——存储器
注意这里的指令 mov 可能有不同的形式,不同平台的汇编一般是有些不一样的,
但这并不会影响我们理解汇编,只要熟悉其细节之后就能够明白的。
指令
效果
描述
movl S, D
D ←S
传送双字
movl S, D
D ←S
传送字
movl S, D
D ←S
传送字节
movl S, D
D ←符号扩展(S)
传送符号扩展的字
节
movl S, D
D ←零扩展(S)
传送零扩展的字节
pushl S
R[%esp] ← R[%esp] – 4;
M[R[%esp]] ← S
压栈
popl D
D ← M[R[%esp]];
R[%esp] ← R[%esp] + 4
出栈
图 2:数据传送指令
结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到 Linux 下的
GCC 开发环境和 GDB 调试器,不过都是比较简单的应用。我的 Linux 操作系统是
Ubuntu9.10,其它版本的差别应该不大,
如果我们要编写一个程序,我们可以用 Linux 下自带的 vi 或 vim 编辑器,
studyrush@studyrush-desktop:~/C$ vi exchange.c
vi 后面加我们要创建的程序文件的名字,在这里是 exchange.c
studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c
gcc -o exchange exchange.c 或 gcc exchange –o exchange 这两者都可以对源文件
进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,
大家可以先熟悉一下 gcc 编译器,应该就会明白的了。
studyrush@studyrush-desktop:~/C$ ./exchange 点加斜线再加输出文件名就表示
运行程序,下面是运行的结果。
a = 3, b = 4
使用 GDB 可以参考附件里面的教程,这份教程写的很不错,看雪论坛本身也有,
大家可以看这个贴(http://bbs.pediy.com/showthread.php?t=77746),现在我只是把它
放在附件里面。
studyrush@studyrush-desktop:~/C$ gdb exchange
命令 disas 就表示反汇编(disassembly),后面再加上要显示的函数名,我们就可
以看到函数对应的反汇编代码了。
(gdb) disas exchange
Dump of assembler code for function exchange:
0x080483c4 <exchange+0>: push %ebp
0x080483c5 <exchange+1>: mov %esp,%ebp
0x080483c7 <exchange+3>: sub $0x10,%esp
0x080483ca <exchange+6>: mov 0x8(%ebp),%eax
0x080483cd <exchange+9>: mov (%eax),%eax
0x080483cf <exchange+11>: mov %eax,-0x4(%ebp)
0x080483d2 <exchange+14>: mov 0x8(%ebp),%edx
0x080483d5 <exchange+17>: mov 0xc(%ebp),%eax
0x080483d8 <exchange+20>: mov %eax,(%edx)
0x080483da <exchange+22>: mov -0x4(%ebp),%eax
0x080483dd <exchange+25>: leave
0x080483de <exchange+26>: ret
End of assembler dump.
进一步来分析上面的反汇编代码,这里的代码可能与前面的讲的指令操作有一些
不同,因为这是很正常的,不同的操作系统应该有所差别,这也是汇编语言一般
与平台有关,移植性并不好。
push %ebp
mov %esp,%ebp
sub $0x10,%esp
对有过反汇编的人对上面的代码肯定不会陌生,这里就是将 ebp 进栈,保存 esp
的值,并为局部变量预留空间。要记得源操作数与目的操作数的位置,前面有讲
的。这里也一定程度对 C 语言中的指针使用进行了说明。看源代码可以知道。
mov 0x8(%ebp),%eax
mov (%eax),%eax
mov %eax,-0x4(%ebp)
mov 0x8(%ebp),%eax 取得 xp,其实是指针本身,即是地址,汇编表示即可
为 mov %ebp + 8, %eax,这里就是存储器——寄存器的操作方式。
mov (%eax),%eax 这里是取得指针指向的值,即*xp,(%eax)表示取%eax
中的地址指向的值,比如
寄存器 值 地址 值
%eax 0x100 0x100 0xFF
(%eax)的值就是 0xFF 了。
剩余17页未读,继续阅读
资源评论
Mmnnnbb123
- 粉丝: 677
- 资源: 8万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功