我正在研究一个X32 目标文件,它使用 32 位整数、长整数和指针。我正在像这样构建目标文件:
nasm -f elfx32 rdrand.S -DX32 -o rdrand-x32.o
rdrand.S
是多平台(X86、X32 和 X64)。在 X86 块中,可以使用 64 位寄存器。所以我正在尝试(省略其他代码来演示核心问题):
%ifdef X32
%define buffer rdi ;; x32-abi (http://sites.google.com/site/x32abi/documents)
%define size rsi
rdrand rax ;; generate a 64-bit random value
mov [buffer], rax ;; save it to caller's buffer
%else
%define buffer ...
rdrand eax ;; generate a 32-bit random value
mov [buffer], eax ;; save it to caller's buffer
%endif
但是,似乎 NASM没有在指令上发出 REX 前缀,因此导致:
line 100: error: no instruction for this cpu level
line 101: error: no instruction for this cpu level
我知道 rdrand rax
会起作用,所以它的问题是让 NASM 发出 REX 前缀。(我不确定mov [buffer], rax
,但一旦我弄清楚 REX 问题,我就会解决这个问题)。
我如何告诉 NASM 发布广泛版本的指令?
我正在使用 Debian 的 NASM 版本:
$ nasm -v
NASM version 2.11.05 compiled on Sep 9 2014
但是,我目前不在启用 X32 的内核中。