我目前正在創建一個操作系統,當我嘗試添加C支持時,遇到了一些問題......在彙編中,我的操作系統上的每個程序都以ORG 32768
(NASM編譯器預處理器指令,代碼的起源),但我似乎無法找到任何使用GCC編譯器的方式來做到這一點。所以,我的問題是,如何使用GCC在C中實現這一點(抵消代碼的起源)? (是的,我查詢之前詢問,甚至檢查GNU's official GCC's C preprocessor documentation)NASM ORG指令是否有GCC版本?
1
A
回答
4
ORG和.ORG回到你在程序集編寫程序,並不一定需要鏈接器的日子。
gnu工具不支持它AFAIK。
的start.s
.globl _start
_start:
mov $0xA000,%rsp
callq fun
jmp .
fun.c
unsigned int fun (void)
{
return(7);
}
fun.ld
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > ram
.rodata : { *(.rodata*) } > ram
.data : { *(.data*) } > ram
.bss : { *(.bss*) } > ram
}
構建命令
as start.s -o start.o
gcc -O2 -nostdlib -nostartfiles -ffreestanding -c fun.c -o fun.o
ld -T fun.ld start.o fun.o -o fun
它生產這個程序:
0000000000008000 <_start>:
8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp
8007: e8 04 00 00 00 callq 8010 <fun>
800c: eb fe jmp 800c <_start+0xc>
800e: 66 90 xchg %ax,%ax
0000000000008010 <fun>:
8010: b8 07 00 00 00 mov $0x7,%eax
8015: c3 retq
我使用了一個入口點0x8000(32768)。
如果通過gcc你意味着GNU工具,只想做彙編語言,那麼這使得它更簡單一些,你只需要binutils包而不是gcc。但是您仍然需要鏈接器,並在上面非常簡單的鏈接器腳本示例中使用ORIGIN,您可以使用.ORG內聯該組合件。
的start.s
.globl _start
_start:
mov $0xA000,%rsp
mov $0x7,%eax
add $0x1,%eax
jmp .
相同的鏈接腳本如上
as start.s -o start.o
ld -T fun.ld start.o -o fun
生產
0000000000008000 <_start>:
8000: 48 c7 c4 00 a0 00 00 mov $0xa000,%rsp
8007: b8 07 00 00 00 mov $0x7,%eax
800c: 83 c0 01 add $0x1,%eax
800f: eb fe jmp 800f <_start+0xf>
+0
謝謝!這非常有幫助:) –
相關問題
- 1. GCC/G ++的VC++ #import指令
- 2. 安裝多個版本的g ++(或gcc)
- 3. NASM指令序列
- 4. NASM x87 FILD指令
- 5. 什麼是版本指令?
- 6. gcc/g ++的CUDA SDK問題:舊版本的gcc無法找到舊版本的g ++?
- 7. 是否可以在較舊版本的gcc(g ++)上使用較新的標頭?
- 8. ARM GCC是否具有彙編'REV'指令的內置函數?
- 9. MongoDB是否需要gcc版本4.0.0或更高版本?
- 10. 是否有任何支持GCC插件的mingw-w64版本?
- 11. XC32 G ++版本
- 12. NASM/gcc的問題
- 13. gcc/g ++是否有x64微軟寄存器的調用約定?
- 14. 'gcc -g'和'gcc -g3'有什麼區別?
- 15. 什麼是g ++ - 3/gcc-3?
- 16. 在NASM中,MOV EBX,AX是一個有效的指令嗎?
- 17. MSYS2指定版本的mingw32或mingw64 gcc
- 18. GCC:指定最小共享庫版本
- 19. gcc/avr_gcc OFFSET指令
- 20. GCC非法指令
- 21. GCC:僞裝GCC版本
- 22. Ubuntu apt-get無法找到任何版本的gcc和g ++
- 23. 迄今爲止最穩定的gcc/g ++版本
- 24. 哪個gcc和g ++版本支持c和C++的標準?
- 25. 使用不同版本的gcc和g ++編譯問題
- 26. 如何強制Nsight Eclipse使用舊版本的gcc/g ++?
- 27. GNU gcc和g ++
- 28. gcc/g ++ vs icc
- 29. 是否有「連續」版本?
- 30. VimGolf是否有Emacs版本?
您可以設置其中的代碼將通過使用連接器腳本去,但我不不知道用C存檔的任何方法。 – MikeCAT
你不能從C做這個。如果你在NASM中使用二進制格式,將獲得相同的效果,您需要使用像MikeCAT所說的鏈接器腳本。您還需要編寫自己的C啓動代碼,然後如果要使用該代碼,則需要移植C庫。 –
@MikeCAT謝謝,我以前沒有親手編寫過我自己的鏈接器腳本(不需要,我在彙編中編寫了內核),但我確信我可以通過精彩的Google來弄清楚。 –