吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2376|回复: 5
上一主题 下一主题
收起左侧

[其他转载] 32位、64位汇编语言寻址模式的差异

[复制链接]
跳转到指定楼层
楼主
longs75 发表于 2021-10-16 17:22 回帖奖励
鉴于网上64位汇编的中文教材少的可怜,Intel的鸟语手册对我这个CET-4的业余爱好者来说,一没时间看,二没能力学,所以就一边摸索一边学,了解一点儿新知识就跟大家分享一下,专业高手就不要嘲笑我了。

回到正题。

今天在学习64位汇编指令时,发现一个重要的知识点,64位指令的寻址方式与32位指令差异很大,可以说弄懂这个差异,是学好64位汇编的基础。
先来看一条mov语句:

mov ebx,[0]

在32位指令中,意思是把地址0x00000000的一个32位数给ebx:(当然Windows会给出一个异常,但我们讨论机器指令,不讨论Windows)
0040108C | 8B1D 00000000              | mov ebx,dword ptr ds:[0]                      |

在64位指令中,在内存中输入机器码:8B 1D 00 00 00 00,反汇编出来却是这样:
000000013F291100 | 8B1D 00000000            | mov ebx,dword ptr ds:[13F291106]        |
000000013F291106 | 90                       | nop                                     |

汇编老手一眼就能看出来,mov指令把当前RIP地址的32位数赋给ebx,而不是绝对地址:0x00000000(有点儿晕?64位地址格式是这样:0x0000000000000000)。

实际上,在x64dbg中输入:mov ebx,[rip],你就能看到它的机器码是:8B 1D 00 00 00 00

有同学说,我不信,我偏要把0x0000000000000000中的内容赋给ebx:
000000013F291100 | ?? ?? ?? ?? ?? ?? ??      | mov rbx, [0]
上面内容是我编辑过的,为了让大家理解,实际上x64dbg根本不会让你通过,直接给出错误提示。

要把0x0000000000000000中的内容赋给ebx,只有一个办法:
000000013F291100 | 48:A1 0000000000000000   | mov rax,qword ptr ds:[0]                |
000000013F29110A | 48:89C3                  | mov rbx,rax                             |
或者:
你当前的RIP距离0x0000000000000000 足够近(距离小于32位):
0000000000000040 | 8B1D BAFFFFFF            | mov ebx, dword ptr ds:[0x0000000000000000] |

上面的例子可以在x64dlb中自己尝试一下(需要开一个64位模式,一个32模式,方便对照)
如果看晕了,我总结一下32位指令和64位指令寻址的差异:

以 mov ebx,[0x56EF] 指令为例,

32位系统默认的内存地址起点是0x00000000,这条指令是把内存地址0x000056EF的内容赋给ebx,这是绝对寻址方式。

64位系统寻址能力绝大多数情况下也是32位而不是64位!所以它只能采取相对寻址的方式,默认的寻址起点是当前RIP!
假设当前RIP是000000013F291100,000000013F291100 - 56EF = 13F28BA11 超过32位,则 mov ebx,[0x56EF] 这个指令就是非法指令。
不过,有些编译器会修改成下面这样的合法指令:
mov ebx,[rip+0x56EF]

看完这些,大概对x86/x64家族的CPU处理64位数据的能力有了一个感性认识了吧,在64位模式下,CPU的寻址能力太弱了,绝大多数都只能寻址32位,根本就象是一个打了激素的32位CPU,或是一个被阉割了的64位CPU。怪不得Intel一直强调,真正的64位CPU是安腾架构的IA-64,我们目前的64位系统都是IA-32e架构下的64位子模式,Intel 都不承认它是真正的64位。

补充一点:

刚才我一直强调,64位系统寻址能力绝大多数情况下是32位,也就是说还有特例,比如:
mov eax,[0x56EF] 在64位系统中就是合法指令

000000013F291100 | A1 EF56000000000000      | mov eax,dword ptr ds:[56EF]             |

在64位汇编指令中,rax是个特殊寄存器,它的功能比其它64位寄存器都强大,在有些指令中寻址能力能达到64位。

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
seetimeuc + 1 + 1 感谢,又了解了一点
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yanweimu + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
yanweimu 发表于 2021-10-16 20:18
感谢分享
3#
奇数变偶不变 发表于 2021-10-16 20:39
4#
wycdd 发表于 2022-6-18 20:30
5#
urufu 发表于 2022-10-21 12:39
rax是个特殊寄存器?为何?
6#
lml0126 发表于 2022-11-1 14:15
有点高深,以后是不是32位的慢慢消失了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 16:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表