2

我正在研究一个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 的内核中。

4

1 回答 1

1
%ifdef X32
  rdrand   rax              ;; generate a 64-bit random value
  mov      [buffer], rax    ;; save it to caller's buffer
  ...
%endif

这是我必须做的(搜索NASM的做事方式比手动发布要花更多时间):

            ;; X32 can use the full register, issue the REX prefix
%ifdef X32
    DB 48h
%endif
            ;; RDRAND is not available prior to Clang 3.2. Just emit
            ;;   the byte codes using DB. This is `rdrand eax`.
    DB 0Fh, 0C7h, 0F0h

然后从以下位置移动位rax

%ifdef X32
    mov        [buffer+4], eax    ;; We can only move 4 at a time
    DB         048h               ;; Combined, these result in 
    shr        eax, 32            ;;   `shr rax, 32`
%endif

    mov        [buffer], eax
    add        buffer, 8          ;; No need for Intel Core 2 slow word workarounds,
    sub        bsize, 8           ;;   like faster adds using `lea buffer,[buffer+8]`
于 2015-11-10T14:46:34.230 回答