changeset 64:f431abfba3b2

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 03 Feb 2021 14:45:20 +0900
parents eaa7a127027b
children e88c0e26d331
files paper/chapter/02-cbc.tex paper/drawio/cbc_vs_c.drawio paper/drawio/cbc_vs_c.pdf paper/master_paper.pdf paper/src/cbc_example_test.c paper/src/cbc_example_test_void.s
diffstat 6 files changed, 90 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter/02-cbc.tex	Wed Feb 03 13:30:03 2021 +0900
+++ b/paper/chapter/02-cbc.tex	Wed Feb 03 14:45:20 2021 +0900
@@ -32,17 +32,30 @@
 逆に次の継続に渡すDataGearをOutputDataGearと呼ぶ。
 
 \section{CbCを使った例題}
-ソースコード\ref{src:cbcexample_test}にCbCを使った例題を示す。
+ソースコード\ref{src:cbcexample_test}にCbCを使った例題を、 ソースコード\ref{src:cbcexample_test_c}に通常のCで実装した例題を示す。
+この例では構造体\texttt{struct test}をcodegear1に渡し、その次にcodegear2に継続している。
+codegear2からはcodegear3にgotoし、 最後にexitする。
 \lstinputlisting[label=src:cbcexample_test, caption=CbCの例題]{src/cbc_example_test.cbc}
+\lstinputlisting[label=src:cbcexample_test_c, caption=ソースコード\ref{src:cbcexample_test}のCでの実装]{src/cbc_example_test.c}
+CbCの場合は継続で進んでいくが、 C言語での実装はvoid型の返り値を持つ関数呼び出しで表現される。
+\texttt{codegear3}に遷移したタイミングで、 CbCはmain関数のスタックしか持たないが、 C言語ではcodegear1、codegear2のスタックをそれぞれ持つ違いがある。(図\ref{fig:cbc_vs_c})
+
+\begin{figure}[tb]
+    \begin{center}
+        \includegraphics[width=150mm]{./drawio/cbc_vs_c.pdf}
+    \end{center}
+    \caption{CbCとCの処理の差}
+    \label{fig:cbc_vs_c}
+\end{figure}
 
 
-この例では構造体\texttt{struct Test}をcodegear1に渡し、その次にcodegear2に継続している。
-codegear2からはcodegear3にgotoし、 最後にexitする。
-この例題をアセンブラに変換した結果をソースコード\ref{src:cbcexample_test_asm}に示す。
+実際に軽量継続になっているかを、この例題をアセンブラに変換した結果を見比べて確認する。
 \lstinputlisting[label=src:cbcexample_test_asm, caption=ソースコード\ref{src:cbcexample_test}のアセンブラの一部]{src/cbc_example_test.s}
-初回のmainからcodeGear1への継続は、 CbCコンパイラの仕様上関数呼び出しが行われる。
-それ以外のcodegear2からcodegear3などのgotoは、jmp命令が実行される。
-jmp命令はプログラムカウンタを切り替えるのみの命令であるため、 callと違いスタックの操作をしていないことが分かる。
+\lstinputlisting[label=src:cbcexample_test_asm_void, caption=ソースコード\ref{src:cbcexample_test_c}のアセンブラの一部]{src/cbc_example_test_void.s}
+codegear1からcodegear2への移動の際に、CbCとCで発行されるアセンブラの命令を比較する。
+CbCの例題の場合のアセンブラのソースコード\ref{src:cbcexample_test_asm}はcodegear2へ25行目でjmp命令を使って遷移している。
+対してC言語での実装の場合(ソースコード\ref{src:cbcexample_test_asm_void})は21行目でcallqを使っている。
+jmp命令はプログラムカウンタを切り替えるのみの命令であり、 callは関数呼び出しの命令であるためにスタックの操作が行われる。
 
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/drawio/cbc_vs_c.drawio	Wed Feb 03 14:45:20 2021 +0900
@@ -0,0 +1,1 @@
+<mxfile host="Electron" modified="2021-02-03T05:38:08.997Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.1.8 Chrome/87.0.4280.88 Electron/11.1.1 Safari/537.36" etag="TdDdmdpX1gq3JtKqRWhF" version="14.1.8" type="device"><diagram id="UcpAmoSUQrcBs8Q8-mIn" name="ページ1">7VpLU9swEP41OdKJLct2jhAoHNqZztChj5uwhe2iWK4sk4Rf31Ukx8+Q0LxoygWkT9J6tZ92tdrJAI0ns2tBsvgzDykb2MNwNkCXA9seeR78VcBcA+7I0UAkklBDVgXcJs/UgEODFklI88ZEyTmTSdYEA56mNJANjAjBp81pD5w1v5qRiHaA24CwLvotCWWsUd/2KvyGJlFcftlyR3pkQsrJZid5TEI+rUHoaoDGgnOpW5PZmDJlu9Iuet3HFaNLxQRN5SYLHEvcFCT/enZlP+M4u/5JirszbHST83LDNIT9my4XMuYRTwm7qtALwYs0pErqEHrVnE+cZwBaAP6iUs4NmaSQHKBYTpgZpbNEfq+1fyhRH7DpXc6M5EVnbjq5FPxxSQECRGuu1F1pEAPlvBABfcEKtjlYRERUvjAPLWmD4075hEoxh3WCMiKTp6YexBy8aDmv4gYahp5XUGWUfCKsMF8a2C4DdS8eOGy4TqL7u+DlwFm+oOEcJlijbFYNQitS/wNwWeVolAirlAgKaqF6SveQMAYOqA7DNE4kvc3Iwr5TCAFNqlfR9kSFpLOXiesaulzgGpcyMcXGpj+tPNQq3S6ueac/3BM37rsble6xgRs5x3QjtH83sv8NN0LYeWNu5OyfG/RvcIOdtxbivO258fu4iTjEtQ05AXvKpvEJS6IU2gHYlQoAlNUTSN/OzcAkCUMdbiloQu4XolQkzHiSyoWR8MUAXypZEGG1tgvRO2DR9vFaFnEPifa+SPTfSXw1iY63PkwelMTR1iTC9ntIHN+PT5VDrxVN/S6F7iEptKwOh2N9R13DHaXcrGPyZrr46jtJ0WkyScvfURreuqMwxl3HsNyuWd29mXX1GynPSPr38a1JTj2/03JXuMnb58wZHZ2z1Qn5LjlDJ8QZOjpnfYn6Cw9gyu75tP72XQAwEHORPIPFCFNgGp6rip26RRjJ8yR4rbH/5kUMJIj5cpHq1FapbrVs0SvXDXb3bi5vg7UPZx3fugdlTSZSYhs/sM0XvqibuZYI+c1ziNrnS2/UrKpXIluCMGoJslqCtCE6guB0kHltmskcVirsWS3HcRsVUmhoiZUjLG26hW/grdOz/ngGuRQ72fwMNR9KuCfEOQdN0Nz3CLdphDtWPHKx2zw07TCyaTxqC3LwYeIRMuWB/cajfRVu/qd45HjHjkd9lZuWkfOYZKoZFILNLwQJHlUysS6FrfLdzSLQA0uyOzNbtW92aHWvZfWeW6Cv5mmVZbbdm337Wku/8+QS6DlV7/GHrcKA5X3oMnnQgkspePdFs5MlEW/AIdoNh9CtfgehL77qxyTo6g8=</diagram></mxfile>
\ No newline at end of file
Binary file paper/drawio/cbc_vs_c.pdf has changed
Binary file paper/master_paper.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/cbc_example_test.c	Wed Feb 03 14:45:20 2021 +0900
@@ -0,0 +1,35 @@
+extern int printf(const char*,...);
+
+typedef struct test {
+    int number;
+    char* string;
+} TEST;
+
+
+void codegear1(TEST);
+void codegear2(TEST);
+void codegear3(TEST);
+
+void codegear1(TEST testin){
+    TEST testout;
+    testout.number = testin.number + 1;
+    testout.string = testin.string;
+    codegear2(testout);
+}
+
+void codegear2(TEST testin){
+    TEST testout;
+    testout.number = testin.number;
+    testout.string = "Hello";
+    codegear3(testout);
+}
+
+void codegear3(TEST testin){
+    printf("number = %d\t string= %s\n",testin.number,testin.string);
+    exit(0);
+}
+
+int main(){
+    TEST test = {0,0};
+    codegear1(test);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/cbc_example_test_void.s	Wed Feb 03 14:45:20 2021 +0900
@@ -0,0 +1,34 @@
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6
+	subq	$32, %rsp
+	movl	%edi, %eax
+	movq	%rsi, %rcx
+	movq	%rcx, %rdx
+	movq	%rax, -32(%rbp)
+	movq	%rdx, -24(%rbp)
+	movl	-32(%rbp), %eax
+	addl	$1, %eax
+	movl	%eax, -16(%rbp)
+	movq	-24(%rbp), %rax
+	movq	%rax, -8(%rbp)
+	movl	-16(%rbp), %edx
+	movq	-8(%rbp), %rax
+	movl	%edx, %edi
+	movq	%rax, %rsi
+	call	codegear2
+	nop
+	leave
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	codegear1, .-codegear1
+	.section	.rodata
+.LC0:
+	.string	"Hello"
+	.text
+	.globl	codegear2
+	.type	codegear2, @function