【发布时间】: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,这可能会解决这个问题。