【问题标题】:X86 32b assembly - using atollX86 32b 组件 - 使用环礁
【发布时间】:2023-03-03 23:20:01
【问题描述】:

在 Ubuntu 12.04 下,并使用可能与 C 库一起使用的 x86 32 位程序集,我需要使用一个数字 n,即

 2^31 - 1 < n <= 2^63 -1          

在我的系统上,C 整数是 32 位的;和 long longs 64 位。我知道在得到号码后如何继续,但我一直在准备号码。

我的计划方法如下:

 - store n as a string in the .data segment    

- use atoll (pushl $n_Str, call atoll)   

 - retrieve the converted value, and store it in two consecutive int-sized storage locations (taking note of likely little-endian storage)        

由于无法应用通常通过 %eax 的 32 位返回值约定(或仅可能通过指针,我已经检查过似乎不是这种情况(%eax 指向不可访问的内存之后)),我假设该值可能在 (%eax, %ebx) 中。假设是这种情况,我检查了所有高/低排列,但似乎并非如此(如果是这样,我搞砸了,请指出正确的方法)。环礁的手册(和手册 3)页面没有帮助。

如何检索转换后的整数?如果这种方法是不可能的(strtoll 也有同样的问题),有什么替代方法的建议吗?

【问题讨论】:

  • 我只需要 ll 作为股息;因此,如果我得到低和高双字,我很好。我需要的不仅仅是手动翻译,这对于一次运行来说很容易,因为我最终将 ll 作为命令行参数读入。
  • 查看调用atoll的C程序的汇编源码,你看到了什么样的处理?
  • @ssh:...好点:没有。我并没有想到要这样做。稍等,将制作测试C文件并检查gdb,这可能会解决这个问题。

标签: c assembly x86


【解决方案1】:

这似乎取决于调用约定和编译器。 __stdcall 函数在 EAX:EDX 寄存器中成对返回 64 位整数。 __cdecl 函数返回指向 GCC 上整数的堆栈指针。 __cdeclVisual C++ 上的函数在 EAX:EDX 中返回一对。

这里是来源:http://en.wikibooks.org/wiki/X86_Assembly/High-Level_Languages

【讨论】:

  • 非常有用,tyvm!我准备的测试文件的 Gdb(见上文)似乎证实了这一点。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多