【问题标题】:What is large dword?什么是大双字?
【发布时间】:2012-12-13 05:49:07
【问题描述】:

这个代码部分有什么shortlarge函数? large 和 long dword 一样吗?

mov eax, ebx
cmp [ebp+var_1], 0
jz  short loc_413123
call sub_40341C
pop large dword ptr fs:0
add esp, 0Ch

【问题讨论】:

  • 这听起来可能很奇怪,但是如果您发布与此反汇编相对应的机器代码的十六进制转储,我们会更容易回答这个问题。
  • 我没有十六进制转储
  • 如果不是从反汇编程序那里得到的?
  • 考虑到一个dword,只是一个dword,我怀疑它是一个更大的dword。
  • @Linuxios 我认为你说“qword”表示英特尔语法中的 64 位内存访问? (我更了解 GAS 语法)我打赌“短”和“大”与位移大小有关。我手头没有汇编程序可以无错误地接受 OP 的代码,这就是我要求十六进制转储的原因。

标签: assembly types x86 ida dword


【解决方案1】:

jz short loc_413123 仅表示此跳转的偏移量(即距离)非常小,以至于它适合单个字节,因此此跳转已编译为两个简单字节:

0x74 [1-byte-offset]

如果距离更大,编译器将不得不对跳转进行不同的编码,这会占用更多的内存:

0x0f 0x84 [4-byte-offset]

使用short,IDA Pro 只是告诉您此跳转使用的是哪种编码。

pop large dword ptr fs:0 是 IDA 提醒您注意 fs:0far pointer 的方式:常规偏移量 (0) 但带有段选择器 (fs)。 IE。 largedata (dword) 的宽度无关,而是 address (segment+offset)。但是,large 并没有真正添加任何新信息,该行仅表示pop dword ptr [fs],这可能是您从其他反汇编程序获得的反汇编。


在阅读反汇编代码时,您可以放心地忽略这两个关键字,而在编写您自己的汇编代码时,它们当然不是必需的。

【讨论】:

  • 所以IDA中的large只是意味着有一个段覆盖? x86 中的所有地址都使用段基址 (Write to address without segment register);没有覆盖它通常是 DS 或 SS 用于 base=E/RBP 或 E/RSP。 (在主流操作系统中,FS 或 GS​​ 以外的段的段基数为 0,而在 64 位模式下,硬件强制执行此操作,但逻辑上一切都是 seg:off)。
  • 从另一个反汇编程序中,您通常会得到类似pop dword ptr [fs:0] 的信息。即使偏移量为 0,您也永远不会得到没有偏移量的 fs
猜你喜欢
  • 2010-09-20
  • 2014-09-24
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多