[英]c-program and segments
#include<stdio.h>
int main()
{
char *p="mystring";
return 0;
}
字符串文字“ mystring”,將存儲在哪里(在哪個段中)? 我假設“ mystring”的地址存儲在“ p”中,“ p”將存儲在數據段中,“ mystring”將存儲在代碼段中。 如果我的假設是寫,我可以說“ p”是一個遙遠的指針嗎? 如果我錯了,請糾正我。
C本身沒有段的概念(也沒有指針),這將是基礎實現或體系結構的一個功能(您尚未指定)。 分段體系結構和近/遠/小指針是8086年以來的古老事物-當今的大多數代碼(嵌入式東西可能除外)為您提供了一個扁平內存模型,您無需為此擔心。
所有標准狀態是字符串的實際字符將是您不允許修改的字符。
物有所值(不多)。 我的實現將字符串本身存儲在標記為只讀的內存中(這可以是也可以不是代碼段,您可以輕松地將其他段標記為只讀),並將p
(這些字符中第一個字符的地址)放在在運行時堆棧。
如果運行編譯器以生成匯編器輸出:
gcc -S qq.c
您會看到類似的內容(以我的qq.s
):
.file "qq.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "mystring\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
call ___main
movl $LC0, -4(%ebp)
movl $0, %eax
leave
ret
從中可以看到,它在其自己的rdata
部分(只讀數據)中,而不在text
部分中。
將其放入text
可能缺點是,像DEP(數據執行保護)之類的事情會更加困難。
您希望代碼和只讀數據都是只讀的,但是您也希望代碼是可執行的-通常,您不希望只讀數據是可執行的。
該字符串可能會存儲在文本段中,該段將是只讀的。
如果您願意,可以說“ p是一個遙遠的指針”,但是該術語不再具有實際意義。 在過去的日子里(當時強大的80286是CPU中的內置物),那么“遠指針”具有一定的意義-基本上是指不適合單個16位地址寄存器的指針。 您需要一個地址段寄存器以及一個地址寄存器來處理令人難以置信的1 MB可尋址空間。 如今,在大多數系統((某些)嵌入式系統除外)中,這已不再相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.