繁体   English   中英

如何计算段偏移量并在方括号中注册的结果

[英]How to calculate the result of segment offset and register in square brackets

我使用IDA Freeware拆开了一个crackme,其中包括:

mov     eax, ss:success_str[ebp]

我知道:

mov     eax, ss:success_str

基本上意味着eax = ss * 0x10 + success_str ,但是我不知道最后[ebp]部分的含义是什么。

我看了看指令的字节: 8B 85 94 30 40 00

该表指出操作码8Bmov r16/32 r/m16/32 所以基本上我猜 (如果我错了,请纠正我)上面的行等效于:

mov    eax, [00403094h] ; 0x403094 is actually the address of success_str

但是,即使我是对的,为什么还要花哨的语法以及如何阅读呢?

请参阅Intel x86内存操作数有效地址的计算。 “ ss”是逻辑地址的段部分,在这种情况下为段寄存器的名称。 仅在实模式下,它会像您假设的那样影响物理地址。 在大多数受保护的内存模式(所有现代OS都使用这种模式)下,情况并非如此。 相反, 段基值保存在内部段表中; 预先装有特殊说明。 但是,在应用程序模式上下文中(即,如果您不考虑将OS的功能用于物理地址隔离和填充),在许多情况下,您可以放心地忽略分段。

为什么花哨的语法以及如何阅读?

因为它是Intel IA-32和Intel 64架构,并且具有非常复杂的寻址模式(鉴于AVX-512 ISA扩展中如何对操作数进行寻址,您所遇到的示例甚至没有中等复杂性)。 您看到的符号称为“ Intel语法”。 也有所谓的“ AT&T语法”,它经常使用,并且有些人认为它甚至更不直观(我曾经使用过这两种变体,并且坦率地说并不在乎)。 若要了解如何阅读,请在此处下载“英特尔软件开发手册” 并阅读第2A卷的第一章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM