亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1930 | 回復(fù): 5
打印 上一主題 下一主題

整合為一體 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-07-26 15:23 |只看該作者 |倒序?yàn)g覽
本帖最后由 landker 于 2013-07-26 15:26 編輯

在《現(xiàn)代編譯原理——C語(yǔ)言描述(虎書(shū))》中文版)中,對(duì)于第12章的內(nèi)容不太明白,想請(qǐng)教一下。里面第191頁(yè)中間處提到,如果要?jiǎng)?chuàng)建一個(gè)可運(yùn)行的編譯器,則需要使用到一個(gè)runtime.c的文件,實(shí)際上是一個(gè)對(duì)于操作系統(tǒng)的“系統(tǒng)調(diào)用”函數(shù)的使用。但這里就產(chǎn)生一個(gè)問(wèn)題,所有的函數(shù)在定義時(shí)都要入符號(hào)表,那這些“系統(tǒng)調(diào)用”都在哪里聲明了?例如:putchar函數(shù)(在runtime.c里的print函數(shù)里),它的聲明在哪里?此外,該如何編譯(即比如說(shuō),我要使用 printf,那我要鏈接哪些庫(kù)?)?

這里附上 runtime.c 的 source
  1. #undef __STDC__
  2. #include <stdio.h>


  3. int *initArray(int size, int init)
  4. {int i;
  5. int *a = (int *)malloc(size*sizeof(int));
  6. for(i=0;i<size;i++) a[i]=init;
  7. return a;
  8. }

  9. int *allocRecord(int size)
  10. {int i;
  11. int *p, *a;
  12. p = a = (int *)malloc(size);
  13. for(i=0;i<size;i+=sizeof(int)) *p++ = 0;
  14. return a;
  15. }

  16. struct string {int length; unsigned char chars[1];};

  17. int stringEqual(struct string *s, struct string *t)
  18. {int i;
  19. if (s==t) return 1;
  20. if (s->length!=t->length) return 0;
  21. for(i=0;i<s->length;i++) if (s->chars[i]!=t->chars[i]) return 0;
  22. return 1;
  23. }

  24. void print(struct string *s)
  25. {int i; unsigned char *p=s->chars;
  26. for(i=0;i<s->length;i++,p++) putchar(*p);
  27. }

  28. void flush()
  29. {
  30. fflush(stdout);
  31. }

  32. struct string consts[256];
  33. struct string empty={0,""};

  34. int main()
  35. {int i;
  36. for(i=0;i<256;i++)
  37.    {consts[i].length=1;
  38.     consts[i].chars[0]=i;
  39.    }
  40. return tigermain(0 /* static link */);
  41. }

  42. int ord(struct string *s)
  43. {
  44. if (s->length==0) return -1;
  45. else return s->chars[0];
  46. }

  47. struct string *chr(int i)
  48. {
  49. if (i<0 || i>=256)
  50.    {printf("chr(%d) out of range\n",i); exit(1);}
  51. return consts+i;
  52. }

  53. int size(struct string *s)
  54. {
  55. return s->length;
  56. }

  57. struct string *substring(struct string *s, int first, int n)
  58. {
  59. if (first<0 || first+n>s->length)
  60.    {printf("substring([%d],%d,%d) out of range\n",s->length,first,n);
  61.     exit(1);}
  62. if (n==1) return consts+s->chars[first];
  63. {struct string *t = (struct string *)malloc(sizeof(int)+n);
  64.   int i;
  65.   t->length=n;
  66.   for(i=0;i<n;i++) t->chars[i]=s->chars[first+i];
  67.   return t;
  68. }
  69. }

  70. struct string *concat(struct string *a, struct string *b)
  71. {
  72. if (a->length==0) return b;
  73. else if (b->length==0) return a;
  74. else {int i, n=a->length+b->length;
  75.        struct string *t = (struct string *)malloc(sizeof(int)+n);
  76.        t->length=n;
  77.        for (i=0;i<a->length;i++)
  78.          t->chars[i]=a->chars[i];
  79.        for(i=0;i<b->length;i++)
  80.          t->chars[i+a->length]=b->chars[i];
  81.        return t;
  82.      }
  83. }

  84. int not(int i)
  85. { return !i;
  86. }

  87. #undef getchar

  88. struct string *getchar()
  89. {int i=getc(stdin);
  90. if (i==EOF) return &empty;
  91. else return consts+i;
  92. }
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-07-26 15:26 |只看該作者
回復(fù) 1# landker


    ding

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:53:17
3 [報(bào)告]
發(fā)表于 2013-07-26 17:40 |只看該作者
在說(shuō)明 runtime.c 時(shí),其實(shí)是想說(shuō)明 libc 這樣的東西和編譯器是什么關(guān)系。
而舉的例子又不是實(shí)現(xiàn)一個(gè)真正的runtime(因?yàn)閷?shí)現(xiàn)一個(gè)真正的runtime內(nèi)容很多,就會(huì)跑題),而是給現(xiàn)有runtime套上一層,做了一個(gè)假的runtime,這樣就產(chǎn)生了誤解。

真正的runtime是緊緊地包在操作系統(tǒng)內(nèi)核上的。不會(huì)有putchar在哪? 這種問(wèn)題。
比如流式輸出 printf ,runtime除了維護(hù)流外,最終顯示到控制臺(tái)應(yīng)該是靠 write(stdout_fd, ...); 系統(tǒng)調(diào)用,而這個(gè)系統(tǒng)調(diào)用不再連接外部庫(kù),是一個(gè)匯編實(shí)現(xiàn),對(duì)于linux 是 80 號(hào)中斷。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2013-07-26 20:28 |只看該作者
本帖最后由 landker 于 2013-07-26 21:03 編輯
duanlin 發(fā)表于 2013-07-26 17:40
在說(shuō)明 runtime.c 時(shí),其實(shí)是想說(shuō)明 libc 這樣的東西和編譯器是什么關(guān)系。
而舉的例子又不是實(shí)現(xiàn)一個(gè)真正的 ...


樓上,

謝謝你的回復(fù)。我先試試。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-07-27 15:03 |只看該作者
本帖最后由 landker 于 2013-07-27 15:12 編輯
duanlin 發(fā)表于 2013-07-26 17:40
在說(shuō)明 runtime.c 時(shí),其實(shí)是想說(shuō)明 libc 這樣的東西和編譯器是什么關(guān)系。
而舉的例子又不是實(shí)現(xiàn)一個(gè)真正的 ...


樓上,

write.asm我已完成,并編譯鏈接等都通過(guò)了。但運(yùn)行的時(shí)候(假如編譯器的名字叫做 comp_cc,而被編譯的原文件叫做 abc.tig。那在執(zhí)行“comp_cc abc.tig”后,會(huì)生成 abc.asm這個(gè)匯編文件。在經(jīng)過(guò)nasm和ld這2步后,編譯鏈接成 abc 這個(gè)可執(zhí)行文件),即在執(zhí)行 abc(即 ./abc)時(shí), 報(bào)“段錯(cuò)誤 (核心已轉(zhuǎn)儲(chǔ))”這個(gè)錯(cuò)誤。

我想請(qǐng)教一下,在這種情況下,是否有“單步調(diào)試”的方法?如果有,那該如何調(diào)試?

此外,在生成abc這個(gè)可執(zhí)行文件時(shí),我是另外寫(xiě)了個(gè)簡(jiǎn)單的 start.asm,里面定義了 _start ,且規(guī)定了要跳轉(zhuǎn)至的函數(shù)。還有,在makefile的的設(shè)置里,我是將 -Ttext 設(shè)定為 0x8048000。這些設(shè)置有問(wèn)題嗎?

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:53:17
6 [報(bào)告]
發(fā)表于 2013-07-29 21:54 |只看該作者
調(diào)試是一個(gè)很大的話(huà)題,不論是pdb 還是dwarf,都有非常多的內(nèi)容。要是自制編譯器直接生成二進(jìn)制代碼,我想要讓這個(gè)程序停下來(lái)不是很容易。因?yàn)槟愠诵枰芍噶钚蛄型,還要生成調(diào)試信息的段。如果是編譯器生成某種其他匯編器的文本匯編程序,那就可以靠匯編器來(lái)生成調(diào)試信息。比如你可以用 nasm 生成帶有調(diào)試信息的elf,那樣就可以套gdb。

連接部分是自制的嗎?看看連接有問(wèn)題嗎,重定位地址填非法了沒(méi)?
另外如果程序里有訪問(wèn)外部共享庫(kù)的東西的話(huà),還要考慮你的程序加載器是否能和你的程序配合的正確。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP