回答
您將有兩個選擇(假設你在用戶空間上的操作系統上運行)。
- 使用任何操作系統提供映射你一些可寫內存(在UNIX
brk
/sbrk
/mmap
) - 調用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, %rdi
至movl $0x10, %rcx
。
我的電腦有一個Intel處理器,我試着調用malloc,但是當我嘗試編譯它時,它說它是一個未知的符號 –
@FredericaBernkastel你可以嘗試'callq _malloc'。取決於你的連接器你可能需要告訴它鏈接'libc',也許你只需要創建一個C程序,然後調用malloc,反彙編它,然後你會看到它是什麼需要 –
也可能'。extern _malloc'或'.extern malloc'或任何您的彙編程序用於標記外部符號的內容。 –
根據你的環境來判斷,我猜你正在Windows中編寫彙編代碼。您需要使用Windows等效於系統調用sbrk
。您可能會發現this MSDN reference有用!
編寫代碼在C中調用malloc,然後讓編譯器生成一個彙編列表,它將向您展示用於malloc的名稱(在Microsoft編譯器中可能是_malloc)以及如何調用它。
另一種選擇是從堆棧中分配空間,從esp中減去,等於將保存sidt信息的結構的大小。
- 1. 程序集內存分配
- 2. 程序內存分配
- 3. Linux x64程序集
- 4. 確定由特定的.NET程序集分配的內存量
- 5. 對於C程序的內存分配
- 6. MPI程序中的內存分配
- 7. 當爲程序分配內存時?
- 8. c#3d應用程序內存分配
- 9. 程序如何分配大量內存?
- 10. C程序中的內存分配
- 11. 查找程序中分配的內存?
- 12. 進程內存v.s. AppDomain內存分配
- 13. 內存分配過程
- 14. 內存分配與線程
- 15. 進程的內存分配
- 16. 程序在重新分配內存時導致內存損壞
- 17. x64 linux,C++線程內存分配:我必須使用互斥鎖嗎?
- 18. .NET中集合的內存分配
- 19. 在x64程序集中添加值
- 20. 在x86程序集中複製x64 MOVQ
- 21. X64 ASP.net未能找到程序集
- 22. 從哪裏學習x64程序集?
- 23. 加載x86或x64程序集
- 24. 將內嵌程序集轉換爲支持x64
- 25. x64程序偶爾會返回正確的SIDT值(x64程序集)
- 26. 內存分配
- 27. 內存分配
- 28. 內存分配
- 29. 內存分配
- 30. 內存分配
'sidt'有一個很小的固定大小的結果,你甚至需要堆內存嗎?應該很容易放入靜態分配的數據存儲器 – harold
即使我在數據部分中定義了一個tbyte指針,並且我使用了該指針,sidt將返回亂碼。 –
在2015年編譯整個函數的任何原因?你可能會比大多數編譯器做得更差! –