2015-05-06 53 views
0

如何在x64程序集中的堆中分配內存。我想存儲sidt函數的值,但似乎無法找到如何實現的方法?分配內存(x64程序集)

我使用Visual Studio 2012

+1

'sidt'有一個很小的固定大小的結果,你甚至需要堆內存嗎?應該很容易放入靜態分配的數據存儲器 – harold

+0

即使我在數據部分中定義了一個tbyte指針,並且我使用了該指針,sidt將返回亂碼。 –

+1

在2015年編譯整個函數的任何原因?你可能會比大多數編譯器做得更差! –

回答

1

您將有兩個選擇(假設你在用戶空間上的操作系統上運行)。

  1. 使用任何操作系統提供映射你一些可寫內存(在UNIX brk/sbrk/mmap
  2. 調用C標準庫中的malloc庫函數(這將做到:(1)引擎蓋下爲你)

我會去2號,因爲它更簡單和便攜。

東西類似於以下應該做的伎倆:

movq $0x10, %rdi 
callq malloc 
; %rax will now contain the pointer to the memory 

假設ADM64(System V AMD64 ABI)調用約定,那會叫malloc(16)這應該返回一個指針,你到一個內存塊16個字節。呼叫返回後,地址應位於%rax寄存器中(如果內存不足,則地址應爲0)。

編輯:維基百科說,關於x86-64 calling conventions,微軟顯然使用不同的調用約定(首先註冊RCX而不是RDI)。所以你需要修改movl $0x10, %rdimovl $0x10, %rcx

+0

我的電腦有一個Intel處理器,我試着調用malloc,但是當我嘗試編譯它時,它說它是一個未知的符號 –

+1

@FredericaBernkastel你可以嘗試'callq _malloc'。取決於你的連接器你可能需要告訴它鏈接'libc',也許你只需要創建一個C程序,然後調用malloc,反彙編它,然後你會看到它是什麼需要 –

+1

也可能'。extern _malloc'或'.extern malloc'或任何您的彙編程序用於標記外部符號的內容。 –

0

根據你的環境來判斷,我猜你正在Windows中編寫彙編代碼。您需要使用Windows等效於系統調用sbrk。您可能會發現this MSDN reference有用!

0

編寫代碼在C中調用malloc,然後讓編譯器生成一個彙編列表,它將向您展示用於malloc的名稱(在Microsoft編譯器中可能是_malloc)以及如何調用它。

另一種選擇是從堆棧中分配空間,從esp中減去,等於將保存sidt信息的結構的大小。