簡體   English   中英

將64位int作為輸出傳遞給32位嵌入式asm

[英]Pass 64-bit int as output to 32-bit inline asm

#include <stdarg.h>
#include <stdint.h>

uint64_t test_func(int n)
{
    return 9223372036854775805;
}


int main()
{
    uint64_t r = test_func(10);

    return 0;
}

轉換為:

test_func(int):
    push    ebp
    mov ebp, esp
    mov eax, -3
    mov edx, 2147483647
    pop ebp
    ret

main:
    push    ebp
    mov ebp, esp
    and esp, -8
    sub esp, 24
    mov DWORD PTR [esp], 10
    call    test_func(int)
    mov DWORD PTR [esp+16], eax
    mov DWORD PTR [esp+20], edx
    mov eax, 0
    leave
    ret

您可以看到它使用2個寄存器來存儲該64位整數。 但是,在C / C ++代碼中,它只是一個變量。

我試圖以內聯匯編的方式復制它,但我必須這樣做:

#include <stdarg.h>
#include <stdint.h>

int64_t test_func(int n)
{
    return 9223372036854775805;
}


int main()
{
    int32_t rlow = 0, rhigh = 0;

    asm(
        "push $10\n"
        "\tcall %P2"
        : "=a"(rlow), "=d"(rhigh)
    : "i"(&test_func) : "memory");

    return 0;
}

輸出為:

test_func(int):
    push    ebp
    mov ebp, esp
    mov eax, -3
    mov edx, 2147483647
    pop ebp
    ret
main:
    push    ebp
    mov ebp, esp
    sub esp, 16
    mov DWORD PTR [ebp-8], 0
    mov DWORD PTR [ebp-4], 0
    push $10
    call test_func(int)
    mov DWORD PTR [ebp-8], eax
    mov DWORD PTR [ebp-4], edx
    mov eax, 0
    leave
    ret

現在您可以看到我不得不手動將低位和高位放入兩個單獨的整數中。 然后,我執行移位以使其成為一個64位整數。

有沒有一種方法可以自動將其放入單個64位整數中,而無需我提供兩個32位整數然后移位這些位?

您需要"A"約束,該約束將64位值綁定到eax / edx寄存器對。 就像是:

uint64_t r;
asm("push $10\n"
    "\tcall %P1"
    : "=A"(r) : "i"(&test_func) : "memory");

應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM